System Change Number (SCN) 是 Oracle 內部時鐘,決定資料一致性、恢復邊界、備份有效性。本文系統定義四大 SCN(系統/資料檔/啟動/終止)、闡述正常/異常關機、舊資料檔、備份控制檔、重建控制檔五大場景的 SCN 比較邏輯,並給出 RESETLOGS vs NORESETLOGS 決策依據。
一、四大核心 SCN 定義與查詢
| SCN 類型 | 定義 | 儲存位置 | 查詢視圖 |
| 系統檢查點 SCN | 最近一次完成檢查點的 SCN | 控制檔 | V$DATABASE.CHECKPOINT_CHANGE# |
| 資料檔檢查點 SCN | 各資料檔最近檢查點 SCN | 控制檔 | V$DATAFILE.CHECKPOINT_CHANGE# |
| 啟動 SCN | 資料檔頭記錄的檢查點 SCN,用於啟動時判斷是否需恢復 | 資料檔頭 | V$DATAFILE_HEADER.CHECKPOINT_CHANGE# |
| 終止 SCN | 資料檔最後一次正常關閉時的 SCN;NULL 表示異常關機 | 控制檔 | V$DATAFILE.LAST_CHANGE# |
二、五大場景 SCN 比較與恢復動作
| 場景 | SCN 關係 | 需媒體恢復? | 需執行個體恢復? | 處理動作 |
| 正常關機 | System = Datafile = Start = Stop | 否 | 否 | 直接 OPEN |
| 異常關機 | System = Datafile = Start, Stop = NULL | 否 | 是 | OPEN → 自動執行個體恢復 (SMON) |
| 舊資料檔 (備份還原) | System = Datafile > Start, Stop = NULL/非NULL | 是 | 視 Stop | 媒體恢復至 System=Datafile=Start |
| 備份控制檔 | System = Datafile ≤ Start, Stop ≠ NULL | 是 (需 USING BACKUP CONTROLFILE) | 否 | 媒體恢復至 Current Redo 最大 SCN → 必須 RESETLOGS |
| 重建控制檔 NORESETLOGS | Current Redo SCN = System = Datafile ≥ Start | 是 (若 > Start) | 視 Stop | 媒體恢復至 Redo 最大 SCN |
| 重建控制檔 RESETLOGS | Datafile Header SCN 為準 | 是 | 否 | 媒體恢復至 Datafile Header SCN → RESETLOGS |
三、RESETLOGS vs NORESETLOGS 決策邏輯
ALTER DATABASE OPEN RESETLOGS; -- 重設 Log Sequence = 1,拋棄舊 Redo
ALTER DATABASE OPEN NORESETLOGS; -- 保留現有 Redo 序號
- 必須 RESETLOGS:不完全恢復、使用備份控制檔、重建控制檔指定 RESETLOGS。
- RESETLOGS 後必須完整備份**:新化身起始點,舊備份無法直接用於後續恢復。
- NORESETLOGS 重建控制檔:Datafile Checkpoint 來自 Online Redo Current Log Header。
- RESETLOGS 重建控制檔:Datafile Checkpoint 來自各資料檔頭。
四、關鍵查詢腳本(巡檢/故障排查)
-- 1. 系統 vs 資料檔檢查點
SELECT db.checkpoint_change# AS system_ckpt,
df.checkpoint_change# AS datafile_ckpt,
df.name
FROM v$database db, v$datafile df;
-- 2. 啟動 SCN (資料檔頭)
SELECT name, checkpoint_change# AS start_scn
FROM v$datafile_header;
-- 3. 終止 SCN
SELECT name, last_change# AS stop_scn
FROM v$datafile;
-- 4. 當前 Redo 最大 SCN
SELECT MAX(first_change#) AS current_redo_scn FROM v$log_history;
五、實務決策流程圖(文字版)
啟動資料庫
│
├─ System = Datafile = Start ?
│ ├─ YES → Stop NULL ? → YES → 異常關機 → 自動執行個體恢復 → OPEN
│ │ NO → 正常關機 → 直接 OPEN
│ └─ NO → System = Datafile > Start ? → YES → 舊資料檔 → 媒體恢復
│ │
│ └─ NO → System = Datafile ≤ Start ?
│ ├─ YES → 備份控制檔 → USING BACKUP CONTROLFILE 恢復 → RESETLOGS
│ └─ NO → 重建控制檔 → 依 NORESETLOGS/RESETLOGS 分支
六、常見誤區澄清
| 誤區 | 正確認知 |
| SCN 就是時間戳記 | SCN 是邏輯時鐘,單位時間內可產生多個 SCN;對應時間需查 V$LOG_HISTORY.FIRST_TIME。 |
| RESETLOGS 後舊備份完全失效 | 舊備份仍可用於「重建到 RESETLOGS 前時間點」的新化身恢復,但需配合 RECOVER ... USING BACKUP CONTROLFILE。 |
| Stop SCN 非 NULL 就不需執行個體恢復 | Stop SCN 非 NULL 代表該檔案正常關閉;但若其他檔案 Stop=NULL,整體仍需執行個體恢復。 |
掌握 SCN 四大類型與五大場景比較邏輯,能在備份恢復、Standby 建立、控制檔重建、時間點恢復等關鍵操作中,精準判斷資料庫狀態、選擇正確恢復路徑,避免資料遺失與多餘停機。