Checkpoint和SCN的解析
很多人都把checkpoint的概念給複雜化了,其實checkpoint這個資料庫概念引入的真正意義就是用來減少在資料庫恢復過程中所花的時 間(instance recovery),那麼checkpoint是由誰來做的呢?我們都知道資料庫中有個CKPT程式,這是個可選程式,但是真正執行檢查點的任務並不是由 ckpt來完成的,而是ckpt在更新控制檔案和資料檔案頭的有關資訊後,通知DBWn程式,產生一個檢查點,在產生檢查點的時候,DBWn程式會將 buffer cache中的髒資料(當前online redo log對應的髒資料),寫入我們的資料檔案當中。這個時候如果資料庫此時崩潰(比如我們做個shutdown abort),那麼在進行例項恢復的時候就可以不需要當前online redo log的內容了,會很快就做完。因此ckpt程式只是個輔助程式,他的任務更多的是用來在系統做checkpoint的時候更新控制檔案和資料檔案頭中的 資訊。其實在oracle 8i的時候呢,ckpt的任務一般都是由lgwr程式來完成,到了8i以後,隨著CKPT程式的引入,lgwr的工作負擔就減輕了很多(commit的速 度加快了)
那麼如何來產生檢查點呢?
有三種方法,可以透過
1.alter system checkpoint
2.alter system switch logfile
3.DBWn程式寫出髒塊
SCN
在中理解為一個內部同步時鐘,是系統改變號的縮寫(system change number),在數 據庫中我們可以透過dbms_flashback包來查詢當前系統的改變號:select dbms_flashback.get_system_change_number from dual;一般來講SCN主要是用來標識資料庫所做的所有改變,這個SCN的改變是隻能前進,不能回退,除非我們打算重建庫,資料庫中的SCN永遠不會歸 0,一般來說SCN的前進觸發是由commit來進行的,除了這些據我觀察每隔3秒種系統也都會重新整理一次SCN.
需要注意的是:
1.CKPT一定是是在checkpoint發生的時候將資料庫當前的SCN更新入資料庫檔案頭和控制檔案當中,同時DBWn程式將buffer cache中的髒資料塊(dirty block)寫到資料檔案當中(這個髒資料也一定是當前online redo log保護的那一部分)。
2.同時CKPT程式還會在控制檔案當中記錄(redo block address)RBA,這個地址用來標誌恢復的時候需要從日誌中的那個位置開始。
在Oracle資料庫中和checkpoint相關的SCN總共有4個
1.System checkpoint SCN (存在於控制檔案)
在系統執行checkpoint後,Oracle會更新當前控制檔案中的System checkpoint SCN。
我們可以透過
select checkpoint_change# from v$database:
來檢視
2.Datafile checkpoint SCN (存在於控制檔案)
由於控制檔案中記錄了Oracle中各個資料庫檔案的位置和資訊,其中當然也包括了Datafile checkpoint SCN,因此在執行checkpoint的時候,Oracle還會去更新控制檔案中所記錄的各個資料檔案的datafile checkpoint SCN.
我們可以透過
select checkpoint_change# from v$datafile;
來檢視
.Start SCN (存在於各個資料檔案頭)
在執行checkpoint時,Oracle會更新存放在各個實際的資料檔案頭的Start SCN(注意絕對不會是控制檔案中),這個SCN存在的目的是用於檢查資料庫啟動過程中是否需要做media recovery(介質恢復)
我們可以透過
select checkpoint_change# from v$datafile_header;
4.End SCN(存在於控制檔案)
最後一類SCN,End SCN他也是記錄在控制檔案當中,每一個所記錄的資料檔案頭都有一個對應的End SCN,這個End SCN一定是存在於控制檔案當中。這個SCN存在的絕對意義主要是用來去驗證資料庫啟動過程中是否需要做instance recovery。我們可以透過
select name,last_change# from v$datafile
那麼其實在資料庫正常執行的情況下,對於read/write的online 資料檔案這個SCN號為#FFFFFF(NULL).
下面來聊一聊SCN號於資料庫的啟動
1.在資料庫的啟動過程中,當System Checkpoint SCN=Datafile Checkpoint SCN=Start SCN的時候,Oracle資料庫是可以正常啟動的,而不需要做任何的media recovery。而如果三者當中有一個不同的話,則需要做media recovery
2.那什麼時候需要做instance recovery呢?其實在正常open資料庫的時候,oracle會將記錄在控制檔案中的每一個資料檔案頭的End SCN都設定為#FFFFFF(NULL),那麼如果資料庫進行了正常關閉比如(shutdown or shutdown immediate)這個時候,系統會執行一個檢查點,這個檢查點會將控制檔案中記錄的各個資料檔案頭的End SCN更新為當前online資料檔案的各個資料檔案頭的Start SCN,也就是End SCN=Start SCN,如果再次啟動資料庫的時候發現二者相等,則直接開啟資料庫,並再次將End SCN設定為#FFFFFF(NULL),那麼如果資料庫是異常關閉,那麼checkpoint就不會執行,因此再次開啟資料庫的時候End SCN<>Start SCN這個時候就需要做例項恢復。
說了那麼多更新SCN操作什麼的,這個更新操作到底是由誰做的呢?其實剛才已經說過了,就是我們的CKPT程式,他不僅僅會更新SCN,而且還會通知DBWn做他的事情。
再說一下System Checkpoint SCN和Datafile Checkpoint SCN,這兩個SCN都是記錄在控制檔案當中的。但是這兩個SCN有什麼作用呢?
logzgh有段論述,我自己的想了一下,還是學習一下他的結論:
1.對只讀表空間,其資料檔案的Datafile Checkpoint SCN、Start SCN和END SCN號均相同。這三個SCN在表空間處於只讀期間都將被凍結。
2.如果控制檔案不是當前的控制檔案(其實就是說,想比當前redo log的SCN來講,控制檔案已經過時了),則System checkpoint SCN會小於Start SCN(Start SCN是來自實際的資料檔案頭,有比較依據)。記錄這些SCN號,可以區分控制檔案是否是當前的控制檔案。當有一個Start SCN(從當前各個線上資料檔案中獲得)號超過了System Checkpoit SCN號時,則說明控制檔案不是當前的控制檔案,因此在做recovery時需要採用using backup controlfile。這是為什麼需要記錄SystemCheckpoint SCN的原因之一。
當我們重建控制檔案的時候,重建方式分兩種(resetlogs 和 noresetlogs)
1.使用resetlogs選項時,System Checkpoint SCN為被歸為0,而其中記錄的各個資料檔案的Datafile Checkpoint SCN則來自於Start SCN(也就是說可能會從冷備份的資料檔案的資料檔案頭中獲取)。根據上述的描述,此時需要採用using backup controlfile做recovery. 因此情況是 System Checkpoint SCN=0 < Start SCN = Datafile Checkpoint SCN
2.使用noresetlogs選項時,有一個前提就是:一定要有online redo log的存在。否則就要使用resetlogs選項。這個時候控制檔案重建好時,其system checkpoint SCN=Datafile Checkpoint SCN=Lastest Checkpoint SCN in online redo log,我們可以看到Datafile Checkpoint SCN並沒有從Start SCN中讀取。而是讀取了最新的日誌檔案中的SCN作為自己的資料。此時重建的控制檔案在恢復中的作用跟最新的控制檔案類似,System Checkpoint SCN(已經讀取最新的redo log的checkpoint SCN資訊)可能會>Start SCN (因為資料檔案可能會從冷備份中恢復),恢復時就不需要加using backup controlfile子句了
關於backup controlfile的補充:backup controlfile只有備份時刻的archive log資訊,並沒有DB crash時刻的archive log資訊,所以並不會自動應用online redo log,而是提示找不到序號為Lastest Archive log sequence + 1 的archive log,儘管你可以手動指定online redo log來實現完全恢復,但因為一旦使用了using backup controlfile子句,Oracle就視為不完全恢復,必須open resetlogs! 實際上,假如你有舊的控制檔案又不想resetlogs,那很簡單,使用舊的控制檔案mount然後 backup to trace ,然後手工建立控制檔案,使用 reuse database ... noresetlogs .這樣就可以 recover database 自動恢復並open database 而不用 resetlogs 了
[@more@]lgwr在5種情況下寫檔案:commit;(保障資料不丟失)
3秒
超過log buffer 1/3
log buffer內容達到1M
log switch
發生檢查點:
log switch
log_checkpoint_interval(日誌塊數量,大小等同於作業系統塊數量):當這麼多日誌塊被寫入的時候發生檢查點
LOG_CHECKPOINT_TIMEOUT
fast_start_io_target(db_block_size數量,dirty buffers):
當這麼多資料塊被修改後發生檢查點
手工觸發
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/9907339/viewspace-1051764/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle SCN機制解析 (SCN, checkpoint檢查點) - finalOracle
- RedoLog Checkpoint 和 SCN關係
- 初學checkpoint and scn
- How to get SCN ,TIMESTAMP ,CHECKPOINT
- checkpoint時的SCN寫檔案動作
- SCN, checkpoint 及資料庫的恢復資料庫
- SCN的相關解析
- 【體系結構】SCN與checkpoint(檢查點)
- SCN、Checkpoint、例項恢復介質恢復理解
- SCN, Checkpoint 與 oracle資料庫恢復的關係(final)Oracle資料庫
- oracle mount_open_checkpoint(scn)啟動驗證測試Oracle
- Oracle SCN機制解析Oracle
- Oracle SCN機制解析(zt)Oracle
- ZT Oracle SCN機制解析Oracle
- 轉:Oracle SCN機制解析Oracle
- Oracle SCN機制解析刨細Oracle
- 轉載Oracle SCN機制解析Oracle
- MySQL中的redo log和checkpointMySql
- 資料檔案的SCN和資料塊的SCN有何區別
- ckeckpoint和SCN詳解
- Oracle log_checkpoint_interval和Oracle
- 關於SCN HEADROOM 和_external_scn_rejection_threshold_hours 的說明OOM
- Postgresql 的CheckpointSQL
- PostgreSQL DBA(64) - checkpoint_completion_target引數解析SQL
- oracle的SCNOracle
- Oracle資料庫的SCN轉換成時間和時間轉換成SCNOracle資料庫
- 非易失性WAL BUFFER實現機制解析:checkpoint改造
- SCN的機制
- Oracle中的SCNOracle
- Oracle中的checkpoint程式Oracle
- mysql checkpointMySql
- Postgres Checkpoint
- Oracle CheckpointOracle
- 【SCN】Oracle SCN 詳細介紹Oracle
- Oracle的DBMS_SCN修正以及SCN的auto-rollover新特性Oracle
- 有關 SCN 和 RESETLOG的一些資料
- 【SCN】Oracle檢查scn值指令碼Oracle指令碼
- 【SCN】Oracle推薦scn命令參考Oracle