Oracle 啟動過程分為 **NOMOUNT → MOUNT → OPEN** 三個階段,每階段完成特定的元數據讀取、記憶體結構建立、檔案一致性檢查。理解各階段內部機制、關鍵檔案依賴、常見失敗點與恢復對策,是 DBA 排查啟動故障、執行災難恢復的核心能力。本文系統拆解三階段流程、關鍵視圖、典型錯誤碼與處理邏輯。
階段總覽
| 階段 | 命令 | 核心動作 | 關鍵檔案 | 主要風險點 |
| NOMOUNT | STARTUP NOMOUNT | 讀取參數檔 → 配置 SGA → 啟動背景進程 (PMON/SMON/DBWn/LGWR/CKPT/ARCn...) → 開啟 ALERT LOG → 動態註冊到監聽器 | SPFILE/PFILE | 參數檔缺失/損壞、記憶體不足、端口衝突 |
| MOUNT | ALTER DATABASE MOUNT | 讀取控制檔 (control_files 參數) → 驗證控制檔一致性 → 讀取數據檔/Redo 路徑、資料庫名、SCN、歸檔模式、字元集 | 控制檔 (.ctl) | 控制檔缺失/不一致/權限、路徑錯誤 |
| OPEN | ALTER DATABASE OPEN | 線上開啟所有數據檔/Redo → 檢查 SCN 一致性 → 執行實例恢復 (如需) → 開啟臨時檔 → 允許用戶連線 | 數據檔 (.dbf)、Redo (.log)、臨時檔 | 數據檔缺失/離線/SCN 不一致/介質故障 |
階段一:NOMOUNT 詳解
參數檔尋找順序
1. $ORACLE_HOME/dbs/spfileSID.ora
2. $ORACLE_HOME/dbs/spfile.ora
3. $ORACLE_HOME/dbs/initSID.ora
4. $ORACLE_HOME/dbs/init.ora
可用 STARTUP PFILE=/custom/path/init.ora 指定。
關鍵背景進程啟動順序
- PMON (Process Monitor) — 最先啟動,負責清理失敗進程
- SMON (System Monitor) — 實例恢復、臨時段清理
- DBWn (Database Writer) — 髒塊寫入數據檔
- LGWR (Log Writer) — Redo 寫入線上日誌
- CKPT (Checkpoint) — 觸發檢查點
- ARCn (Archiver) — 若歸檔模式
- MMAN/MMNL/MMON — 記憶體管理、AWR 收集
常見失敗與處理
| 錯誤 | 原因 | 處理 |
| ORA-01078: failure in processing system parameters | 參數檔語法錯/參數值非法 | 檢查 ALERT LOG 具體參數,建立 PFILE 修正後 STARTUP PFILE=... |
| ORA-00845: MEMORY_TARGET not supported | /dev/shm 太小 | mount -o remount,size=4G /dev/shm 或降低 MEMORY_TARGET |
| ORA-27123: unable to attach to shared memory | 共享記憶體段衝突/不足 | ipcs -m 清理舊段、檢查 /etc/sysctl.conf shmmax/shmall |
| LRM-00109: could not open parameter file | 找不到參數檔 | 確認 ORACLE_SID、檔案存在、權限 |
階段二:MOUNT 詳解
控制檔讀取與驗證
- 讀取
control_files 參數指定的所有控制檔 (多路鏡像)
- **任一控制檔讀取失敗 → MOUNT 失敗**
- 驗證多路控制檔內容一致 (檢查點 SCN、資料庫 ID、檔案清單)
常見失敗與處理
| 錯誤 | 原因 | 處理 |
| ORA-00205: error in identifying control file | 控制檔路徑錯/檔案不存在/權限 | 檢查 control_files 參數、OS 層面確認檔案、從備份恢復控制檔 |
| ORA-00202: control file: '...' not found | 多路鏡像缺失 | 複製現有控制檔補齊、或修改參數移除缺失路徑 |
| ORA-01122: database file 1 failed verification | 控制檔記錄的數據檔與實際不符 | 檢查數據檔是否被移動/刪除,必要時 RENAME FILE 或恢復 |
控制檔恢復標準流程
-- 1. NOMOUNT 階段
STARTUP NOMOUNT;
-- 2. 從備份恢復控制檔 (RMAN)
RMAN> RESTORE CONTROLFILE FROM '/backup/controlfile.bkp';
-- 或 SQL*Plus (有備份控制檔複製)
SQL> ALTER DATABASE MOUNT; -- 若有一個可用控制檔
-- 3. 開啟資料庫 (可能需 RESETLOGS)
SQL> ALTER DATABASE OPEN RESETLOGS; -- 若控制檔為備份版本
階段三:OPEN 詳解
檔案一致性檢查與實例恢復
- 讀取控制檔中記錄的所有數據檔/Redo 路徑
- 檢查每個檔案 Header 中的 **檢查點 SCN** 與控制檔記錄是否一致
- **一致** → 標記 ONLINE,正常開啟
- **不一致** (SCN 落後) → 需要**實例恢復**:
- SMON 讀取線上 Redo,從檢查點 SCN 向前應用
- 前滾: 重做已提交/未提交交易
- 回滾: 撤銷未提交交易 (利用 Undo)
- 開啟臨時表空間檔案
- 標記資料庫 OPEN,允許用戶連線
常見失敗與處理
| 錯誤 | 原因 | 處理 |
| ORA-01157: cannot identify/lock data file | 數據檔缺失/離線/權限 | 檢查 OS 檔案、ALTER DATABASE DATAFILE ... ONLINE、從備份恢復 |
| ORA-01110: data file 1: '...' | 配合上述錯誤顯示具體檔案 | 同上 |
| ORA-01122: database file 1 failed verification | 檔案 Header SCN 不匹配 (可能恢復不完整) | RECOVER DATABASE / RECOVER DATAFILE ... / RECOVER TABLESPACE ... |
| ORA-00313: open failed for members of log group | Redo 日誌組成員缺失/損壞 | ALTER DATABASE CLEAR LOGFILE GROUP n / 恢復 Redo |
| ORA-01589: must use RESETLOGS or NORESETLOGS | 非正常關閉/介質恢復後需指定 | ALTER DATABASE OPEN RESETLOGS (會重置 Redo 序列、需完整備份後) |
故障診斷黃金法則
- 先看 ALERT LOG:
tail -f $ORACLE_BASE/diag/rdbms/*/*/trace/alert_*.log — 完整錯誤堆疊、時間序列
- 確認當前階段:
SELECT STATUS FROM V$INSTANCE; (STARTED/MOUNTED/OPEN)
- 按階段依賴檔案排查:NOMOUNT→參數檔,MOUNT→控制檔,OPEN→數據檔/Redo
- 最小化損失原則:優先嘗試 RECOVER、CLEAR LOGFILE、ONLINE DATAFILE,最後才 RESETLOGS
- 備份優先:任何 RESETLOGS/恢復操作前,確保有可用備份 (RMAN/OS 複製)
進階:啟動觸發器自動化檢查
CREATE OR REPLACE TRIGGER sys.startup_check
AFTER STARTUP ON DATABASE
DECLARE
v_cnt NUMBER;
BEGIN
-- 檢查無效物件
SELECT COUNT(*) INTO v_cnt FROM dba_objects WHERE status = 'INVALID';
IF v_cnt > 0 THEN
DBMS_OUTPUT.PUT_LINE('WARNING: ' || v_cnt || ' invalid objects after startup');
-- 可發送郵件告警
END IF;
-- 檢查表空間使用率
FOR t IN (SELECT tablespace_name, round(used_pct) pct FROM dba_tablespace_usage_metrics WHERE used_pct > 85) LOOP
DBMS_OUTPUT.PUT_LINE('ALERT: Tablespace ' || t.tablespace_name || ' ' || t.pct || '% used');
END LOOP;
END;
/
-- 啟用: ALTER TRIGGER sys.startup_check ENABLE;
精通三階段內部機制,配合 ALERT LOG、V$ 視圖、RMAN 恢復流程,即可在啟動故障、介質災難、遷移升級等關鍵場景中冷靜決策、精準恢復,守住資料庫核心可用性。