Oracle DBAs Pocket Reference는 데이터베이스 관리자(DBA)가 알아야 할 모든 유닉스 명령어를 20년 이상 공부하고 하나로 모아 놓은 결과물이다. 컨설턴트이기 때문에 유닉스 다이어렉트에 대한 데이터베이스 조절 방법을 강구하고 모든 명령어를 암기해야 했는데, 정말이지 힘든 과정이었다. 여기에 Oracle DBAs Pocket Reference에 수록되어 있는 스크립트 중에서 내가 좋아하는 5개를 뽑아 보았다.
유닉스용 "Change All" 명령어
이 스크립트는 디렉토리에 있는 모든 파일에서 한 문자열과 다른 문자열을 바꿔서 검색과 교환을 실행시킨다. 유닉스 디렉토리에 수 백 개의 파일이 들어 있고 각 파일에서 ORACLE_SID를 바꾸고 싶을 때, 이 스크립트를 이용하면 몇 초안에 모든 것을 해결할 수 있다. 게다가 변환된 파일의 원 파일에 대한 백업 디렉토리도 만들어 준다. 나는 이 스크립트를 이용해 수 백 시간에 걸쳐 똑같이 수정해야 하는 작업을 하지 않을 수 있었다.
#!/bin/ksh
tmpdir=tmp.$$
mkdir $tmpdir.new
for f in $*
do
sed -e "s/oldstring/newstring/g"\
< $f > $tmpdir.new/$f
done
# Make a backup first!
mkdir $tmpdir.old
mv $* $tmpdir.old/
cd $tmpdir.new
mv $* ../
cd ..
rmdir $tmpdir.new
|
위에 있는 for 루프로 인해 sed 명령어가 현재 디렉토리 내 모든 파일에서 실행된다. sed 명령어는 작업을 실제 검색, 교환하며 동시에 임시 디렉토리에 관계 파일의 새로운 버전을 생성한다.
이 스크립트를 사용하려면 여기에 나타난 코드의 파일 이름을 chg_all.sh 로 바꿔야 한다. 전체를 바꾸고자 한다면, 스크립트 파일에서 이전 문자열과 새로운 문자열을 수정하는 것부터 해야 한다. 그러면 스크립트를 실행할 때, 파일 마스크에서는 인자로서 지나쳐도 된다. 예를 들어 SQL 파일을 바꿀 때는 다음과 같은 명령을 실행하기만 하면 되는 것이다.
root> chg_all.sh *.sql
스크립트가 완성되면, 원하던 문자열이 대체되어 있을 것이고, tmp.old 라는 디렉토리 이름이 붙은 파일이 남게 될 것이다. 이 파일은 수정된 파일의 원 버전이다.
수백 개의 데이터베이스에서 오라클 값을 검사하는 스크립트
모든 데이터베이스에서, 심지어는 서버가 다른 데이터베이스에서 바로 SQL*Plus 명령어를 실행할 수 있는 방법이 유닉스에 꼭 필요하다고 생각해 왔다. 내가 아는 한 매니저는 가게에 있는 모든 데이터베이스에 대한 디폴트 최적화 모드를 알고 싶어했다. 그 가게에는 30개의 데이터베이스 서버에 150개의 데이터베이스가 있었다. 그는 이틀 안에 이 일을 끝내라고 했는데, 내가 10분 안에 정확한 답을 말하자 크게 놀랐다. 그때 이용한 것이 바로 이 스크립트이다.
# Loop through each host name . . .
for host in `cat ~oracle/.rhosts|\
cut -d"." -f1|awk "{print $1}"|sort -u`
do
echo " "
echo "************************"
echo "$host"
echo "************************"
# loop from database to database
for db in `cat /etc/oratab|egrep ":N|:Y"|\
grep -v \*|grep ${db}|cut -f1 -d":""`
do
home=`rsh $host "cat /etc/oratab|egrep ":N|:Y"|\
grep -v \*|grep ${db}|cut -f2 -d":""`
echo "************************"
echo "database is $db"
echo "************************"
rsh $host "
ORACLE_SID=${db}; export ORACLE_SID;
ORACLE_HOME=${home}; export ORACLE_HOME;
${home}/bin/sqlplus -s /< |
이 스크립트를 사용할 때에는 유닉스 원격 쉘(rsh)이 필요하다. 이 유닉스 rsh 를 이용하면 서버들 사이에서 빨리 옮겨 다닐 수 있다. 자신의 .rhosts 파일에 엔트리를 만들기만 하면 되는 것이다. 스크립트가 시스템에서 .rhosts 파일에 정의된 서버 이름을 통해서 반복되고, 각 서버의 /etc/oratab 파일에 리스트된 데이터베이스를 통해서도 반복될 것이다.
데이터베이스 값을 확인할 때, 그리고 SQL*Plus 스크립트를 운영할 때 이 스크립트를 이용하면 된다. 자신의 엔터프라이즈에 있는 모든 데이터베이스에 대한 사용자 리포트, 수행 통계, 정보량 등을 빨리 받아 볼 수 있다. 이 스크립트를 변형시키면 오라클 디렉토리에서 쓸모 없는 파일을 지울 수도 있고, 재실행 로그 파일시스템 아카이브의 빈 공간을 확인할 수도 있다. 이 스크립트를 이용해서 여러 데이터베이스에 같은 명령을 실행해서 반복적인 일을 수행하는데 드는 시간을 많이 줄일 수 있었다.
오라클 환경을 변화시키는 빠른 방법
큰 가게에서 일할 때 발생할 수 있는 곤란한 문제 한가지는 오라클 환경을 빨리 변환시켜야 할 때이다. 모든 사람이 각자의 방식으로 이 문제를 해결하고, 서버들 간에 어떤 차이가 있는지 기억하기도 힘들어 보인다. 서버가 다른 오라클 버전을 운영하고 있다면 문제는 더욱 해결하기 힘들어 진다.
이럴 때 나는 모든 서버에 표준 .profile 스크립트를 설치한다. 내가 서버에 신호를 보내면 .profile이 실행하고 모든 데이터베이스에 대한 얼라이어스를 자동으로 만들어 낸다. 이 데이터베이스는 Oracle SID의 이름과 같다. 유닉스 프롬프트에서 Oracle SID를 입력하면, 전체 유닉스 환경이 새로운 데이터베이스용으로 바뀐다. 다음에 나오는 코드는 내 .profile 파일에 만들어 놓은 것이다.
for DB in `cat /etc/oratab|grep -v \#|grep -v \*|cut -d":" -f1`
do
alias $DB="export ORAENV_ASK=NO; \
export ORACLE_SID="$DB";\
. $TEMPHOME/bin/oraenv; \
export ORACLE_HOME;\
export ORACLE_BASE=\
`echo $ORACLE_HOME | sed -e "s:/product/.*::g"`;\
export DBA=$ORACLE_BASE/admin;\
export SCRIPT_HOME=$DBA/scripts;\
export PATH=$PATH:$SCRIPT_HOME;\
export LIB_PATH=$ORACLE_HOME/lib64:$ORACLE_HOME/lib "
done
|
이제부터는 PROD 데이터베이스로 환경을 바꾸고 싶을 때, 단지 유닉스 명령 프롬프트에서 PROD라는 명령만 입력하면 된다.
솔라리스에선 /etc에서 /var/opt/oracle까지 oratab 디렉토리 이름을 변환시켜 주어야 한다.
유용한 유닉스 얼라이어스 패키지
새벽 3시에 제품에 이상이 있다는 호출을 받는다면, 모든 오라클 경고 로그 파일과 쓸모 없는 파일 디렉토리가 어디에 있는지 기억할 수 없을 것이다. 이럴 때 일을 단순하고 일괄적으로 처리하기 위해서 나는 항상 내 유닉스 .profile 파일에 표준 얼라이어스 목록을 만들어 놓는다. 예를 들면:
# Aliases
#
alias alert="tail -100\
$DBA/$ORACLE_SID/bdump/alert_$ORACLE_SID.log|more"
alias arch="cd $DBA/$ORACLE_SID/arch"
alias bdump="cd $DBA/$ORACLE_SID/bdump"
alias cdump="cd $DBA/$ORACLE_SID/cdump"
alias pfile="cd $DBA/$ORACLE_SID/pfile"
alias rm="rm -i"
alias sid="env|grep ORACLE_SID"
alias admin="cd $DBA/admin"
|
이 얼라이어스를 이용하면 긴 명령어를 쉽게 기억할 수 있다. 일례로 경고 얼라이어스는 다음에 나오는 긴 명령을 의미한다.
tail -100 $DBA/$ORACLE_SID/bdump/alert_$ORACLE_SID.log|more
이 얼라이어스를 이용해서 유닉스 프롬프트에서 경고를 입력하기만 하면 오라클 경고 로그에 있는 가장 최근 엔트리를 볼 수 있다. 그리고 아카이브를 입력하면 오라클 아카이브 재실행 로그 디렉토리의 위치로 갈 수 있다.
서버 통계를 오라클 테이블에 저장할 때 사용하는 스크립트
오라클 데이터베이스를 튜닝할 때 수행 문제가 발생하면 데이터베이스 서버에서 어떤 일이 일어나는가를 알아야 한다. 수행 문제가 발생하면 유닉스 vmstat 명령으로부터 출력 데이터를 알아내어 mon_vmstats라는 오라클 테이블에 서버 메트릭스를 저장하는 스크립트를 만든다. 바로 이것이다:
#!/bin/ksh
# First, we must set the environment . . . .
ORACLE_SID=BURLESON
export ORACLE_SID
ORACLE_HOME=`cat /etc/oratab|\
grep \^$ORACLE_SID:|cut -f2 -d":"`
export ORACLE_HOME
PATH=$ORACLE_HOME/bin:$PATH
export PATH
MON=`echo ~oracle/mon`
export MON
SERVER_NAME=`uname -a|awk "{print $2}"`
typeset -u SERVER_NAME
export SERVER_NAME
# sample every five minutes (300 seconds) . . . .
SAMPLE_TIME=300
while true
do
vmstat ${SAMPLE_TIME} 2 > /tmp/msg$$
# This script is intended to run starting at
# 7:00 AM EST Until midnight EST
cat /tmp/msg$$|sed 1,4d | awk "{ \
printf("%s %s %s %s %s %s %s\n", $1, $6, $7,\
$14, $15, $16, $17) }" | while read RUNQUE\
PAGE_IN PAGE_OUT USER_CPU SYSTEM_CPU\
IDLE_CPU WAIT_CPU
do
$ORACLE_HOME/bin/sqlplus -s / < |
이 스크립트는 5분간의 경과 시간동안 vmstat 유틸리티를 작동시켜 mon_vmstat 테이블에 있는 정보를 저장한다. 테이블에 있는 정보에서 서버 수행 통계를 뽑아 내어, 훌륭한 서버 수행 그래프를 만들 수 있다. 예를 들어 마이크로소프트 엑셀에 데이터를 복사해서 붙이기를 하면 다음에 있는 페이지 활성화 그래프를 만들 수 있는 것이다. 이 그래프를 보면 몇 달에 걸쳐 세 번의 다른 시간대 간격의 페이지 활성화 그래프를 알 수 있다.
위의 스크립트는 내가 쓴
Unix for Oracle DBAs Pocket Reference에서 시간을 절약해 주는 몇 가지만을 나열한 것이다. 유닉스의 위력은 실로 대단하며, 이 유닉스의 위력으로 자신의 일을 더 쉽게 만들 수 있다.