Oracle scn

zecaro發表於2011-03-02

原文連結

SCN是什麼?The System Change Number
       system change number (SCN)是一個非常重要的標記,Oracle使用它來標記資料庫在過去時間內的狀態和軌跡。

       Oracle使用SCN來儲存所有變化的軌跡。SCN是一個邏輯時鐘來記錄資料庫事件。它非常的重要,並不是隻是為了恢復
       SCN有點類似於sequence,Oracle在SGA中增加它。當一個事務修改或者插入資料,Oracle首先寫入一個新的SCN到回滾段中。log writer程式立刻把提交的記錄寫入到重做日誌中,這條提交的記錄將擁有唯一的SCN。事實上,把SCN寫入到日誌,就意味著一個事務的完成。SCN幫助Oracle決定在一次突然中斷或者SHUTDOWN ABORT後,是否需要一個崩潰恢復。每當資料庫發生checkpoint,Oracle 寫一個START SCN命令到資料檔案頭。控制檔案維護著每個資料檔案的SCN,稱為STOP SCN,通常是無窮大,每當例項正常關閉(SHUTDOWN NORMAL or SHUTDOWN IMMEDIATE),Oracle會複製資料檔案頭START SCN到控制檔案的STOP SCN。如果是正常的重啟資料庫,是不需要恢復的,因為控制檔案和資料檔案的SCN是吻合的。反之,突然中斷系統就沒法同步SCN,SCN不匹配,Oracle就認為需要做恢復。 
       另外Oracle還使用資料塊的SCN來維護查詢的一致性和多版本

Checkpoint

       Checkpoint是一個資料庫事件,用來同步所有的datafile,controlfile和redo logfile。當發出ckpt時(回顧什麼時候oracle會發出ckpt呢),ckpt會將檢查點時刻的scn寫入到控制檔案和資料檔案頭部,同時會促使dbwr程式將data buffer中的所有的髒資料寫入到資料檔案中。而dbwr程式工作時又會促使lgwr寫log buffer中的日誌資料到redo logfile中。所以當發出檢查點時CKPT,DBWR和LGWR同時工作,三種檔案的scn完全一致,從而能保持完全同步。


一次checkpoint包含以下步驟:

1. 把redo buffers的內容刷到redo log中。
2. 在redo log file中留下一個checkpoint記錄。
3. 把database buffer cache的變更重新整理到磁碟。
4. 在checkpoint完成後,更新資料檔案頭和控制檔案。

Checkpoint的具體工作包括:

• 觸發DBWn向磁碟寫入Dirty data。
• 把checkpoint資訊更新到datafile header上。
• 把checkpoint資訊更新到control file裡。
• Checkpoint做的事情之一是觸發DBWn把buffer cache中的Dirty cache磁碟。另外就是把最近的系統的SCN更新到datafile header和control file(每一個事務都有一個SCN),做第一件事的目的是為了減少由於系統突然當機而需要的恢復時間,做第二件事實為了保證資料庫的一致性。

checkpoint的作用就是 :

1.減少系統崩潰導致的恢復時間
2.保證資料庫的一致性

       確保定期向磁碟寫入記憶體中發生修改的資料塊,以便在系統或資料庫失敗時不會丟失資料

•縮短例程恢復所需的時間。只需處理最後一個檢查點後面的重做日誌條目以啟動恢復操作
•確保提交的所有資料在關閉期間均已寫入資料檔案 


       由 CKPT 寫入的檢查點資訊包括檢查點位置、系統更改號、重做日誌中恢復操作的起始位置以及有關日誌的資訊等等。


checkpoint觸發:

一、log switch

二、data buffer cache達到指定塊

三、達到checkpoint指定時間

具體如下:

1.當發生日誌組切換的時候,減少crash後的recovery時間。
2.當符合 LOG_CHECKPOINT_TIMEOUT,LOG_CHECKPOINT_INTERVAL,fast_start_io_target,fast_start_mttr_target 引數設定的時候
    LOG_CHECKPOINT_TIMEOUT 預設1800秒
    LOG_CHECKPOINT_INTERVAL 預設 0
    fast_start_mttr_target 預設,如果被指定,會覆蓋LOG_CHECKPOINT_INTERVAL
    fast_start_io_target,10g以後已經拋棄。
3.當 ALTER SYSTEM SWITCH LOGFILE,ALTER SYSTEM CHECKPOINT
4.當 alter tablespace XXX begin backup,end backup
5.當 alter tablespace ,datafile offline ;

===================================================================================

1、SCN的介紹

Oracle中的SCN有下面幾種:

①系統檢查點scn(v$database(checkpoint_change#))

當一個檢查點動作完成之後,Oracle就把系統檢查點的SCN儲存到控制檔案中

select checkpoint_change# from v$database;

②資料檔案檢查點scn (v$datafile(checkpoint_change#))

當一個檢查點動作完成之後,Oracle就把每個資料檔案的scn單獨存放在控制檔案中

select name,checkpoint_change# from v$datafile;

③資料檔案終止scn (v$datafile(last_change#))

每個資料檔案的終止scn都儲存在控制檔案中。在正常的資料庫操作過程中,所有正處於聯機讀寫模式下的資料檔案的終止scn都為null

select name,last_change# from v$datafile;

④資料檔案啟動scn (v$datafile_header(checkpoint_change#)

Oracle把這個檢查點的scn儲存在每個資料檔案的檔案頭中,這個值稱為啟動scn,因為它用於在資料庫例項啟動時,檢查是否需要執行資料庫恢復

select name,checkpoint_change# from v$datafile_header;

2、SCN的工作機制:

①在資料庫開啟並執行之後,控制檔案中的系統檢查點scn、控制檔案中的資料檔案檢查點scn和每個資料檔案頭中的啟動scn都是相同的

②控制檔案中的每個資料檔案的終止scn都為null

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

④在資料庫重新啟動的時,Oracle將執行兩次檢查

       ◆看資料檔案頭中的ckpt計數器是否與對應控制檔案中的ckpt計數器一致。若相等,進行第二次檢查

       ◆比較檔案頭中的啟動scn和對應控制檔案中的終止scn進行比較,如果終止scn等於啟動scn,則不需要對那個檔案進行恢復


⑤資料庫開啟之後,儲存在控制檔案中的資料檔案終止scn的值再次被更改為null,這表示資料檔案已經開啟並能夠正常使用了

注:當ABORT強制關閉資料庫時不進行檢查點處理,所以終止scn仍然為無窮大。在下次啟動期間,發現啟動scn和終止scn不同,需要進行執行緒恢復(instance recovery)。


3、SCN的增加


①SCN(System Change Number)只要資料庫被修改,就會+1,而不是一定要進行checkpoint,例如DML的發生即使沒有提交也會使SCN+1


注:SCN增加並不代表會在資料檔案頭中表現出來,而是需要等到checkpoint執行後才寫入(當然可能已經增加了很多)


②如果一個DML導致產生事務,則會產生一個SCN。這個意思是說如果一個事務包含多個dml,則只有第一個初始產生事務的dml產生scn,提交的時候又是一個scn,如果一個事務只有一個dml,拿看起來就是dml產生一個scn,提交或者回滾產生一個scn。


③Oracle 10g內部的SCN會預設不管有沒有動作,每隔3s自動增加一次。其他需要增加的情況則再加。


④只有ckpt程式才會修改檔案頭中的checkpoint計數器和SCN,DBWR只會修改資料塊,即ckpt通知dbwr寫資料檔案,寫完之後 ckpt更新控制檔案和資料檔案頭。此時若DBWR發現資料塊的log block還沒有被寫入日誌檔案,則在dbwr寫塊之前通知llgwr把log buffer中的日誌寫入log檔案。


注:總結一下,日誌切換必定出發ckpt,但ckpt不一定會出發lgwr,但是一定會觸發dbwr

 

4、其他的SCN

日誌檔案頭中包含了Low scn、Next scn,表示給日誌檔案包含有從Low scn到Next scn的redo record

注:當系統執行時,日誌檔案的Next scn同樣為無窮大。而且需要注意:在恢復時不是用日誌檔案中的Low scn和Next scn來選擇恢復的日誌檔案,而是透過資料檔案頭中的資訊。


②資料塊中的SCN

data block裡面的SCN是當block被更改的時候的SCN,而資料檔案有那麼多block,自然不同的block有不同的SCN,block中存在 block SCN和ITL中的commit SCN。block SCN又在塊頭和塊位都有,若不一致意味著block損壞。而ITL中的commit SCN則跟consistent gets and delay block cleanout有關。

③v$database中的checkpoint_change#和dbms_flashback.get_system_change_number 不同。前者是作為資料庫的最後一次checkpoint是的SCN,而後者是系統的最新SCN,所以一般後者都會比前者大,而當剛做完 checkpoint時兩者會差不多。


④當begin backup命令發出後,相關資料檔案的checkpoint scn被凍結(以及狀態標誌被改變),其他一切照舊。例如:日誌切換時checkpoint count正常遞增/檢查點照常寫檔案,自然檔案中的資料塊內的各種scn也照常遞增。

===================================================================================

SCN(System Chang Number)作為oracle中的一個重要機制,在資料恢復、Data Guard、Streams複製、RAC節點間的同步等各個功能中起著重要作用。

理解SCN的運作機制,可以幫助你更加深入地瞭解上述功能。


在理解SCN之前,我們先看下oracle事務中的資料變化是如何寫入資料檔案的:

1、 事務開始;
2、 在buffer cache中找到需要的資料塊,如果沒有找到,則從資料檔案中載入buffer cache中;
3、 事務修改buffer cache的資料塊,該資料被標識為“髒資料”,並被寫入log buffer中;
4、 事務提交,LGWR程式將log buffer中的“髒資料”寫入redo log file中;
5、 當發生checkpoint,CKPT程式更新所有資料檔案的檔案頭中的資訊,DBWn程式則負責將Buffer Cache中的髒資料寫入到資料檔案中。

經過上述5個步驟,事務中的資料變化最終被寫入到資料檔案中。但是,一旦在上述中間環節時,資料庫意外當機了,在重新啟動時如何知道哪些資料已經寫入資料檔案、哪些沒有寫呢?


SCN機制就能比較完善的解決上述問題。

SCN是一個數字,確切的說是一個只會增加、不會減少的數字。正是它這種只會增加的特性確保了Oracle知道哪些應該被恢復、哪些應該被複制。

總共有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則成為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都不會被更新。


那系統是如何產生一個最新的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-07 02.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。

#########################摘自EYGLE部落格########################################

在資料庫open的過程中,Oracle要進行兩次檢查.

第一次檢查資料檔案頭中的Checkpoint cnt是否與對應控制檔案中的Checkpoint cnt一致.
如果相等,進行第二次檢查.

第二次檢查資料檔案頭的開始SCN和對應控制檔案中的結束SCN是否一致
如果結束SCN等於開始SCN,則不需要對那個檔案進行恢復.

對每個資料檔案都完成檢查後,開啟資料庫.同時將每個資料檔案的結束SCN設定為無窮大.

#########################摘自EYGLE部落格########################################
SCN作為Oracle中的一個重要機制,在多個重要功能中起著“控制器”的作用。瞭解SCN的產生和實現方式,幫助DBA理解和處理恢復、DG、Streams複製的問題。

最後提一句,利用SCN機制,在Oracle10g、11g中又增加了一些很實用的功能——資料庫閃回、資料庫負載重現等。

發表於 @ 2009年09月24日 16:09:00


本文來自CSDN部落格,轉載請標明出處:http://blog.csdn.net/wh62592855/archive/2009/09/24/4589124.aspx

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

相關文章