Linux 環境下 Oracle 資料庫需隨作業系統開機自動啟動、關機正常關閉,避免非預期重啟導致資料庫損壞。本文提供兩種主流方法:傳統 dbstart/dbshut + /etc/init.d 腳本 (適用 9i~19c),以及 Oracle 10g+ 推薦的 rsh 方式,並說明常見問題修正。
# 格式:SID:ORACLE_HOME:Y|N
# 將預設 N 改為 Y
orcl:/u01/app/oracle/product/11.2.0/dbhome_1:Y
+ASM:/u01/app/oracle/product/11.2.0/grid:Y # 若有 ASM
關鍵: 只有標記 Y 的執行個體會被 dbstart 啟動、dbshut 關閉。
#!/bin/sh
# chkconfig: 345 99 10
# description: Oracle auto start-stop script
ORA_HOME=/u01/app/oracle/product/11.2.0/dbhome_1
ORA_OWNER=oracle
if [ ! -f $ORA_HOME/bin/dbstart ]; then
echo "Oracle startup: cannot find dbstart"
exit
fi
case "$1" in
'start')
# 啟動 Listener (10gR2 起 dbstart 內建啟動 listener,可省略)
su - $ORA_OWNER -c "$ORA_HOME/bin/lsnrctl start"
# 啟動資料庫
su - $ORA_OWNER -c "$ORA_HOME/bin/dbstart $ORA_HOME"
;;
'stop')
# 關閉資料庫
su - $ORA_OWNER -c "$ORA_HOME/bin/dbshut $ORA_HOME"
# 停止 Listener
su - $ORA_OWNER -c "$ORA_HOME/bin/lsnrctl stop"
;;
*)
echo "Usage: $0 {start|stop}"
exit 1
;;
esac
chmod 750 /etc/init.d/dbora
chkconfig --add dbora
chkconfig --level 345 dbora on
service dbora start
service dbora stop
# 或重開機測試
reboot
Oracle 10g 文件建議使用 rsh 而非 su,避免環境變數傳遞問題。
# RHEL/CentOS
yum install -y rsh-server rsh
chkconfig rsh on
chkconfig rlogin on
service xinetd restart
# 在 oracle 用戶家目錄建立 .rhosts
echo "localhost oracle" > /home/oracle/.rhosts
chmod 600 /home/oracle/.rhosts
#!/bin/sh
# chkconfig: 345 99 10
ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome_1
ORACLE=oracle
if [ ! "$2" = "ORA_DB" ]; then
if [ "`uname`" = "HP-UX" ]; then
remsh $HOST -l $ORACLE -n "$0 $1 ORA_DB"
else
rsh $HOST -l $ORACLE $0 $1 ORA_DB
fi
exit
fi
case $1 in
'start') $ORACLE_HOME/bin/dbstart $ORACLE_HOME ;;
'stop') $ORACLE_HOME/bin/dbshut $ORACLE_HOME ;;
*) echo "usage: $0 {start|stop}"; exit ;;
esac
| 問題 | 原因 | 解決 |
|---|---|---|
dbstart: Failed to auto-start Oracle Net Listener | dbstart 內部硬編碼舊路徑 /ade/vikrkuma_new/oracle/bin/tnslsnr | 編輯 $ORACLE_HOME/bin/dbstart,約第 78 行,將 ORACLE_HOME_LISTNER=... 改為 ORACLE_HOME_LISTNER=$ORACLE_HOME |
| 開機啟動失敗,無錯誤日誌 | 環境變數未正確載入 (ORACLE_HOME, ORACLE_SID, PATH) | 在腳本開頭顯式 export:export ORACLE_HOME=... ORACLE_SID=... PATH=$ORACLE_HOME/bin:$PATH |
| 關機時資料庫未正常關閉 | 關機腳本執行順序過早,網路/儲存已卸載 | 調整 chkconfig 順序號 (99 為最後啟動、最先關閉),確保 S99dbora / K01dbora |
| RAC/ASM 環境 | Oracle Clusterware (CRS) 管理資源,不需此腳本 | 停用 dbora:chkconfig dbora off,CRS 會自動管理 |
OracleServiceORCL, OracleOraDb11g_home1TNSListener。HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\HOME0\ORA_ORCL_AUTOSTART = true。oradim -EDIT -SID ORCL -STARTMODE auto -PFILE ...。建議改用 systemd service unit,取代 init.d:
# /etc/systemd/system/oracle-db.service
[Unit]
Description=Oracle Database
After=network.target
[Service]
Type=forking
User=oracle
Group=oinstall
Environment=ORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1
Environment=ORACLE_SID=orcl
ExecStart=$ORACLE_HOME/bin/dbstart $ORACLE_HOME
ExecStop=$ORACLE_HOME/bin/dbshut $ORACLE_HOME
TimeoutSec=300
[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl enable oracle-db
systemctl start oracle-db
建議:生產環境採用 systemd 管理,並配合 Oracle Restart (單機高可用) 或 Oracle Clusterware (RAC) 實現更完善的資源管理與故障轉移。