list_oracle_homes.sh. 데이터베이스의 ORACLE_HOME 경로를 확인하고자 하는 경우에는 여러 가지 방법이 활용 가능합니다. 데이터베이스 사용자로 로그인하여 echo 명령으로 $ORACLE_HOME 변수를 출력하는 것이 그 한 예입니다. 또는 /etc/oratab 파일의 내용을 검색하여 주어진 인스턴스와 연관된 이름을 가져올 수도 있습니다. 이 파일의 데이터베이스 엔트리는 아래와 같은 형식을 갖습니다.
$ORACLE_SID:$ORACLE_HOME:<N|Y>:
TESTDB를 ORACLE_SID로 갖는 ORACLE_HOME 엔트리 중 하나를 출력하기 위한 명령이 아래와 같습니다:
cat /etc/oratab | awk -F: '{if ($1=="TESTDB") print $2 }'
그렇다면 /etc/orainst 파일에 존재하는 모든 ORACLE_HOME 엔트리에 대해서 동일한 작업을 반복해 주어야 하는 경우에는 어떻게 해야 할까요? 아래 코드를 이용하면 리스트를 대상으로 한 반복 작업이 가능합니다.
dblist='cat /etc/oratab | grep -v "#" | awk -F: '{print $2 }''
for ohome in $dblist ; do
echo $ohome
done
dblist 변수는 어레이로 사용되고 있으며, 모든 ORACLE_HOME 경로가 이 변수에 저장됩니다. 코드의 반복 처리를 위해서 for 루프가 정의되었고, 각각의 엔트리는ohome 변수에 저장된 후 표준 출력으로 echo 처리됩니다.
search_log.sh. 오라클 소프트웨어에서 관리되는 여러 가지 로그 파일을 모니터하기를 원하는 경우를 생각해 봅시다. 데이터베이스 경고 로그(database alert log)에는 데이터베이스 운영 과정에서 매우 중요한 메시지가 기록됩니다. 또 제품이 설치/삭제되거나 패치가 적용되는 경우에도 별도의 로그 파일이 생성됩니다. 아래 스크립트는 매개변수로 전달된 파일에 대해 검색 작업을 수행하고, “ORA-“라는 문자열이 포함된 모든 라인을 지정된 수신자에게 이메일로 전달합니다.
cat $1 | grep ORA- > alert.err
if [ 'cat alert.err|wc -l' -gt 0 ]
then
mail -s "$0 $1 Errors" administrator@yourcompany.com < alert.err
fi
위 코드는 alert.err 파일에 존재하는 단어의 수를 계산하고 있습니다. 단어 수(wc)가 0보다 큰(-gt) 경우, if 블록의 컨텐트가 실행되고 mail (또는 send mail도 사용 가능합니다) 명령을 이용하여 메시지가 전달됩니다. 메시지의 제목에는 실행되는 스크립트($0), 검색되는 로그의 이름($1), 메시지 본분에서 검색 조건(ORA-)과 일치하는 라인의 수 등이 포함됩니다.
ORACLE_HOME, ORACLE_BASE, ORACLE_SID 등의 환경변수를 이용하면 Linux 환경에 저장된 오라클 리소스의 위치를 쉽게 확인할 수 있습니다. Oracle E-Business Suite 11i 애플리케이션 인스턴스를 관리하는 경우라면, APPL_TOP, TWO_TASK, CONTEXT_NAME, CONTEXT_FILE 등의 환경변수를 추가로 활용할 수 있습니다. 주어진 환경에서 사용 가능한 환경변수의 전체 목록을 확인하려면, 아래 명령을 실행하여 결과로 저장된 파일(myenv.txt)을 확인합니다:
env > myenv.txt
환경 변수를 여러 가지 방법으로 조합하면, 검색하고자 하는 파일의 위치를 쉽게 확인할 수 있습니다. 예를 들어 경고 로그(alert log)의 위치는 아래와 같이 정의됩니다.
$ORACLE_BASE/admin/$ORACLE_SID/bdump/alert_$ORACLE_SID.log
본 문서에서 소개된 기본적인 방법을 잘 활용하여, 경고 로그(또는 다른 파일)를 주기적으로 검색하고, 새로 발견된 에러를 이메일로 전송하는 스크립트를 작성하고 스케줄링할 수 있습니다. 그런 다음 로그 컨텐트를 다른 파일에 저장하여, 가장 최근에 발생한 에러 메시지만을 이메일을 통해 전송할 수 있습니다.
Oracle Recovery Manager Scripts. Oracle Recovery Manager(RMAN)는 데이터베이스 백업 및 복구 관리를 위한 유틸리티입니다. RMAN을 이용하여 작성한 백업 스크립트는 플랫폼과 무관하게 동작하기 때문에, 이기종 플랫폼 환경의 관리 업무를 극적으로 단순화할 수 있습니다. RMAN은 하부 운영체제에 의해 호출된 후 스크립트를 전달하는 방식으로 동작합니다. 예를 들어 콜드 백업을 위한 스크립트(cold.sh)는 다음과 같은 내용으로 작성됩니다:
#!/bin/bash
rman target / <<EOF
shutdown immediate;
startup mount;
backup spfile;
backup database;
alter database open;
delete noprompt obsolete;
quit;
EOF
첫 번째 라인은 스크립트가 bash 쉘을 사용함을 정의하고 있습니다. 두 번째 라인은 Oracle Recovery Manager를 호출하고 ($ORACLE_SID 환경변수에 정의된) 타겟 데이터베이스에 OS 사용자 계정으로 로그인함을 의미합니다. 두 번째 라인 마지막의 “<<EOF”는 이후 실행되는 커맨드가 RMAN에 의해 처리됨을 의미합니다. 그리고 마지막 라인의 EOF는 RMAN에 전달되는 커맨드의 마지막 부분임을 정의하고 있습니다. 마지막 라인이 처리된 후 RMAN은 데이터베이스를 셧다운하고 다시 시작하여 데이터베이스를 마운트한 후, 서버 매개변수 파일과 데이터베이스 컨텐트의 백업 작업을 수행합니다.
백업이 완료되면 데이터베이스가 오픈됩니다. 미리 정의된 보존정책의 기준보다 오래된 백업 파일은 자동 삭제됩니다. 백업 스크립트 작성에 관련한 자세한 정보는 RMAN 제품문서를 참고하시기 바랍니다.
야간 백업은 스케줄 기반으로 자동 실행되도록 설정하는 것이 일반적입니다. 위의 스크립트를 호출한 후 표준 출력을 지정된 이메일 주소로 전달하는 방법이 아래와 같습니다:
sh cold.sh | mail -s"Backup `date`" administrator@yourcompany.com
쉘 스크립트를 통해 다른 오라클 유틸리티를 실행하는 것도 물론 가능합니다. tnsping는 오라클 연결 식별자(Oracle connection identifier)가 리스너(listener)에 연결할 수 있는지 확인하는 유틸리티입니다. 데이터베이스 연결 문제를 점검하기 위해 이 유틸리티를 실행하는 예가 아래와 같습니다:
tnsping ptch04 |grep TNS-
데이터베이스 export/import (또는 data pump) 유틸리티 또한 스크립트에서 자주 활용되곤 합니다.
Database Installation. 데이터베이스 셋업 과정에서 수반되는 작업의 대부분을 자동화하는 것도 가능합니다. Linux 운영체제에 Oracle 10g를 설치하기 전에, 여러 가지 테스트를 실행하여 패키지의 최소요구버전과 커널 매개변수 설정을 검증하는 작업이 필요합니다. 패키지의 버전은 rpm 커맨드와 –q 옵션을 사용하여 확인할 수 있습니다.
rpm -q compat-libstdc++
(“virtual” 또는 “pseudo” 파일시스템으로 구분되는) /proc 파일시스템을 이용하면 시스템의 다양한 설정을 확인할 수 있습니다. /proc 파일시스템에서는 실제 파일이 저장되지 않으며, 그 대신 런타임 시스템 정보가 파일의 형태로 조회될 수 있습니다. 예를 들어 /proc/meminfo는 시스템의 메모리 정보를 포함하고 있으며, “grep MemTotal /proc/meminfo” 명령을 통해 시스템의 전체 메모리 크기를 조회하는 것이 가능합니다. 여기에 앞에서 설명한 awk를 적용하면, 킬로바이트
단위로 표시된 메모리 크기 정보를 추출해 낼 수 있습니다:
grep MemTotal /proc/meminfo | awk '{print $2}'
위와 같은 커맨드는 조회 결과에 따라 (시스템 업데이트 등의) 다른 작업이 요구되는 스크립트에서 유용하게 활용됩니다. 샘플 스크립트 중 10gchecks_kernel.sh와 10gchecks.sh는 현재 버전 및 설정과 오라클의 권장 버전/설정을 비교하고 있습니다.
데이터베이스 모니터링. ps 커맨드를 이용하면 현재 프로세스 상태를 조회하고, 데이터베이스, 리스너, 스크립트 등의 프로세스가 실행 중인지 확인할 수 있습니다. 현재 서버에서 실행 중인 모든 데이터베이스의 목록을 확인하기 위한 스크립트가 아래와 같습니다:
echo "'ps -ef | grep smon|grep -v grep|awk '{print $8}'| awk -F \"_\"
'{print$3}'`"
위 스크립트는 한 눈에 이해하기에는 다소 복잡한 감이 있습니다. 첫 번째로 사용된 명령인 ps는, 현재 서버에서 실행 중인 모든 프로세스의 목록을 출력합니다 (-ef 옵션은 모든 프로세스의 완전한 목록을 출력하도록 지정하고 있습니다). 다음으로 grep은 SMON(Oracle System Monitor 백그라운드 프로세스)의 목록만을 추출하기 위해 사용됩니다. 또 스크립트에서 실행한 grep 커맨드에 연관된 프로세스도 목록에서 제외시킬 필요가 있습니다. 다음으로 awk를 사용하여 리스트의 (시스템 프로세스 네임 정보- ora_smon_<oracle_sid>-에 해당하는) 8번째 컬럼을 추출해 냅니다. awk의 마지막 인스턴스는 “_” 기호를 검색 대상 구분문자로 사용하여,SMON 프로세스를 소유한 데이터베이스 네임을 출력합니다. 이때 “_” 기호를 큰 따옴표 안에 묶고 백슬래시(\) 기호를 앞에 붙여 주어야만 문자를 그대로 처리할 수 있습니다.
exec_sql.sh. 앞에서 설명한 것처럼, 사용자가 sqlplus에 접근할 수 있는 경우라면 쉘 스크립트에서 데이터베이스를 조회하는 것도 가능합니다. 아래 예제는 현재 데이터베이스와 세션 연결을 맺고 있는 머신의 리스트를 반환하고 있습니다:
#!/bin/bash
output='sqlplus -s "/ as sysdba" <<EOF
set heading off feedback off verify off
select distinct machine from v\\$session;
exit
EOF
'
echo $output
이 스크립트는 다른 프로그램으로 커맨드를 입력한다는 점에서 앞의 RMAN 스크립트와 유사합니다. 로컬 운영체제 레벨에서 인증된 연결은 sysdba 계정으로 데이터베이스에 접속합니다. 메시지 출력을 단순화하기 위해, 이 스크립트에서는 SQL*Plus의 heading, feedback, verify 옵션을 비활성화하고 있습니다. 그리고 마지막으로 쿼리의 실행이 완료되면 SQL*Plus의 실행을 종료합니다.
뷰 네임의 “$” 기호 앞에 붙은 더블 백슬래시(\\)는 문자열 처리를 위한 에스케이프 구문(escape sequence)입니다. 첫 번째 백슬래시는 두 번째 슬래시를 에스케이프 처리하고, 두 번째 백슬래시는 “$” 기호를 에스케이프 처리하고 있습니다. (깔끔하지는 못하지만 기능적으로는 완벽한 방법입니다.).
앞에서 설명한 것처럼 데이터베이스에 빈번한 액세스를 요구하는 코드가 필요하다면, 쉘 스크립팅은 결코 최선의 대안이 될 수 없습니다. 이러한 경우라면 스크립트를 PL/SQL, (쉘 스크립팅과 매우 유사한 문법을 사용하는) Perl, Python, Java 또는 그 밖의 언어로 작성하는 방법을 먼저 고려해 보시기 바랍니다.
결론
쉘 스크립팅은 반복적이고 오류의 가능성이 높은 관리 업무를 자동화하기 위한 매우 효과적인 도구로 활용됩니다. 본 문서에서 제공된 예제들은 매우 다양한 형태로 활용 가능하지만, 실제 환경에서 바로 활용하기에는 설명이 부족한 감이 있습니다. 시스템마다 고려해야 할 사항이 다르고 특이한 구성이 존재하기 마련입니다. 관리자는 각 시스템 환경의 요구사항을 만족하는 독자적인 솔루션을 개발할 수 있어야 합니다.
'IT > 인프라' 카테고리의 다른 글
DBA를 위한 Linux 쉘 스크립팅 입문(3) (0) | 2017.03.23 |
---|---|
DBA를 위한 Linux 쉘 스크립팅 입문(2) (0) | 2017.03.23 |
DBA를 위한 Linux 쉘 스크립팅 입문(1) (0) | 2017.03.23 |
시스코 데이터 센터 비젼과 전략 (0) | 2017.03.20 |
컴퓨팅 아키텍쳐의 동향과 시스코의 전략 (0) | 2017.03.20 |