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

Oracle SCN (System Change Number) 深度解析:機制、查詢與恢復關聯

     編輯:Oracle 資料庫基礎

SCN 核心定義

SCN (System Change Number) 是 Oracle 資料庫內部的一個單調遞增的邏輯時鐘,標記資料庫的一致性時間點。每個已提交的交易都會被賦予一個唯一的 SCN,由 LGWR 在 Commit 時同步寫入 Redo Log,確保 Commit 返回前,Redo 已持久化且 SCN 已記錄。

SCN 的關鍵特性

  • 全局唯一且遞增:單實例下嚴格遞增;RAC 下由各實例分配範圍 (Instance SCN) 配合全域協調 (Global SCN) 保證全序。
  • 邏輯時間戳:不對應牆鐘時間,但可近似轉換 (SCN_TO_TIMESTAMP / TIMESTAMP_TO_SCN),精度約 3 秒 (依 SMON_SCN_TIME 映射表)。
  • 無處不在:Control File、Datafile Header、Redo Log、Archive Log、Flashback Log、Streams/GoldenGate 捕獲點、Data Guard 同步點、RMAN 備份標記、Undo Segment Header 等皆記錄 SCN。

查詢當前 SCN

-- 現代標準寫法 (10g+)
SELECT DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER FROM dual;

-- 相容舊版
SELECT CURRENT_SCN FROM V$DATABASE;

-- 等價查詢
SELECT CHECKPOINT_CHANGE# FROM V$DATABASE;  -- 最近 Checkpoint SCN

Checkpoint 與 SCN 的關係

Checkpoint 目的:將緩衝區中的髒塊 (已提交交易修改的塊) 寫回資料檔,縮短執行個體復原時間 (MTTR)。

  • Commit 時 僅將 Redo 寫入 Redo Log (含 SCN),不立即寫資料檔 (為減少 I/O,採批次寫入)。
  • Checkpoint 觸發 (CKPT 背景程序) 時,DBWn 將髒塊寫入資料檔,並更新 Control File 與 Datafile Header 中的 Checkpoint SCN。
  • 正常關閉 (SHUTDOWN NORMAL/IMMEDIATE) 會觸發 Checkpoint,確保所有 SCN 持久化到資料檔頭。

SCN 記錄的四個關鍵位置

位置視圖/來源含義
Control File: System Checkpoint SCNV$DATABASE.CHECKPOINT_CHANGE#資料庫層級最近完成 Checkpoint 的 SCN
Control File: Datafile Checkpoint SCNV$DATAFILE.CHECKPOINT_CHANGE#各資料檔層級最近完成 Checkpoint 的 SCN
Control File: Stop SCNV$DATABASE.LAST_OPEN_INCARNATION# 相關資料庫最後正常關閉時的 SCN (用於判斷是否需執行執行個體復原)
Datafile Header檔案頭部區塊該檔案自身的 Checkpoint SCN,啟動時與 Control File 比對決定是否需復原

SCN 在核心功能中的角色

1. 執行個體復原

啟動時比對 Control File Stop SCN 與 Datafile Header Checkpoint SCN:若一致 → 乾淨關閉,無需復原;若不一致 → 從 Datafile Header Checkpoint SCN 開始應用 Redo (線上/歸檔) 向前滾動,再回滾未提交交易。

2. Flashback 技術

  • FLASHBACK TABLE TO SCN / FLASHBACK DATABASE TO SCN:依 SCN 定位歷史版本。
  • FLASHBACK TRANSACTION QUERY:查詢指定 SCN 範圍的交易變更。
  • 依賴 UNDO_RETENTION、FLASHBACK RETENTION TARGET 保留足夠 Undo/Flashback Log。

3. Data Guard 同步

Primary 產生 Redo (含 SCN) → 傳輸至 Standby → Standby Apply 過程按 SCN 順序應用,V$DATAGUARD_STATS.APPLY_LAG 即以 SCN 差異換算時間延遲。

4. Streams / GoldenGate 複製

捕獲程序讀取 Redo,按 SCN 組裝 LCR (Logical Change Record);應用程序按 SCN 順序重放,保證邏輯一致性。

5. RMAN 備份與恢復

  • 備份集標記 CHECKPOINT_CHANGE# (資料檔) 與 REDO_THREAD/REDO_START_SCN (歸檔)。
  • RECOVER DATABASE UNTIL SCN 123456:精確至 SCN 的時間點恢復 (PITR)。
  • 增量備份 INCREMENTAL LEVEL 1 依 SCN 判斷哪些塊在基準 SCN 後變更。

SCN 匯總問題與 12c/18c/19c 改進

  • SCN 耗盡風險:SCN 48 位元 (281 兆),理論上極難耗盡,但異常增長 (Bug、惡意程式、錯誤的 DBLINK 同步) 可能導致接近上限。Oracle 12c 引入 SCN Headroom 機制,限制 SCN 增長速率,並提供 DBMS_SCN 監控套件。
  • 跨資料庫 SCN 同步:DBLINK 查詢會同步雙端 SCN (取最大值),頻繁跨庫查詢可能加速 SCN 增長,建議使用 GLOBAL_NAMES=FALSE 避免不必要同步或升級至 12c+ 受保護。

實用監控查詢

-- 當前 SCN 增長速率 (每秒)
SELECT (MAX(SCN) - MIN(SCN)) / (MAX(TS) - MIN(TS)) AS scn_per_sec
FROM (
  SELECT DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER SCN, SYSTIMESTAMP TS FROM dual
  UNION ALL SELECT DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER, SYSTIMESTAMP FROM dual
  -- 實際應用中定期寫入監控表
);

-- 檢查 SCN Headroom (12c+)
SELECT * FROM V$SCN_HEADROOM;

-- 查詢 SCN 對應時間 (近似)
SELECT SCN_TO_TIMESTAMP(123456789) FROM dual;

總結

SCN 是 Oracle 一致性、恢復、複製、閃回的核心錨點。理解 SCN 的產生 (Commit)、持久化 (Redo/Checkpoint)、記錄位置 (Control/Datafile Header)、應用場景 (Recovery/Flashback/DG/GG/RMAN),是高階 DBA 掌握資料庫核心運作、排查疑難雜症、設計高可用架構的必備內功。

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