檢查點SCN在事務發生後以及發生檢查點和歸檔操作後的變化

nathanzhn發表於2014-02-19

1、事務開始;

2、在 buffer cache 中找到需要的資料塊,否則,從資料檔案中載入 buffer cache 中;

3、事務修改 buffer cache 的資料塊,該資料被標識為“髒資料”,並被寫入 log buffer 中;

4、事務提交,LGWR 程式將 log buffer 中的“髒資料”寫入 redo log file 中;

5、當發生 checkpointCKPT 程式更新所有資料檔案的檔案頭中的資訊,DBWn 程式則

負責將 Buffer Cache 中的髒資料寫入到資料檔案中。

經過上述 5 個步驟,事務中的資料變化最終被寫入到資料檔案中。但是,一旦在上述中

間環節時,資料庫意外當機了,在重新啟動時如何知道哪些資料已經寫入資料檔案、哪些沒

有寫呢(同樣,在 DGstreams 中也存在類似疑問:redo log 中哪些是上一次同步已經複製過

的資料、哪些沒有)?SCN 機制就能比較完善的解決上述問題。SCN 是一個數字,確切的說

是一個只會增加、不會減少的數字。正是它這種只會增加的特性確保了 Oracle 知道哪些應該

被恢復、哪些應該被複制。

在一個事務提交後(上述第四個步驟),會在 redo log 中存在一條 redo 記錄,同時,系

統為其提供一個最新的 SCN(通過函式 dbms_flashback.get_system_change_number 可以知道

當前的最新 SCN),記錄在該條記錄中。如果該條記錄是在 redo log 被清空(日誌滿做切換

時或發生 checkpoint 時,所有變化日誌已經被寫入資料檔案中),則其 SCN 被記錄為 redo log

 low SCN。以後在日誌再次被清空前寫入的 redo 記錄中 SCN 則成為 Next SCN

當日志切換(寫滿自動切換)或發生checkpoint(上述第五個步驟)時,從 Low SCN  Next SCN 之間的

所有 redo 記錄的資料就被 DBWn 程式寫入資料檔案中,而 CKPT 程式則將所有資料檔案(無

 redo log 中的資料是否影響到該資料檔案)的檔案頭上記錄的 Start SCN(通過檢視

v$datafile_header 的欄位 checkpoint_change#可以查詢)更新為 Next SCN,同時將控制檔案中的

System Checkpoint SCN(通過檢視 v$database 的欄位 checkpoint_change#可以查詢)、每個數

據檔案對應的 Datafile Checkpoint(通過檢視 v$datafile 的欄位 checkpoint_change#可以查詢)

也更新為 Next SCN。但是,如果該資料檔案所在的表空間被設定為 read-only 時,資料檔案

 Start SCN 和控制檔案中 Datafile Checkpoint SCN 都不會被更新。


--以下操作是為了驗證上述理論:

begin for i in 1..5 loop


insert into test.t3 values(i);

end loop;

commit;

end;

/

 

begin for i in 11..101 loop

insert into test.t3 values(i);

end loop;

commit;

end;

/

 

--下面是用到的語句清單

insert into test.t3 values(109);

select checkpoint_change#,current_scn from v$database;

commit;

insert into test.t3 values(110);

select checkpoint_change#,current_scn from v$database;

commit;

select checkpoint_change# from v$datafile;

select checkpoint_change# from v$datafile_header;

select checkpoint_change#,current_scn from v$database;

--發生一次歸檔,檢視檢查點SCN的變化

alter system archive log current;


select checkpoint_change#,current_scn from v$database;

select * from v$log;
--發生一次檢查點,檢視檢查點SCN的變化

alter system checkpoint;

select checkpoint_change# from v$datafile;

select checkpoint_change# from v$datafile_header;

select checkpoint_change#,current_scn from v$database;

select * from v$log;

select sequence#,first_change#,next_change# from v$log_history;

--下面是上面指令碼的實際操作過程

SYS@PROD>insert into test.t3 values(109);

 

1 row created.

 

select checkpoint_change#,current_scn from v$database;

 

CHECKPOINT_CHANGE# CURRENT_SCN

------------------ -----------

            747809      747844

 

SYS@PROD>commit;

 

Commit complete.

 

SYS@PROD>insert into test.t3 values(110);

 

1 row created.

 

SYS@PROD>select checkpoint_change#,current_scn from v$database;

 

CHECKPOINT_CHANGE# CURRENT_SCN

------------------ -----------

            747809      747847

 

SYS@PROD>commit;

 

Commit complete.

 

SYS@PROD>select checkpoint_change# from v$datafile;

 

CHECKPOINT_CHANGE#

------------------

            747809

            747809

            747809

            747809

            747809

            747809

            747809

            747809

            747809

 

9 rows selected.

 

SYS@PROD>select checkpoint_change# from v$datafile_header;

 

CHECKPOINT_CHANGE#

------------------

            747809

            747809

            747809

            747809

            747809

            747809

            747809

            747809

            747809

 

9 rows selected.

 
--發生歸檔,之後檢視檢查點的變化

SYS@PROD>alter system archive log current;

 

CHECKPOINT_CHANGE# CURRENT_SCN

------------------ -----------

            747809      747850

 

SYS@PROD>alter system archive log current;

select checkpoint_change#,current_scn from v$database;

 

System altered.

 

SYS@PROD>select checkpoint_change#,current_scn from v$database;

CHECKPOINT_CHANGE# CURRENT_SCN

------------------ -----------

            747809      747854

 --上面的檢查點SCN沒有變化,原因是裝置IO不繁忙,因此要等一會兒才會更新三個檢查點SCN,幽靈一篇文章專門論證這一點

SYS@PROD>select * from v$log;

 

    GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARCHIV

---------- ---------- ---------- ---------- ---------- ------

STATUS                           FIRST_CHANGE# FIRST_TIME

-------------------------------- ------------- ------------

         1          1         31  104857600          4 NO

CURRENT                                 747853 31-JAN-14 –此處的747853為之前group3日誌組歸檔時的當時系統SCN,作為group3日誌組的HIGH SCN,也作為該當前日誌的LOW SCN

 

         2          1         29  104857600          4 YES

INACTIVE                                747763 31-JAN-14

 

         3          1         30  104857600          4 YES

ACTIVE                                  747801 31-JAN-14

 

 --發生一次檢查點,檢視檢查點SCN的變化

SYS@PROD>alter system checkpoint;

 

System altered.

--發起checkpoint後,控制檔案中的Datafile Checkpoint SCN被同步為當時發起checkpoint時的系統SCN

SYS@PROD>select checkpoint_change# from v$datafile;

--證明

CHECKPOINT_CHANGE#

------------------

            747855

            747855

            747855

            747855

            747855

            747855

            747855

            747855

            747855

 

9 rows selected.

--發起checkpoint後,資料檔案中的Start SCN被同步為當時發起checkpoint時的系統SCN

SYS@PROD>select checkpoint_change# from v$datafile_header;

--發起checkpoint後,控制檔案中的Datafile Checkpoint SCN被同步為當時系統SCN

CHECKPOINT_CHANGE#

------------------

            747855

            747855

            747855

            747855

            747855

            747855

            747855

            747855

            747855

 

9 rows selected.

--發起checkpoint後,控制檔案中的System Checkpoint SCN被同步為當時發起checkpoint時的系統SCN

SYS@PROD>select checkpoint_change#,current_scn from v$database;

 

CHECKPOINT_CHANGE# CURRENT_SCN

------------------ -----------

            747855      747856

 

SYS@PROD>select * from v$log;

 

    GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARCHIV

---------- ---------- ---------- ---------- ---------- ------

STATUS                           FIRST_CHANGE# FIRST_TIME

-------------------------------- ------------- ------------

         1          1         31  104857600          4 NO

CURRENT                                 747853 31-JAN-14

 

         2          1         29  104857600          4 YES

INACTIVE                                747763 31-JAN-14

 

         3          1         30  104857600          4 YES

INACTIVE                                747801 31-JAN-14

 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26521853/viewspace-1083881/,如需轉載,請註明出處,否則將追究法律責任。

相關文章