SQL Server CheckPoint的几个误区
生活随笔
收集整理的這篇文章主要介紹了
SQL Server CheckPoint的几个误区
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
有關(guān)CheckPoint的概念對(duì)大多數(shù)SQL Server開(kāi)發(fā)或DBA人員都不陌生。但是包括我自己在內(nèi),大家對(duì)于CheckPoint都或多或少存在某些誤區(qū),最近和高文佳同學(xué)(感謝高同學(xué)的探討)關(guān)于該處進(jìn)行過(guò)一些探討,整理出來(lái)幾個(gè)誤區(qū)。
1.CheckPoint實(shí)例級(jí)別,而不是數(shù)據(jù)庫(kù)級(jí)別
CheckPoint的時(shí)間雖然可以在實(shí)例級(jí)別進(jìn)行設(shè)置,但CheckPoint的過(guò)程是以數(shù)據(jù)庫(kù)為粒度。從CheckPoint在Redo和Undo的作用來(lái)看,CheckPoint是為了優(yōu)化IO和減少Recovery時(shí)間,而Recovery是需要日志支持,因此日志是數(shù)據(jù)庫(kù)級(jí)別的概念,因此可以知道CheckPoint是以數(shù)據(jù)庫(kù)為單位進(jìn)行的。
我們來(lái)做一個(gè)簡(jiǎn)單的實(shí)驗(yàn),分別設(shè)置兩個(gè)連接A和B,A和B使用不同的數(shù)據(jù)庫(kù)并修改數(shù)據(jù)產(chǎn)生臟數(shù)據(jù),在A上進(jìn)行了CheckPoint后,A連接的數(shù)據(jù)庫(kù)臟頁(yè)全部寫(xiě)入磁盤(pán),而B(niǎo)連接產(chǎn)生的臟頁(yè)依然駐留在Buffer中,因此可以確定CheckPoint是數(shù)據(jù)庫(kù)級(jí)別而不是服務(wù)器級(jí)別。
1
圖1.CheckPoint是數(shù)據(jù)庫(kù)級(jí)別的
2.由于日志增長(zhǎng)導(dǎo)致的自動(dòng)CheckPoint會(huì)將所有數(shù)據(jù)庫(kù)的臟頁(yè)寫(xiě)入磁盤(pán)
事實(shí)證明,這也是錯(cuò)誤的,自動(dòng)CheckPoint僅僅會(huì)將某些臟頁(yè)或日志過(guò)多的數(shù)據(jù)庫(kù)臟頁(yè)寫(xiě)入磁盤(pán)。可以同樣通過(guò)圖1的例子進(jìn)行。
3.CheckPoint僅僅將已經(jīng)提交的臟數(shù)據(jù)寫(xiě)入磁盤(pán)
這同樣是錯(cuò)誤的,無(wú)論事務(wù)是否提交,所產(chǎn)生的臟數(shù)據(jù)都會(huì)被CheckPoint寫(xiě)入磁盤(pán)。例證可以參看我的博文:再談SQL Server中日志的的作用中有關(guān)CheckPoint的實(shí)驗(yàn)。
4.如果一個(gè)實(shí)例上有多個(gè)數(shù)據(jù)庫(kù),則CheckPoint是并行的
錯(cuò)誤,通過(guò)3502跟蹤標(biāo)記來(lái)看,CheckPoint是串行的,也就是一個(gè)數(shù)據(jù)庫(kù)CheckPoint完了才會(huì)繼續(xù)下一個(gè)。如圖2所示。
2
圖2.串行CheckPoint
我們可以注意到,CheckPoint使用的是同一個(gè)Spid。
5.將恢復(fù)間隔設(shè)置為1分鐘,意味著每1分鐘會(huì)對(duì)所有的數(shù)據(jù)庫(kù)做一次CheckPoint
錯(cuò)誤。將恢復(fù)間隔設(shè)置為1分鐘不能想成建立一個(gè)Agent,每分鐘寫(xiě)一個(gè)CheckPoint命令,這是兩碼事。這只是意味著每分鐘去檢查一次是否需要做CheckPoint,如果期間積累的日志量足夠,才會(huì)對(duì)積累足夠日志量的數(shù)據(jù)庫(kù)去做CheckPoint。即使中間積累了巨量的日志,不到1分鐘也不會(huì)做CheckPoint。
6.SQL Server一些Internal CheckPoint時(shí),比如說(shuō)關(guān)閉數(shù)據(jù)庫(kù),會(huì)對(duì)所有數(shù)據(jù)庫(kù)做CheckPoint(高同學(xué)補(bǔ)充)
這條是正確的微笑,因?yàn)镾QL Server此時(shí)需要保證所有的數(shù)據(jù)寫(xiě)入磁盤(pán),從而保證了數(shù)據(jù)庫(kù)一致性,如果沒(méi)有活動(dòng)的事務(wù),那么這種關(guān)閉方式叫做Clean ShutDown,這意味著該數(shù)據(jù)本身一致,因此即使沒(méi)有日志,MDF也可以附加。
7.CheckPoint是一個(gè)時(shí)間點(diǎn)(高同學(xué)補(bǔ)充)
錯(cuò)誤,這是打游戲存檔的想法,從哪存進(jìn)度,從哪取進(jìn)度,是某個(gè)時(shí)間點(diǎn)。在SQL Server中,CheckPoint是一個(gè)完整的過(guò)程,這個(gè)過(guò)程的耗時(shí)取決于臟數(shù)據(jù)的大小,更多資料,請(qǐng)參閱MSDN:http://technet.microsoft.com/zh-cn/library/ms188748.aspx
8.引發(fā)自動(dòng)CheckPoint的條件是內(nèi)存中臟頁(yè)的多少(高同學(xué)補(bǔ)充)
錯(cuò)誤,CheckPoint的觸發(fā)條件,是在CheckPoint期間生成日志的大小。因此,大家見(jiàn)過(guò)內(nèi)存中有很多臟頁(yè),卻不引發(fā)CheckPoint的情況。
9.當(dāng)數(shù)據(jù)所在磁盤(pán)壓力大時(shí),通過(guò)checkpoint pages/ sec 計(jì)數(shù)器來(lái)觀察寫(xiě)入磁盤(pán)的臟頁(yè)(高同學(xué)補(bǔ)充)
部分正確。實(shí)際上,臟頁(yè)被寫(xiě)入磁盤(pán)一共有3中方式,CheckPoint僅僅是其中一種,我們還需要將Lazy writes/sec考慮在內(nèi)。
10.TempDB上永遠(yuǎn)不會(huì)寫(xiě)入臟頁(yè)
錯(cuò)誤。TempdB是一個(gè)特殊的數(shù)據(jù)庫(kù),永遠(yuǎn)只能簡(jiǎn)單恢復(fù)模式,如果您在TempDB上造成大量臟頁(yè),自動(dòng)CheckPoint時(shí)會(huì)發(fā)現(xiàn)的確不會(huì)有任何臟頁(yè)寫(xiě)入操作,但手動(dòng)CheckPoint時(shí),臟頁(yè)依然會(huì)被寫(xiě)入磁盤(pán)。
最后,再次感謝高文佳同學(xué)和我探討。
本文轉(zhuǎn)自CareySon博客園博客,原文鏈接:http://www.cnblogs.com/CareySon/p/3315041.html如需轉(zhuǎn)載請(qǐng)自行聯(lián)系原作者
1.CheckPoint實(shí)例級(jí)別,而不是數(shù)據(jù)庫(kù)級(jí)別
CheckPoint的時(shí)間雖然可以在實(shí)例級(jí)別進(jìn)行設(shè)置,但CheckPoint的過(guò)程是以數(shù)據(jù)庫(kù)為粒度。從CheckPoint在Redo和Undo的作用來(lái)看,CheckPoint是為了優(yōu)化IO和減少Recovery時(shí)間,而Recovery是需要日志支持,因此日志是數(shù)據(jù)庫(kù)級(jí)別的概念,因此可以知道CheckPoint是以數(shù)據(jù)庫(kù)為單位進(jìn)行的。
我們來(lái)做一個(gè)簡(jiǎn)單的實(shí)驗(yàn),分別設(shè)置兩個(gè)連接A和B,A和B使用不同的數(shù)據(jù)庫(kù)并修改數(shù)據(jù)產(chǎn)生臟數(shù)據(jù),在A上進(jìn)行了CheckPoint后,A連接的數(shù)據(jù)庫(kù)臟頁(yè)全部寫(xiě)入磁盤(pán),而B(niǎo)連接產(chǎn)生的臟頁(yè)依然駐留在Buffer中,因此可以確定CheckPoint是數(shù)據(jù)庫(kù)級(jí)別而不是服務(wù)器級(jí)別。
1
圖1.CheckPoint是數(shù)據(jù)庫(kù)級(jí)別的
2.由于日志增長(zhǎng)導(dǎo)致的自動(dòng)CheckPoint會(huì)將所有數(shù)據(jù)庫(kù)的臟頁(yè)寫(xiě)入磁盤(pán)
事實(shí)證明,這也是錯(cuò)誤的,自動(dòng)CheckPoint僅僅會(huì)將某些臟頁(yè)或日志過(guò)多的數(shù)據(jù)庫(kù)臟頁(yè)寫(xiě)入磁盤(pán)。可以同樣通過(guò)圖1的例子進(jìn)行。
3.CheckPoint僅僅將已經(jīng)提交的臟數(shù)據(jù)寫(xiě)入磁盤(pán)
這同樣是錯(cuò)誤的,無(wú)論事務(wù)是否提交,所產(chǎn)生的臟數(shù)據(jù)都會(huì)被CheckPoint寫(xiě)入磁盤(pán)。例證可以參看我的博文:再談SQL Server中日志的的作用中有關(guān)CheckPoint的實(shí)驗(yàn)。
4.如果一個(gè)實(shí)例上有多個(gè)數(shù)據(jù)庫(kù),則CheckPoint是并行的
錯(cuò)誤,通過(guò)3502跟蹤標(biāo)記來(lái)看,CheckPoint是串行的,也就是一個(gè)數(shù)據(jù)庫(kù)CheckPoint完了才會(huì)繼續(xù)下一個(gè)。如圖2所示。
2
圖2.串行CheckPoint
我們可以注意到,CheckPoint使用的是同一個(gè)Spid。
5.將恢復(fù)間隔設(shè)置為1分鐘,意味著每1分鐘會(huì)對(duì)所有的數(shù)據(jù)庫(kù)做一次CheckPoint
錯(cuò)誤。將恢復(fù)間隔設(shè)置為1分鐘不能想成建立一個(gè)Agent,每分鐘寫(xiě)一個(gè)CheckPoint命令,這是兩碼事。這只是意味著每分鐘去檢查一次是否需要做CheckPoint,如果期間積累的日志量足夠,才會(huì)對(duì)積累足夠日志量的數(shù)據(jù)庫(kù)去做CheckPoint。即使中間積累了巨量的日志,不到1分鐘也不會(huì)做CheckPoint。
6.SQL Server一些Internal CheckPoint時(shí),比如說(shuō)關(guān)閉數(shù)據(jù)庫(kù),會(huì)對(duì)所有數(shù)據(jù)庫(kù)做CheckPoint(高同學(xué)補(bǔ)充)
這條是正確的微笑,因?yàn)镾QL Server此時(shí)需要保證所有的數(shù)據(jù)寫(xiě)入磁盤(pán),從而保證了數(shù)據(jù)庫(kù)一致性,如果沒(méi)有活動(dòng)的事務(wù),那么這種關(guān)閉方式叫做Clean ShutDown,這意味著該數(shù)據(jù)本身一致,因此即使沒(méi)有日志,MDF也可以附加。
7.CheckPoint是一個(gè)時(shí)間點(diǎn)(高同學(xué)補(bǔ)充)
錯(cuò)誤,這是打游戲存檔的想法,從哪存進(jìn)度,從哪取進(jìn)度,是某個(gè)時(shí)間點(diǎn)。在SQL Server中,CheckPoint是一個(gè)完整的過(guò)程,這個(gè)過(guò)程的耗時(shí)取決于臟數(shù)據(jù)的大小,更多資料,請(qǐng)參閱MSDN:http://technet.microsoft.com/zh-cn/library/ms188748.aspx
8.引發(fā)自動(dòng)CheckPoint的條件是內(nèi)存中臟頁(yè)的多少(高同學(xué)補(bǔ)充)
錯(cuò)誤,CheckPoint的觸發(fā)條件,是在CheckPoint期間生成日志的大小。因此,大家見(jiàn)過(guò)內(nèi)存中有很多臟頁(yè),卻不引發(fā)CheckPoint的情況。
9.當(dāng)數(shù)據(jù)所在磁盤(pán)壓力大時(shí),通過(guò)checkpoint pages/ sec 計(jì)數(shù)器來(lái)觀察寫(xiě)入磁盤(pán)的臟頁(yè)(高同學(xué)補(bǔ)充)
部分正確。實(shí)際上,臟頁(yè)被寫(xiě)入磁盤(pán)一共有3中方式,CheckPoint僅僅是其中一種,我們還需要將Lazy writes/sec考慮在內(nèi)。
10.TempDB上永遠(yuǎn)不會(huì)寫(xiě)入臟頁(yè)
錯(cuò)誤。TempdB是一個(gè)特殊的數(shù)據(jù)庫(kù),永遠(yuǎn)只能簡(jiǎn)單恢復(fù)模式,如果您在TempDB上造成大量臟頁(yè),自動(dòng)CheckPoint時(shí)會(huì)發(fā)現(xiàn)的確不會(huì)有任何臟頁(yè)寫(xiě)入操作,但手動(dòng)CheckPoint時(shí),臟頁(yè)依然會(huì)被寫(xiě)入磁盤(pán)。
最后,再次感謝高文佳同學(xué)和我探討。
本文轉(zhuǎn)自CareySon博客園博客,原文鏈接:http://www.cnblogs.com/CareySon/p/3315041.html如需轉(zhuǎn)載請(qǐng)自行聯(lián)系原作者
總結(jié)
以上是生活随笔為你收集整理的SQL Server CheckPoint的几个误区的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: htmltest~计算器界面的实现
- 下一篇: @ConditionalOnMissin