同一台伺服器運行多個 Oracle 實例(SID 不同),需分別管理。本文以 orcl1、orcl2 為例,示範在 Oracle 用戶環境下的啟動/關閉標準流程。
$ORACLE_HOME、$ORACLE_BASE、參數檔(spfile/pfile)、密碼檔。/etc/oratab 已註冊實例(可選,供 dbstart/dbshut 使用)。listener.ora 已配置所有實例的 SID_LIST。# 1. 切換至 oracle 用戶
su - oracle
# 2. 啟動監聽器(一次即可,服務所有實例)
lsnrctl start
# 3. 設定當前環境的 ORACLE_SID
export ORACLE_SID=orcl1
# 4. 以 SYSDBA 身分連線並啟動資料庫
sqlplus / as sysdba <<'EOF'
startup;
exit;
EOF
# 5. 驗證實例狀態
sqlplus / as sysdba <<'EOF'
select instance_name, status from v$instance;
exit;
EOF
export ORACLE_SID=orcl2
sqlplus / as sysdba <<'EOF'
startup;
exit;
EOF
export ORACLE_SID=orcl1
sqlplus / as sysdba <<'EOF'
shutdown immediate;
exit;
EOF
關閉模式對比:
| 模式 | 行為 | 適用場景 |
|---|---|---|
shutdown normal | 等待所有用戶斷線、不允許新連線 | 計畫維護窗口 |
shutdown immediate | 回滾未提交交易、斷開所有連線、不執行檢查點 | 最常用、最快正常關閉 |
shutdown transactional | 等待當前交易完成、不允許新交易 | 需保證交易完整性 |
shutdown abort | 直接終止進程、不回滾、下次啟動需實例恢復 | 緊急故障、其他模式失效時 |
#!/bin/bash
# start_all_oracle.sh
# 依賴 /etc/oratab 格式:SID:ORACLE_HOME:Y|N
ORATAB=/etc/oratab
if [ ! -f "$ORATAB" ]; then
echo "找不到 $ORATAB"
exit 1
fi
# 啟動監聽器
su - oracle -c "lsnrctl start"
# 遍歷 oratab 中標記為 Y 的實例
grep -E '^[^#]*:.*:Y$' "$ORATAB" | while IFS=: read -r SID OHOME AUTO; do
echo "啟動實例: $SID (ORACLE_HOME=$OHOME)"
su - oracle -c "
export ORACLE_SID=$SID
export ORACLE_HOME=$OHOME
export PATH=\$ORACLE_HOME/bin:\$PATH
sqlplus / as sysdba <<'EOFSQL'
startup;
EOFSQL
"
done
echo "所有實例啟動完成"
dba 群組(id oracle)。listener.ora 的 SID_LIST、執行 lsnrctl reload。spfile 損壞或路徑錯誤,嘗試用 pfile 啟動:startup pfile=/path/to/init.ora。/dev/shm 大小、kernel.shmmax/shmall 參數。多實例管理的核心在於環境變數隔離(ORACLE_SID、ORACLE_HOME)與監聽器統一服務。建立標準化的啟動/關閉腳本、納入 /etc/oratab、配合 systemd 服務單元,即可實現生產級的自動化與高可用管理。