System Change Number (SCN) 是 Oracle 內部單調遞增的邏輯時鐘,標記每個提交交易的唯一時間點。核心作用:
註:SCN 僅在提交時遞增,故常被稱為 System Commit Number,兩者在實務中可互換使用。
| 版本 | 方法 | SQL 範例 | 備註 |
|---|---|---|---|
| 9i~11g | DBMS_FLASHBACK | SELECT dbms_flashback.get_system_change_number FROM dual; | 官方推薦,需 FLASHBACK 權限 |
| 10g+ | V$DATABASE | SELECT current_scn FROM v$database; | 最簡單,無額外權限需求 |
| 10g+ | DBMS_UTILITY | SELECT dbms_utility.get_scn FROM dual; | 替代方案 |
| 8i/9i 前 | X$KTUXE 底層視圖 | SELECT MAX(ktuxescnw*POWER(2,32)+ktuxescnb) FROM x$ktuxe; | 內部視圖,非官方支援,慎用 |
X$KTUXE (Kernel Transaction Undo Transaction Entry) 記錄活躍交易的 UNDO 段資訊。公式:
SCN = ktuxescnw * 2^32 + ktuxescnb
-- ktuxescnw: SCN 高 32 位 (wrap)
-- ktuxescnb: SCN 低 32 位 (base)
取 MAX() 即為當前最高 SCN。此法繞過權限檢查,但依賴非公開結構,升級風險極高。
-- 記錄操作前 SCN
VAR pre_scn NUMBER;
EXEC :pre_scn := dbms_flashback.get_system_change_number;
-- 執行高風險操作...
-- 需恢復時
FLASHBACK TABLE t TO SCN :pre_scn;
-- 主庫
SELECT current_scn FROM v$database;
-- 備庫
SELECT current_scn FROM v$database;
-- 差值過大 → 複寫延遲
-- 兩階段提交前記錄各節點 SCN,提交後驗證推進一致性
GRANT FLASHBACK ANY TABLE TO user; 而非 DBA 角色V$DATABASE.CURRENT_SCN,效能最佳且無包裝調用開銷SELECT current_scn/POWER(2,48)*100 FROM v$database;