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时,脏页依然会被写入磁盘。

 

 

   最后,再次感谢高文佳同窗和我探讨。

相关文章
相关标签/搜索