SQL Server CheckPoint的幾個誤區

    有關CheckPoint的概念對大多數SQL Server開發或DBA人員都不陌生。可是包括我本身在內,你們對於CheckPoint都或多或少存在某些誤區,最近和高文佳同窗(感謝高同窗的探討)關於該處進行過一些探討,整理出來幾個誤區。html

 

1.CheckPoint實例級別,而不是數據庫級別數據庫

    CheckPoint的時間雖然能夠在實例級別進行設置,但CheckPoint的過程是以數據庫爲粒度。從CheckPoint在Redo和Undo的做用來看,CheckPoint是爲了優化IO和減小Recovery時間,而Recovery是須要日誌支持,所以日誌是數據庫級別的概念,所以能夠知道CheckPoint是以數據庫爲單位進行的。服務器

    咱們來作一個簡單的實驗,分別設置兩個鏈接A和B,A和B使用不一樣的數據庫並修改數據產生髒數據,在A上進行了CheckPoint後,A鏈接的數據庫髒頁所有寫入磁盤,而B鏈接產生的髒頁依然駐留在Buffer中,所以能夠肯定CheckPoint是數據庫級別而不是服務器級別。優化

1

圖1.CheckPoint是數據庫級別的日誌

 

2.因爲日誌增加致使的自動CheckPoint會將全部數據庫的髒頁寫入磁盤htm

    事實證實,這也是錯誤的,自動CheckPoint僅僅會將某些髒頁或日誌過多的數據庫髒頁寫入磁盤。能夠一樣經過圖1的例子進行。blog

 

3.CheckPoint僅僅將已經提交的髒數據寫入磁盤遊戲

    這一樣是錯誤的,不管事務是否提交,所產生的髒數據都會被CheckPoint寫入磁盤。例證能夠參看個人博文:再談SQL Server中日誌的的做用中有關CheckPoint的實驗。事務

 

4.若是一個實例上有多個數據庫,則CheckPoint是並行的內存

    錯誤,經過3502跟蹤標記來看,CheckPoint是串行的,也就是一個數據庫CheckPoint完了纔會繼續下一個。如圖2所示。

    2

    圖2.串行CheckPoint

    咱們能夠注意到,CheckPoint使用的是同一個Spid。

 

5.將恢復間隔設置爲1分鐘,意味着每1分鐘會對全部的數據庫作一次CheckPoint

    錯誤。將恢復間隔設置爲1分鐘不能想成創建一個Agent,每分鐘寫一個CheckPoint命令,這是兩碼事。這只是意味着每分鐘去檢查一次是否須要作CheckPoint,若是期間積累的日誌量足夠,纔會對積累足夠日誌量的數據庫去作CheckPoint。即便中間積累了巨量的日誌,不到1分鐘也不會作CheckPoint。

 

6.SQL Server一些Internal CheckPoint時,好比說關閉數據庫,會對全部數據庫作CheckPoint(高同窗補充)

    這條是正確的微笑,由於SQL Server此時須要保證全部的數據寫入磁盤,從而保證了數據庫一致性,若是沒有活動的事務,那麼這種關閉方式叫作Clean ShutDown,這意味着該數據自己一致,所以即便沒有日誌,MDF也能夠附加。

 

7.CheckPoint是一個時間點(高同窗補充)

    錯誤,這是打遊戲存檔的想法,從哪存進度,從哪取進度,是某個時間點。在SQL Server中,CheckPoint是一個完整的過程,這個過程的耗時取決於髒數據的大小,更多資料,請參閱MSDN:http://technet.microsoft.com/zh-cn/library/ms188748.aspx

 

8.引起自動CheckPoint的條件是內存中髒頁的多少(高同窗補充)

    錯誤,CheckPoint的觸發條件,是在CheckPoint期間生成日誌的大小。所以,你們見過內存中有不少髒頁,卻不引起CheckPoint的狀況。

 

9.當數據所在磁盤壓力大時,經過checkpoint pages/ sec 計數器來觀察寫入磁盤的髒頁(高同窗補充)

    部分正確。實際上,髒頁被寫入磁盤一共有3中方式,CheckPoint僅僅是其中一種,咱們還須要將Lazy writes/sec考慮在內。

 

10.TempDB上永遠不會寫入髒頁

    錯誤。TempdB是一個特殊的數據庫,永遠只能簡單恢復模式,若是您在TempDB上形成大量髒頁,自動CheckPoint時會發現的確不會有任何髒頁寫入操做,但手動CheckPoint時,髒頁依然會被寫入磁盤。

 

 

   最後,再次感謝高文佳同窗和我探討。

相關文章
相關標籤/搜索