Oracle 10g在v$database引入CURRENT_SCN欄位,直觀顯示當前系統變更號(SCN)。但實測發現:直接查詢v$database.CURRENT_SCN會導致SCN遞增,而DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER則不會。本文解析其底層機制與實務影響。
SQL> SELECT current_scn FROM v$database;
CURRENT_SCN
------------
8910961765228
SQL> SELECT dbms_flashback.get_system_change_number FROM dual;
CURRENT_SCN
------------
8910961765228 -- 未變
SQL> SELECT dbms_flashback.get_system_change_number FROM dual;
CURRENT_SCN
------------
8910961765228 -- 仍未變
SQL> SELECT current_scn FROM v$database;
CURRENT_SCN
------------
8910961765229 -- +1
SQL> SELECT current_scn FROM v$database;
CURRENT_SCN
------------
8910961765230 -- 再+1
SEQUENCE,每次查詢觸發SCN推進,保證返回值絕對「當前」。DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER獲取穩定SCN作為AS OF SCN子句參數,避免因查詢v$database導致基準點漂移。v$database.CURRENT_SCN。DBMS_FLASHBACK包函數,備庫可讀v$database,避免雙邊推進造成誤判。Oracle 9i僅提供DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER;10g新增v$database.CURRENT_SCN為顯示便利性犧牲了「純讀取」語義。12c起引入CURRENT_SCN與CHECKPOINT_CHANGE#更精細區分。
掌握SCN推進觸發條件,是設計高可靠閃回恢復、邏輯備份與異構同步方案的關鍵細節。