Oracle 檢查點佇列與增量檢查點
從8i開始,Oracle增加了增量檢查點的概念,增量檢查點的主要宗旨就是定期的重新整理一部分髒塊。將髒塊一次重新整理完是不合理的,因為髒塊不斷產生,沒有窮盡。像完全檢查點那樣停止使用者所有的修改操作,將髒塊重新整理完再繼續,這絕對會極大的影響效能。所有增量檢查點的一次重新整理部分塊是髒塊問題的最好解決辦法。那麼,每次重新整理時,都重新整理那些塊呢?根據統計研究,根據塊變髒的順序,每次重新整理那些最早髒的塊,這種方式最為合理。為了實現這一點,Oracle在Buffer cache中又建立了一個連結串列,就是檢查點佇列。每個塊在它變髒時,會被連結到檢查點佇列的末尾。就好像排隊一樣,9:00來的人站在第一位,9:05來的人排第二位,以後每來一個人都站在隊伍的末尾,這個隊伍就是按來到的時間順序排列的一個佇列。檢查點佇列就是這樣,塊在變髒時會被鏈到末尾。因此檢查點佇列是按塊變髒的時間順序,將塊排成了一個佇列。
如上圖,檢查點佇列中的每一節點,都指向一個髒塊。檢查點佇列每個節點中的資訊其實非常少,就是記錄對應塊在Buffer cache中的地址,髒塊對應的重做記錄在日誌檔案中的位置,另外還有前一個節點、後一個節點的地址。檢查點佇列還有LRU、髒LRU,這些都是雙向連結串列。雙向連結串列就是在節點中記錄前、後兩個節點的地址。
檢查點佇列頭部的塊是最早變髒的,因此,Oracle會定期喚醒DBWn從檢查點佇列頭開始,沿著檢查點佇列的順序,重新整理髒塊。在重新整理髒塊的同時,仍可以不斷的有新的髒塊被連結到檢查點佇列的尾部。這個定期喚醒DBWn重新整理髒塊的操作,Oracle就稱為增量檢查點。
如上圖,1、2、3號節點所指向的髒塊已經被重新整理為乾淨塊。同時,又有兩個塊變髒,它們被連結到了檢查點佇列的末尾,它們是9號、10號節點。
檢查點佇列的頭,又被稱為檢查點位置,Checkpoint postion,這些名稱我們不必從字面上去理解。總之,檢查點位置就是檢查點佇列頭。檢查點佇列頭節點(也就是檢查點位置)的資訊,Oracle會頻繁的將它記錄到控制檔案中,而且會很頻繁的記錄。一般是每隔三秒,有一個專門的程式CKPT,會將檢查點位置記錄進控制檔案。
如上圖,當前的檢查點位置是檢查點佇列的1號節點。又一個三秒到了,CKPT程式啟動,將新的檢查點位置記入控制檔案:
新的檢查點位置是4號節點,它對應當前變髒時間最早的髒塊。1、2、3號節點已經從檢查點佇列中摘除了。因為它們對應的髒塊已經不髒了。一般來說,控制檔案中的檢查點位置之後的塊都是髒塊。但是有時也例外,因檢查點位置每三秒才會更新一次,就像上圖,1、2、3號節點對應的髒塊已經被重新整理過了,但是由於三秒間隔沒到,檢查點位置還是指向1號節點。只有當三秒到後,檢查點位置才會被更新到4號節點上。
關於檢查點佇列、檢查點位置我們先說到這裡,在全面的介紹什麼是增量檢查點之前,我們先說一下檢查點佇列的一個重要作用。
讓我們先來總結一下使用者修改塊時,Oracle內部都發生了什麼:
1.如果塊不在Buffer cache,將塊讀入Buffer cache
2.先生成重做記錄,並記入日誌快取,在使用者提交時寫到日誌檔案中
3.在Buffer cache中修改塊
4.在Buffer cache中設定塊的髒標誌位,標誌塊變成髒塊,同時在檢查點佇列末尾增加一個新節點,記錄這個新髒塊的資訊,資訊包括:髒塊在Buffer cache中的位置,在步驟2時生成的與此髒塊對應的重做記錄位置。
5.使用者提交後,將相應的重做記錄從重做快取寫入日誌檔案。
我現在將日誌補充到上面的圖中:
就像上圖,檢查點佇列的每個節點,都儲存有髒塊的地址和髒塊對應的重做記錄的編號。髒塊在Buffer cache中的位置是隨機的,使用者不一定修改那個塊。但重做記錄是順序生成的,就和檢查點佇列的排列順序一樣。因為,它們都是當塊被修改而變髒時產生的。塊A先被修改,塊A的重做記錄就排在前面,塊B後被修改,塊B對應的重做記錄會被排在塊A對應的重做記錄的後面。和它們在檢查點中的順序是一樣。每當資料庫因異外而當機,比如異常當機、斷電等等,Buffer cache中有許多髒塊沒來的及寫到磁碟上。以圖為例,比如說現在斷電了,現在磁碟上還有7個髒塊,它們裡面有使用者修改過的資料,Oracle已經將反饋資訊“你的修改完成”傳送給使用者,使用者也以為他們的修改完成了,將為一直儲存到資料庫中。但是,斷然的斷電,令這幾個髒塊中的資料丟失了,它們沒來得及寫到磁碟上。
Oracle如何解決這個問題呢?很簡單,當資料庫重新啟動時,Oracle只需從控制檔案中讀出檢查點位置,檢查點位置中記錄有重做記錄編號,根據此編號,Oracle可以很快的定位到日誌檔案中的重做記錄n,它讀出重做記錄n中的重做資料,將使用者的修改操作重現到資料庫。接著,Oracle讀取重做記錄n+1中的重做資料,重現使用者修改,這個過程將沿著日誌流的順序,一直進行下去,直擋最後一條重做記錄,在上圖的例子中,最後一條重做記錄是第n+6條。這個過程完成後,使用者所有的修改又都被重現了,一點都不會丟失。只要你的日誌檔案是完整,日誌流是完整的,就一點資訊都不會丟失。
有人可能會有一個問題,重做記錄在生成後,也是先被送進重做快取,再由重做快取寫往日誌檔案。這樣的機制下,一定會有某些重做記錄在沒來的及寫到日誌檔案中時,資料庫突然當機,而造成這些重做記錄丟失。這樣,這些重做記錄所對應的髒塊,將得不到。使用者還是會丟失一些資料。
這種情況的確會發生,但丟失的都是沒用的資訊。為什麼這麼說的。Oracle會在使用者每次發出提交命令時,將事務所修改髒塊對應的重做記錄寫進日誌檔案,只有當這個操作完成時,使用者才會收到“提交完成”,這樣的資訊,對於一個完整的事務,當使用者看到提交完成後,也就意味著所對應的重做記錄一定被寫到了日誌檔案中,即使發生異常當機,它也是絕對可以恢復。而當使用者沒有提交,或沒來得及提交,資料庫就崩潰了,那麼事務就是不完整的,這個事務必須被回滾,它根本用不著恢復。對於這樣不完整的事務,它對應的重做記錄有可能丟失,但這無所謂了,因為不完整的事務根本不需要恢復。也就是說,只有使用者的事務提交了,使用者的修改一定不會丟失。不過這還有一個前提,就是日誌檔案千萬不能損壞,DBA所要做的就是要保證日誌檔案不能損壞。DBA可以使用RAID1這樣的磁碟映象,或者多元日誌檔案,等等,這個我們在前面章節中已經講過了的。
我們上面所講到的這種恢復,是自動進行的,並且不需要DBA參與,它被稱之為例項恢復。
檢查點佇列與增量檢查點的作用我們已經說的差不多了,它們的主要目的就是讓DBWn沿檢查點佇列的順序重新整理髒塊。還有,就是例項恢復。
下面我們來討論一下增量檢查點的設定。
這裡所說的檢查點設定,主要指增量檢查點頻繁的設定。注意增量檢查點只是一個名詞,不必按字面的意義去理解它。增量檢查點發生時,Oracle會喚醒DBWn沿著檢查點佇列寫髒塊,這就是增量檢查點。那麼到底多長時間一次發生一次增量檢查點呢?這個增量檢查點的頻率是非常重要的,它基本上控制著DBWn多長時間去重新整理一次髒塊。DBWn活動的太頻繁,會影響資料庫的整體效能,如果DBWn活動太不頻繁,又會使髒塊擠壓太多,這同樣也會影響效能。而且,如果出現異常崩潰,需要例項恢復,髒塊越多,例項恢復越慢。。在9i之前DBA主要靠間隔時間等方式來設定增量檢查點的頻率,比如可以讓Oracle每10分鐘發生一次增量檢查點。如果這個數字設定不合適,對資料庫效能的影響是很大的。而且有可能造成例項恢復時間過長。在9i之後,特別是到了中,檢查點已經相當的智慧化了,很少會成為I/O問題的原兇。9i中設定fast_start_mttr_target引數為你所期望的例項恢復時間,系統將自動控制增量檢查點的頻率。比如,你希望例項恢復可以在5分鐘內完成,你可以將此引數設定為300,也就是300稱。
如果此引數設定的值超出了硬體實際的限制,比如你將它設定為60,你期望無論在任何情況下,資料庫都可以在1分鐘內完成例項恢復,但根據資料庫的髒塊生成速度、儲存裝置的寫效能,1分鐘內根本無法完成例項恢復。這時候Oracle會自動設定合適的fast_start_mttr_target引數值,我們可以在引數檔案中看到修正後的引數值,也可以在V$instance_recovery檢視中的Target_mttr列中看到實際的值。例如:
(舉個例子)
我們不能將這個值設定的太小,因為例項恢復必競只是偶然現象。如果為了讓例項恢復儘快完成,而設定fast_start_mttr_target為很小的值,那麼DBWn將活動的很頻繁,這會造成效能問題的。為了避免使用者設定不合理的增量檢查點頻率,在10G中,如果將fast_start_mttr_target設定為0,Oracle將根據產生髒塊的速度、存貯硬體的效能自動調節檢查點的頻率,儘量使檢查點頻率不成為I/O問題的原兇。
檢查點的主要任務就是催促DBWn重新整理髒塊,如果DBWn重新整理髒塊時的等待事件太多,就說明髒塊太多、儲存裝置的寫速度太慢,或者就是增量檢查點的頻率太高了,或太低了。DBWn寫髒塊的等待事件是Db file parallel write。如果你的增量檢查點頻率很低,你發現了此事件,在排除了儲存裝置寫效能的問題後,你應該將增量檢查點頻率設定的高一些。反之,如果你的增量檢查點頻率本身很高,出現了Db file parallel write事件,這說明檢查點頻率太高了。
除它之外,還有一個和DBWn、增量檢查眯有關的等待事件,它是Write complete waits事件,當前臺程式要修改DBWn正要成批寫的塊中的若干個塊時,就會有此等待事件,這個事件是前臺程式再等待DBWn寫完成。這個等待事太多,說明了儲存裝置寫效能有問題,或者增量檢查點太頻率了。
我們可以V$instance_recovery中看到有關檢查點的很多資訊:
Estimated_mttr列如果太大,說明檢查點不夠頻繁,同時也說明髒塊產生的太多。同時在V$sysstat資料檢視中,還有兩個資料background checkpoints started、background checkpoints completed,前面的一個是後臺程式檢查點開始次數,後一個是後臺程式檢查點完成次數。後臺程式檢查點的意義,其實就是增量檢查點。只有增量檢查點是由後臺程式觸發的。如果你用Alter system checkpoing命令讓系統完成完全檢查點,這叫做前臺檢查點與增量檢查點無關,是不會被記入這兩個資料了。如果這兩個值經常相差一些,比如檢查點的開始次數比完成次數大的不至1,這說明有太多次檢查點開始,但沒有及時完成。這說明檢查點太頻繁或檢查點完成的太慢。
(舉例,大量的產生髒塊、日誌檔案比較小5MB,日誌檔案頻率的切換而觸發檢查點,同時檢視一下等待事件)
檢查點的問題大多數情況下其實都是DBWn寫I/O的問題, DBWn寫髒塊的等待事件是Db file parallel write,還有Write complete waits等待事件,是當前臺程式要修改DBWn正要成批寫的塊中的若干個塊時,就會有此等待事件,這個事件是前臺程式再等待DBWn寫完成。這個等待事太多,也說明了DBWn有問題。
注意,對於資料檔案的I/O問題,除了等待事件外,我們還可以用上幾節講過了V$filestat檢視幫助確定問題。)
轉自:http://space.itpub.net/?uid-16400082-action-viewspace-itemid-741358
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/21601207/viewspace-741798/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- OCP知識點講解 之 檢查點佇列與增量檢查點佇列
- Oracle完全檢查點和增量檢查點詳解Oracle
- 全域性檢查點和增量檢查點
- ORACLE增量檢查點,LRBA,BWROracle
- 全域性檢查點和增量檢查點(zt)
- oracle ckpt檢查點型別(增量及常規完全檢查點)checkpointOracle型別
- 29_檢查點佇列(checkpoint queue)佇列
- 【TUNE_ORACLE】Oracle檢查點(三)增量檢查點四個關鍵引數介紹Oracle
- 【效能優化】增量檢查點優化
- 【TUNE_ORACLE】Oracle檢查點(二)檢查點效能Oracle
- 增量檢查點(incremental checkpoint)的解疑REM
- oracle checkpoint檢查點Oracle
- 【TUNE_ORACLE】Oracle檢查點(一)檢查點(Checkpoint)概念介紹Oracle
- 對於增量檢查點工作原理的理解
- 【TUNE_ORACLE】Oracle檢查點(五)建立並利用Statspack定位檢查點故障Oracle
- Oracle 檢查點涉及的SCNOracle
- CUUG ORACLE檢查點講解Oracle
- [zt]Oracle檢查點ckpt (checkpoint)Oracle
- oracle checkpoint檢查點系列一Oracle
- 檢查點機制與scn
- Oracle 同步、非同步完全檢查點Oracle非同步
- 【CHECKPOINT】Oracle檢查點優化與故障處理Oracle優化
- ORACLE buffer cache 原理 --檢查點佇列連結串列(參照學習:oracle核心技術揭秘)Oracle佇列
- 關於oracle的ckpt(檢查點程式)Oracle
- oracle檢查點的相關知識Oracle
- 改變ogg抽取程式檢查點檔案中的檢查點
- 管理oracle日誌之調整檢查點Oracle
- 【體系結構】SCN與checkpoint(檢查點)
- MySQL InnoDB檢查點機制MySql
- 深入淺出-檢查點scn
- 【TUNE_ORACLE】Oracle檢查點(四)檢查點對redo日誌的影響和redo日誌大小設定建議Oracle
- SQLServer的檢查點、redo和undoSQLServer
- postgresql 檢查點調整 checkpoint 轉SQL
- MySQL什麼是InnoDB檢查點?MySql
- zt_checkpoint檢查點解密(轉)解密
- 在RFT中新增clipboard檢查點
- object checkpoint物件檢查點小記Object物件
- Oracle SCN機制解析 (SCN, checkpoint檢查點) - finalOracle