首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Linux 設定 Oracle 開機自動啟動與關機關閉

     編輯:Oracle 資料庫基礎

前言

Linux 環境下 Oracle 資料庫需隨作業系統開機自動啟動、關機正常關閉,避免非預期重啟導致資料庫損壞。本文提供兩種主流方法:傳統 dbstart/dbshut + /etc/init.d 腳本 (適用 9i~19c),以及 Oracle 10g+ 推薦的 rsh 方式,並說明常見問題修正。

方法一:標準 dbstart/dbshut + init.d 腳本 (最通用)

1. 編輯 /etc/oratab 設定自動啟動旗標

# 格式: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 關閉。

2. 建立 /etc/init.d/dbora 啟動腳本

#!/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

3. 設定權限與啟動等級

chmod 750 /etc/init.d/dbora
chkconfig --add dbora
chkconfig --level 345 dbora on

4. 驗證

service dbora start
service dbora stop
# 或重開機測試
reboot

方法二:Oracle 10g 推薦 rsh 方式 (適用 10g/11g 非 RAC/ASM)

Oracle 10g 文件建議使用 rsh 而非 su,避免環境變數傳遞問題。

1. 安裝並啟用 rsh 服務

# RHEL/CentOS
yum install -y rsh-server rsh
chkconfig rsh on
chkconfig rlogin on
service xinetd restart

2. 配置 .rhosts 信任

# 在 oracle 用戶家目錄建立 .rhosts
echo "localhost oracle" > /home/oracle/.rhosts
chmod 600 /home/oracle/.rhosts

3. 修改 /etc/init.d/dbora 使用 rsh

#!/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 Listenerdbstart 內部硬編碼舊路徑 /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 會自動管理

Windows 平台對應設定

  1. 服務設為「自動」:OracleServiceORCL, OracleOraDb11g_home1TNSListener。
  2. 登錄檔:HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\HOME0\ORA_ORCL_AUTOSTART = true。
  3. 命令列:oradim -EDIT -SID ORCL -STARTMODE auto -PFILE ...。

systemd 時代 (RHEL 7+/CentOS 7+/Oracle Linux 7+)

建議改用 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) 實現更完善的資源管理與故障轉移。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved