2006年05月15日

分享看到的ckpt的資料

最近正在讀dba2的資料,讀到ckpt的東西,上網再查了一些相關的資料,找到一個blog裏面寫的資料很不錯,轉貼一下
網址:http://spaces.msn.com/roujiaweize/blog/cns!9745F14B4AEB3B72!328.entry

對SCN和CKPT的一點理解

scn (system change number,系統改變號),它提供 oracle 的內部時鐘機制,定義數據庫在某個確切時刻提交的版本,其作用是維護數據庫的數據的一致性。


ckpt (checkpoint,檢查點),它是一個數據庫事件,它將已修改的數據從高速緩存刷新寫入磁盤,並更新控制文件和數據文件。在一個檢查點之後,重做日誌文件中的重做記錄對於崩潰/實例恢復不再有用。


控制文件為每個數據文件保存有一個:checkpoint scn, stop scn,只有數據文件中有 stop scn
select name,checkpoint_change#,last_change# from v$datafile;


系統檢查點 scn (這個看別人寫的,不懂)
select checkpoint_change# from v$database;
當一個檢查點動作完成後,oracle 就把系統檢查點的 scn 存儲到控制文件中。


數據文件頭:數據庫 checkpoint scn
select name,checkpoint_change# from v$datafile_header;(這個是數據庫正常打開時從控制文件中查的,因為數據庫正常打開時這兩個相等,數據文件頭真正的 scn,oracle 自己讀文件頭)


控制文件為每個 redo 線程保存有一個:checkpoint scn
select thread#,checkpoint_change# from v$thread;


當一個檢查點動作完成後,oracle 更新控制文件中的這些 checkpoint scn (控制文件中一個,所有數據文件頭在控制文件中的存儲,redo 在控制文件中的信息),以及數據文件頭中的 checkpoint scn。所以可以理解,上面這些值都是從控制文件中取出來的。


當數據庫用 normal 或者 immediate 選項關閉時,執行檢查點,更新控制文件中數據文件的 stop scn,等於數據文件頭中的 checkpoint scn。


下次啟動數據庫時,oracle 要進行兩次檢查。第一次看數據文件頭中的 checkpoint scn 與控制文件中數據文件的 checkpoint scn。如果相等,進行第二次檢查,檢查數據文件頭中的 checkpoint scn 與控制文件中數據文件的 stop scn。如果相等,不需要對這個文件恢復。每個數據文件都做這樣的檢查,然後打開數據庫,將每個 stop scn 重新置為無窮大。


如果用 abort 關閉數據庫,則不執行檢查點處理,控制文件中數據文件的 stop scn 仍為無窮大。


下次啟動時做兩次檢查。如第一次相等,再比較第二個。這時,數據文件頭中的 checkpoint scn 一定是小於控制文件中數據文件的 stop scn 的,需要進行崩潰/實例恢復,進行前滾和回滾。


如果用備份代替了數據文件再啟動數據庫,這時做第一次檢查時,數據文件頭中的 checkpoint scn 一定小於控制文件中數據文件的 checkpoint scn;或者用備份的控制文件代替了控制文件再啟動數據庫,這時數據文件頭中的 checkpoint scn 一定大於控制文件中數據文件的 checkpoint scn。只要這兩個不相等,就需要介質恢復。


還有一種情況,如果控制文件和數據文件都是備份的,而這兩個 checkpoint scn 正好相等,第一次比較通過,那麼再看第二次比較了。其實這個時候在第一次比較之前,會先比較控制文件中 redo 線程的 checkpoint scn 的和 online log 的 scn,如果相等,繼續,如果不相等(小於),提示控制文件是舊的需要介質恢復。


Posted by my_work at 樂多Roodo! │23:49 │回應(0)引用(0)DB
樂多分類:網路/3C 共同主題:Oracle 工具:編輯本文
Ads by Roodo! 

引用URL

http://cgi.blog.roodo.com/trackback/1617211