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에서 시간을 절약해 주는 몇 가지만을 나열한 것이다. 유닉스의 위력은 실로 대단하며, 이 유닉스의 위력으로 자신의 일을 더 쉽게 만들 수 있다. |
DB/__Oracle