Oracle 資料庫重啟屬於高風險變更,**必須遵循標準化流程、驗證備份、通知業務、預留回滾方案**。本文提供生產級標準重啟 SOP:應用層停止、監聽器控制、控制檔備份、Redo 切換、強制斷開會話、IMMEDIATE 關閉、啟動驗證、應用恢復,並說明各步驟原理與常見異常處理。
SELECT * FROM V$INSTANCE; SELECT STATUS FROM V$INSTANCE;SELECT COUNT(*) FROM V$SESSION WHERE USERNAME IS NOT NULL AND STATUS='ACTIVE'; 應趨近 0$ lsnrctl stop
# 或指定監聽器
$ lsnrctl stop LISTENER_ORCL
驗證:lsnrctl status 顯示 "The listener supports no services"
SQL> CONN / AS SYSDBA
-- 3.1 備份控制檔至追蹤檔 (人工可讀,便於災難重建)
SQL> ALTER DATABASE BACKUP CONTROLFILE TO TRACE;
-- 生成檔案位於 USER_DUMP_DEST (10g+) 或 BACKGROUND_DUMP_DEST
-- 3.2 手動切換 Redo Log (確保脏块刷盤、減少啟動恢復時間)
SQL> ALTER SYSTEM SWITCH LOGFILE;
-- 執行 2-3 次,或直到 CURRENT 群組變更
-- 3.3 生成 Kill Session 腳本 (避免 SHUTDOWN IMMEDIATE 等待過久)
SQL> SET HEAD OFF FEED OFF PAGES 0
SQL> SPOOL /tmp/kill_sessions.sql
SQL> SELECT 'ALTER SYSTEM KILL SESSION ''' || sid || ',' || serial# || ''' IMMEDIATE;'
FROM v$session WHERE username IS NOT NULL;
SQL> SPOOL OFF
-- 3.4 執行強制斷開 (可選,視業務容忍度)
SQL> @/tmp/kill_sessions.sql
-- 若報 ORA-00030/ORA-00031 為正常 (會話已斷)
SQL> SHUTDOWN IMMEDIATE;
-- 等待輸出 "Database closed. Database dismounted. ORACLE instance shut down."
-- 若超時 (大交易回滾中),可考慮 SHUTDOWN ABORT 但需接受較長啟動恢復時間
關閉模式對比:
| 模式 | 行為 | 適用場景 |
|---|---|---|
| NORMAL | 等待所有用戶主動斷開 | 計劃維護窗口充裕 |
| IMMEDIATE | 回滾未提交交易、斷開會話、不等待 | **標準生產重啟首選** |
| TRANSACTIONAL | 等待當前交易提交/回滾再斷開 | 極敏感業務、需最小化回滾 |
| ABORT | 立即終止進程、不回滾、啟動需實例恢復 | 緊急故障、掛死無響應 |
# 5.1 啟動監聽器
$ lsnrctl start
# 5.2 啟動資料庫實例
$ sqlplus /nolog
SQL> CONN / AS SYSDBA
SQL> STARTUP;
-- 依序輸出:
-- ORACLE instance started.
-- Database mounted.
-- Database opened.
# 5.3 驗證狀態
SQL> SELECT INSTANCE_NAME, STATUS, OPEN_MODE FROM V$INSTANCE;
-- 應為 OPEN / READ WRITE
tail -f $ORACLE_BASE/diag/rdbms/*/*/trace/alert_*.log# 節點 1
$ srvctl stop instance -d ORCL -i ORCL1 -o IMMEDIATE
$ srvctl start instance -d ORCL -i ORCL1
# 驗證服務正常後,依序滾動其餘節點
| 現象 | 原因 | 應對 |
|---|---|---|
| SHUTDOWN IMMEDIATE 卡住 > 30 分鐘 | 大交易回滾 / 會話持有鎖不放 | 另開 SYSDBA 執行 KILL SESSION 腳本;仍卡則 SHUTDOWN ABORT |
| STARTUP 掛在 "Database mounted" | 控制檔不一致 / 數據檔缺失 / Redo 損壞 | 檢查 ALERT LOG,按錯誤碼處理 (恢復控制檔/數據檔/RESETLOGS) |
| ORA-01122: database file failed verification | 數據檔 SCN 不一致 | RECOVER DATABASE UNTIL CANCEL / 從備份恢復 |
| 監聽器啟動失敗 TNS-01106 | listener.ora 格式錯 / PORT 衝突 | netca 重建 / lsnrctl status 診斷 |
#!/bin/bash
# oracle_restart.sh - 需以 oracle 用戶執行
ORACLE_SID=ORCL
export ORACLE_SID
log() { echo "[$(date '+%F %T')] $*"; }
log "停止監聽器"
lsnrctl stop
log "關閉資料庫 IMMEDIATE"
sqlplus -s / as sysdba <
嚴格執行此 SOP,配合變更管理流程,可將 Oracle 重啟風險降至最低,確保核心業務連續性。