SCN

理解下oracle事務中的數據變化是如何寫入數據文件的

1 事務開始

2 在buffercache中找到需要的數據塊,如果沒有找到,則從數據文件中載入buffer cache中;

3 事務修改buffercache的數據塊,該數據塊被標示爲”髒數據”,並被寫入log buffer中;

4 事務提交,LGWR進程將log buffer中的髒數據寫入redo  log file中;

5 當發生checkpoint的時候,CKPT進程更新所有的數據文件的文件頭中的信息,DBWn進程則負責將buffer cache中的髒數據寫入到數據文件中。

 

總共有4中SCN:系統檢查點(System Checkpoint)SCN、數據文件檢查點(Datafile Checkpoint)SCN、結束SCN(Stop SCN)、開始SCN(Start SCN)。其中其面3中SCN存在於控制文件中,最後一種則存在於數據文件的文件頭中。

在控制文件中,System Checkpoint SCN是針對整個數據庫全局的,因而之存在一個,而Datafile Checkpoint SCN和Stop SCN是針對每個數據文件的,因而一個數據文件就對應在控制文件中存在一份Datafile Checkpoint SCN和Stop SCN。在數據庫正常運行期間,Stop SCN(通過視圖v$datafile的字段last_change#可以查詢)是一個無窮大的數字或者說是NULL。

 

在一個事務提交後(上述第四個步驟),會在redo log中存在一條redo記錄,同時,系統爲其提供一個最新的SCN(通過函數dbms_flashback.get_system_change_number可以知道當前的最新SCN),記錄在該條記錄中。如果該條記錄是在redo log被清空(日誌滿做切換時或發生checkpoint時,所有變化日誌已經被寫入數據文件中),則其SCN被記錄爲redo log的low SCN。以後在日誌再次被清空前寫入的redo記錄中SCN則成爲NextSCN。

 

當日志切換或發生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都不會被更新。

 

那系統是如何產生一個最新的SCN的?實際上,這個數字是由當時的timestamp轉換過來的。每當需要產生一個最新的SCN到redo記錄時,系統獲取當時的timestamp,將其轉換爲數字作爲SCN。我們可以通過函數SCN_TO_TIMESTAMP(10g以後)將其轉換回timestamp:

 

SQL>select dbms_flashback.get_system_change_number, SCN_TO_TIMESTAMP(dbms_flashback.get_system_change_number)from dual;

 

GET_SYSTEM_CHANGE_NUMBER

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

SCN_TO_TIMESTAMP(DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER)

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

             2877076756

17-AUG-0702.15.26.000000000 PM

 

也可以用函數timestamp_to_scn將一個timestamp轉換爲SCN:

 

SQL>select timestamp_to_scn(SYSTIMESTAMP) as scn from dual;

 

      SCN

----------

2877078439

 

最後,SCN除了作爲反映事務數據變化並保持同步外,它還起到系統的“心跳”作用——每隔3秒左右系統會刷新一次系統SCN。

 

下面,在簡單介紹一下SCN如何在數據庫恢復中起作用。

 

數據庫在正常關閉(shutdown immediate/normal)時,會先做一次checkpoint,將log file中的數據寫入數據文件中,將控制文件、數據文件中的SCN(包括控制文件中的Stop SCN)都更新爲最新的SCN。

 

數據庫異常/意外關閉不會或者只更新部分Stop SCN。

 

當數據庫啓動時,Oracle先檢查控制文件中的每個Datafile Checkpoint SCN和數據文件中的Start SCN是否相同,再檢查每個Datafile Checkpoint SCN和Stop SCN是否相同。如果發現有不同,就從Redo Log中找到丟失的SCN,重新寫入數據文件中進行恢復。



注:轉自hellodba網站

發佈了82 篇原創文章 · 獲贊 2 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章