Oracle SCN機制———在備份與恢復中
SCN(System Chang Number)作為oracle中的一個重要機制,在資料恢復、Data Guard、Streams複製RAC節點間的同步等各個功能中起著重要作用。理解SCN的運作機制,可以幫助你更加深入地瞭解上述功能
在理解SCN之前,我們先看下oracle事務中的資料變化是如何寫入資料檔案的:
1、 事務開始;
2、在buffer cache中找到需要的資料塊,如果沒有找到,則從資料檔案中載buffercache中;
3、 事務修改buffer cache的資料塊,該資料被標識為“髒資料”,並被寫入log buffer中;
4、 事務提交,LGWR程式將log buffer中的“髒資料”寫入redo log file中;
5、 當發生checkpoint,CKPT程式更新所有資料檔案的檔案頭中的資訊,DBWn程式則負責將Buffer Cache中的髒資料寫入到資料檔案中。
經過上述5個步驟,事務中的資料變化最終被寫入到資料檔案中。但是,一旦在上述中間環節時,資料庫意外當機了,在重新啟動時如何知道哪些資料已經寫入資料檔案、哪些沒有寫呢(同樣,在DG、streams中也存在類似疑問:redo log中哪些是上一次同步已經複製過的資料、哪些沒有)?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。
當資料庫啟動時,Oracle先檢查控制檔案中的每個Datafile Checkpoint SCN和資料檔案中的Start SCN是否相同,再檢查每個Datafile Checkpoint SCN和Stop SCN是否相同。如果發現有不同,就從Redo Log中找到丟失的SCN,重新寫入資料檔案中進行恢復。具體的資料恢復過程這裡就不再贅述。
SCN作為Oracle中的一個重要機制,在多個重要功能中起著“控制器”的作用。瞭解SCN的產生和實現方式,幫助DBA理解和處理恢復、DG、Streams複製的問題。
最後提一句,利用SCN機制,在Oracle10g、11g中又增加了一些很實用的功能——資料庫閃回、資料庫負載重現等。
系統檢查點scn(v$database(checkpoint_change#))
資料檔案檢查點(v$datafile(checkpoint_change#))
資料檔案終止scn(v$datafile(last_change#))
資料檔案中存放的檢查點
啟動scn (v$datafile_header(checkpoint_change#)
1、系統檢查點scn
當一個檢查點動作完成之後,Oracle就把系統檢查點的SCN儲存到控制檔案中。
select checkpoint_change# from v$database
2、資料檔案檢查點scn
當一個檢查點動作完成之後,Oracle就把每個資料檔案的scn單獨存放在控制檔案
中。
select name,checkpoint_change# from v$datafile
3、啟動scn
Oracle把這個檢查點的scn儲存在每個資料檔案的檔案頭中,這個值稱為啟動scn,
因為它用於在資料庫例項啟動時,檢查是否需要執行資料庫恢復。
select name,checkpoint_change# from v$datafile_header
4、終止scn
每個資料檔案的終止scn都儲存在控制檔案中。
select name,last_change# from v$datafile
在正常的資料庫操作過程中,所有正處於聯機讀寫模式下的資料檔案的終止scn都為null.
5、在資料庫執行期間的scn值
在資料庫開啟並執行之後,控制檔案中的系統檢查點、控制檔案中的資料檔案檢查點scn
和每個資料檔案頭中的啟動scn都是相同的。控制檔案中的每個資料檔案的終止scn都為null.
在安全關閉資料庫的過程中,系統會執行一個檢查點動作,這時所有資料檔案的終止scn
都會設定成資料檔案頭中的那個啟動scn的值。在資料庫重新啟動的時候,
Oracle將檔案頭中的那個啟動scn與資料庫檔案檢查點scn進行比較,
如果這兩個值相互匹配,oracle接下來還要比較資料檔案頭中的啟動scn和控制檔案
中資料檔案的終止scn。如果這兩個值也一致,就意味著所有資料塊多已經提交,所有
對資料庫的修改都沒有在關閉資料庫的過程中丟失,因此這次啟動資料庫的過程
也不需要任何恢復操作,此時資料庫就可以開啟了。當所有的資料庫都開啟之後,
儲存在控制檔案中的資料檔案終止scn的值再次被更改為null,
這表示資料檔案已經開啟並能夠正常使用了。
當前的就是最新的,當前的在不斷變化,而存放在那些檔案中的是在系統ckpt執行同步操作時寫入的當時的scn,就像你在看書,看一會你就加個標記,你當前在看得那頁就是當前scn,而你在書上加標記的頁就是當時的scn
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10697500/viewspace-401647/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- oracle scn與備份恢復backup recovery(一)Oracle
- Oracle備份恢復之熱備份恢復及異機恢復Oracle
- 【轉載】SCN 備份與恢復的關係
- Oracle 備份 與 恢復 概述Oracle
- Oracle RAC備份與恢復Oracle
- Oracle備份與恢復 (zt)Oracle
- Oracle備份與恢復案例Oracle
- Oracle備份與恢復(轉)Oracle
- 【備份恢復】Oracle 資料備份與恢復微實踐Oracle
- oracle rac 在asm下的備份與恢復OracleASM
- 從dataguard備份的恢復機制
- oracle冷備份、恢復和異機恢復Oracle
- Oracle 9i的備份和恢復機制(轉)Oracle
- Oracle 聯機備份 離線備份 物理備份 恢復Oracle
- 備份與恢復oracle_homeOracle
- Oracle OCR的備份與恢復Oracle
- Oracle 備份與恢復(一):概念Oracle
- oracle備份與恢復雜記Oracle
- Oracle備份與恢復入門Oracle
- Oracle備份與恢復案例 (zt)Oracle
- 我對備份與恢復的內部機制的理解
- Oracle 12c 備份與恢復Oracle
- oracle備份與恢復測試(五)Oracle
- Oracle備份與恢復總結[轉]Oracle
- ORACLE之常用FAQ:備份與恢復Oracle
- ORACLE 備份與恢復之 思路整理Oracle
- Oracle資料庫備份與恢復之三:OS備份/使用者管理的備份與恢復Oracle資料庫
- Oracle備份與恢復系列 (二)停機一致性備份Oracle
- 備份與恢復:polardb資料庫備份與恢復資料庫
- 備份與恢復--從備份的歸檔日誌中恢復資料
- ORACLE 恢復中SCN的應用Oracle
- Oracle 備份恢復概念Oracle
- oracle備份恢復PPTOracle
- Oracle 備份和恢復Oracle
- ORACLE備份&恢復案例Oracle
- MySQL備份與恢復——基於Xtrabackup物理備份恢復MySql
- 備份與恢復--利用備份的控制檔案恢復
- 備份與恢復系列 十一 控制檔案的備份與恢復