網路上流傳的配置教程多為抄襲,導致「開機啟動正常,關機不關閉資料庫」的普遍現象。根因在於忽略 Linux 服務管理機制:/var/lock/subsys/ 下的鎖檔案決定服務是否被視為「運行中」,關機腳本僅停止有鎖檔的服務。
# vi /etc/oratab
# 修改實例行尾部 N -> Y
orcl=/u01/app/oracle/product/11.2.0/dbhome_1:Y
# su - oracle
$ cd $ORACLE_HOME/bin
$ cp dbstart dbstart.bak && cp dbshut dbshut.bak
# 修改 dbstart:找到 ORACLE_HOME_LISTNER=$1 改為
ORACLE_HOME_LISTNER=$ORACLE_HOME
# 修改 dbshut:同理修改
ORACLE_HOME_LISTNER=$ORACLE_HOME
原因:安裝時腳本不知道具體 ORACLE_HOME,執行時會報「未指定」錯誤。10g+ 已整合監聽器啟停,無需單獨配置。
# vi /etc/init.d/oracle11
#!/bin/bash
# chkconfig: 2345 99 10
# description: Oracle 11g Auto Start/Stop Service
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/11.2.0/dbhome_1
export ORACLE_SID=orcl
export PATH=$PATH:$ORACLE_HOME/bin
case "$1" in
start)
echo "`date` -----startup oracle-----" >> /var/log/oracle11.log
su oracle -c "$ORACLE_HOME/bin/dbstart"
touch /var/lock/subsys/oracle11 # 【核心】建立鎖檔,標記服務已啟動
echo "`date` -----startup successful-----" >> /var/log/oracle11.log
;;
stop)
echo "`date` -----shutdown oracle-----" >> /var/log/oracle11.log
su oracle -c "$ORACLE_HOME/bin/dbshut"
rm -f /var/lock/subsys/oracle11 # 【核心】移除鎖檔,標記服務已停止
echo "`date` -----shutdown successful-----" >> /var/log/oracle11.log
;;
*)
echo "Usage: $0 {start|stop}"
exit 1
;;
esac
exit 0
chown oracle:oinstall /etc/init.d/oracle11
chmod 755 /etc/init.d/oracle11
chkconfig --add oracle11
chkconfig oracle11 on
# 驗證
chkconfig --list oracle11
# 輸出應包含 2:on 3:on 4:on 5:on
/etc/rc.d/rc0.d/K*)遍歷 /var/lock/subsys/,僅對存在鎖檔的服務發送 stop 參數。SIGKILL 強制終止 → 可能導致實例恢復時間延長甚至數據不一致。touch/rm -f /var/lock/subsys/oracle11 是連接 Oracle 生命週期與 Linux 服務管理的橋樑。ln -s /etc/init.d/oracle11 /etc/rc.d/rc2.d/S99oracle11
ln -s /etc/init.d/oracle11 /etc/rc.d/rc3.d/S99oracle11
ln -s /etc/init.d/oracle11 /etc/rc.d/rc4.d/S99oracle11
ln -s /etc/init.d/oracle11 /etc/rc.d/rc5.d/S99oracle11
ln -s /etc/init.d/oracle11 /etc/rc.d/rc0.d/K10oracle11
ln -s /etc/init.d/oracle11 /etc/rc.d/rc1.d/K10oracle11
ln -s /etc/init.d/oracle11 /etc/rc.d/rc6.d/K10oracle11
S99 = 啟動優先級 99(晚啟動,依賴網路/存儲);K10 = 關閉優先級 10(早關閉,釋放資源)。
# 手動測試啟動
/etc/init.d/oracle11 start
tail -f /var/log/oracle11.log
# 手動測試關閉
/etc/init.d/oracle11 stop
tail -f /var/log/oracle11.log
# 檢查鎖檔
ls -l /var/lock/subsys/oracle11
#!/bin/bash,且 # chkconfig: 註解不可省略。su oracle -c "command" 雙引號不可少,否則變數不展開。.service Unit 檔案,本文方案適用 RHEL 5/6 SysVinit。