Oracle 檢查點涉及的SCN

caohongfeng666發表於2018-11-15

1. 檢查點涉及的SCN


(1). 資料檔案中的檔案頭啟動檢查點的scn

儲存在每個資料檔案的檔案頭中

select name,checkpoint_change# 

from v$datafile_header;


在安全關閉資料庫的過程中,系統會執行一個檢查點動作,這時所有資料檔案的終止scn都會設定成資料檔案頭中的那個啟動scn的值。

  

在資料庫重新啟動的時候,Oracle將檔案頭中的那個啟動scn(存在於各個資料檔案裡)與資料庫檔案檢查點scn(存在於控制檔案裡)進行比較,如果這兩個值相互匹配,oracle接下來還要比較資料檔案頭中的啟動scn和控制檔案中資料檔案的終止scn。如果這兩個值也一致,就意味著所有資料塊的redo記錄都已經提交,所有對資料庫的修改都沒有在關閉資料庫的過程中丟失,因此這次啟動資料庫的過程也不需要任何恢復操作,此時資料庫就可以開啟了。 


(2).資料檔案檢查點SCN,

儲存在控制檔案中:

SELECT T.NAME,T.CHECKPOINT_CHANGE#,b.tablespace_name

FROM  V$DATAFILE T,dba_data_files b

where t.FILE#=b.file_id;


(3).資料檔案的終止scn


儲存在控制檔案中

select name,last_change# 

from v$datafile;

   

終止SCN在資料庫關閉或者表空間離線是才會涉及到,在正常的資料庫操作過程中,所有正處於聯機讀寫模式下的資料檔案的終止scn都為null.


在安全關閉資料庫的過程中,系統會執行一個檢查點動作,這時所有資料檔案的終止scn都會設定成資料檔案頭中的那個啟動scn的值。


(4).系統檢查點SCN

儲存在控制檔案中

select  t.CHECKPOINT_CHANGE#

from v$database t;


(5). 日誌檔案的scn


select t.FIRST_CHANGE# 開始時的SCN,t.FIRST_TIME,t.NEXT_CHANGE#  結束時的SCN

from V$log_History  t

order by t.FIRST_TIME;



2. 發生完全檢查點時:


資料檔案頭,標識上次處理完的啟用scn。


而CKPT程式則將所有資料檔案(無論redo log中的資料是否影響到該資料檔案)檔案頭上記錄的Start SCN更新為Next SCN; (透過檢視v$datafile_header的欄位checkpoint_change#可以查詢)

     

同時將控制檔案中的System Checkpoint SCN更新為Next SCN; (透過檢視v$database的欄位checkpoint_change#可以查詢)


每個資料檔案對應的Datafile Checkpoint)也更新為Next SCN;(透過檢視v$datafile的欄位checkpoint_change#可以查詢)

    

從Low SCN到Next SCN之間的所有redo記錄的資料就被DBWn程式寫入資料檔案中.    



3. 系統是如何產生一個最新的SCN的:


實際上,這個數字是由當時的timestamp轉換過來的。每當需要產生一個最新的SCN到redo記錄時,系統獲取當時的timestamp,將其轉換為數字作為SCN。


我們可以透過函式SCN_TO_TIMESTAMP將其轉換回timestamp:

select dbms_flashback.get_system_change_number, SCN_TO_TIMESTAMP(dbms_flashback.get_system_change_number) 

from dual;

 

也可以用函式timestamp_to_scn將一個timestamp轉換為SCN:

select timestamp_to_scn(SYSTIMESTAMP) as scn 

from dual;


4. SCN除了作為反映事務資料變化並保持同步外,它還起到系統的"心跳"作用——每隔3秒左右系統會重新整理一次系統SCN。


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

相關文章