2005년 1월 17일 월요일

오라클 DBA를 위한 유용한 5가지 유닉스 명령어

좀 오래된 듯한 감이 있기는 한 글이지만...
Unix for Oracle DBAs Pocket Reference

오라클 DBA를 위한 유용한 5가지 유닉스 명령어
2001년 03월 21일

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 /<
set pages 9999;
set heading off;
select value from v"""$"parameter
where name='optimizer_mode';
exit
!"
done
done



이 스크립트를 사용할 때에는 유닉스 원격 쉘(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
", $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 / <
insert into mon_vmstats values (
sysdate,
$SAMPLE_TIME,
'$SERVER_NAME',
$RUNQUE,
$PAGE_IN,
$PAGE_OUT,
$USER_CPU,
$SYSTEM_CPU,
$IDLE_CPU,
$WAIT_CPU
);
EXIT
EOF
done
done

rm /tmp/msg$$


이 스크립트는 5분간의 경과 시간동안 vmstat 유틸리티를 작동시켜
mon_vmstat 테이블에 있는 정보를 저장한다. 테이블에 있는 정보에서 서버 수
행 통계를 뽑아 내어, 훌륭한 서버 수행 그래프를 만들 수 있다. 예를 들어 마
이크로소프트 엑셀에 데이터를 복사해서 붙이기를 하면 다음에 있는 페이지 활
성화 그래프를 만들 수 있는 것이다. 이 그래프를 보면 몇 달에 걸쳐 세 번의
다른 시간대 간격의 페이지 활성화 그래프를 알 수 있다.

위의 스크립트는 내가 쓴 Unix for Oracle DBAs Pocket Reference에서 시간을
절약해 주는 몇 가지만을 나열한 것이다. 유닉스의 위력은 실로 대단하며, 이
유닉스의 위력으로 자신의 일을 더 쉽게 만들 수 있다.

댓글 없음: