dboraスクリプトでOracleの自動起動停止

Oracleって、そういえばHAクラスタRACやらクラスタウェアの制御下でしかサービス起動停止の制御したことなかったなぁ・・・というわけでいまさらな感も多々ありつつdboraスクリプト自動起動停止するやり方を試したときのことを書いてみる。

通常、クラスタ構成ではクラスタウェア経由で起動停止を制御するため、Oracle Databaseの自動起動停止は考慮不要。シングル構成のインスタンスをOSのサービスとして自動起動停止したい場合には、Oracle付属の $ORACLE_HOME/bin/dbstart、dbshutを使用する。が、これをサービスとして実行したい場合には、dbstartとdbshutをOSサービスに登録するためのラップスクリプトが必要になる。サービス用のこのスクリプトは、Miracle Linuxには標準で付属するが私がよく使うRHELの場合には自作が必要。

・・・ということで以下の内容で自作。

dboraスクリプト


#!/bin/bash
#
# chkconfig: - 99 10
# description: Oracle Database Server
# processname: ora_

SUBSYS=/var/lock/subsys/dbora
ORACLE_HOME=/opt/oracle/product/10.2.0/db_1
ORACLE_OWNER=oracle

if [ "`id -un`" != "root" ]; then
MSG="ERROR Executing user isn't super-user."
echo "[ORA-CONTROL] $MSG"
logger -p user.warn -t "[ORA-CONTROL]" "$MSG"
exit 1
fi

case "$1" in
start)
if [ -f "$SUBSYS" ]; then
echo $0 already started.
exit 1
fi
echo -n $"Starting Oracle database: "
su - $ORACLE_OWNER -c "$ORACLE_HOME/bin/lsnrctl start"
su - $ORACLE_OWNER -c "$ORACLE_HOME/bin/dbstart"
touch $SUBSYS
;;
stop)
if [ ! -f "$SUBSYS" ]; then
echo $0 already stopped.
exit 1
fi
echo -n $"Stopping Oracle database: "
su - $ORACLE_OWNER -c "$ORACLE_HOME/bin/lsnrctl stop"
su - $ORACLE_OWNER -c "$ORACLE_HOME/bin/dbshut"
rm -f $SUBSYS
;;
restart)
$0 stop
$0 start
;;
status)
if [ -f "$SUBSYS" ]; then
echo $0 started.
else
echo $0 stopped.
fi
;;
*)
echo "Usage: $0 {start|stop|status|restart}"
exit 1
esac

exit 0

とりあえず凝ったことはせず、シンプルに作成(MIRACLEのスクリプトからそれほど派手な改良はなし)。

$SUBSYSのロックファイル有無のみでインスタンスの生死確認をしているのが諸刃の剣といった感じ。運用的にきっちり固まっているのであれば使用可能かしら。下記スクリプトで実行ユーザのチェックを追加しているのは、一般ユーザでは/var/lock/subsys/配下へのファイル作成ができないため。root以外で実行すると対話でoracleユーザのパスワードを求められ、入力すればインスタンスとリスナー自体は起動するが、その後のロックファイル作成ができないため以降dboraで制御から外れてしまうことへの対処。ただ、サーバ起動までに時間が長くなるので注意。なお、自動起動処理に対象はインスタンスとリスナーの2つ(デフォルトのまま)。OEMを使用する場合には別途dbconsoleの起動を手動で行うか、下記スクリプトに埋め込む。

なお、Oracleインスタンス自体のstart/stop処理の具体的な処理内容は上記dboraスクリプトではなく、この中でコールしている$ORACLE_HOME/bin/dbstartとdbshutスクリプトを見てください。なんてことはなく、中ではsysユーザがsqlplusでOracleに接続してstartup/shutdownコマンドを実行している。

設定ファイル

  • /etc/oratab

dboraスクリプトで管理下におきたい対象インスタンスのエントリを、NからYに変更する


SHIBA10G:/opt/oracle/product/10.2.0/db_1:Y

OSサービスへの登録

  • Linuxへのサービス登録は以下の通り。


# cp -p dbora /etc/init.d
# chmod u+x /etc/init.d/dbora
# chkconfig --add dbora
# chkconfig --level 2345 dbora on

実行方法

いまさら説明は不要ですが、まぁ備忘録なので念のため。起動、停止方法は以下の通り。


# /etc/init.d/dbora start
# /etc/init.d/dbora stop

ログ出力


$ cd $ORACLE_HOME
$ ls -l ./*.log
-rw-r--r-- 1 oracle oinstall 1168 11月 6 16:35 ./shutdown.log
-rw-r--r-- 1 oracle oinstall 1868 11月 6 16:33 ./startup.log
ログの内容は、dboraの中でコールされるdbstart/dbshutがsqlplusでOrcaleに接続した際の標準出力(+おそらく標準エラー出力)となる。