SQL 2005中的checksum功能

资料来自:https://blogs.msdn.com/b/sqlserverstorageengine/archive/2006/06/29/enabling-checksum-in-sql2005.aspx

页面 checksum 是SQL2005的新功能,提供了一种比残缺页检测强大的机制检测IO方面的损坏。以下是详细描述:

页面 CHECKSUM:

在数据库页面从被写入磁盘到被SQL Server读取的这段时间内,有可能由于外界原因发生损坏。比如I/O设备的损坏,驱动的损坏或者由于电源不稳没有写完整。Checksum机制使SQL Server可以检测到这些损坏。需要注意的是,Checksum机制只能使我们确定是不是I/O子系统引起页面损坏,但是不能自动修复它们。作为管理员,我们可以利用这些信息来辨识出并更换损坏的I/O设备,也可以利用重建索引或者修复损坏文件等方法修复已发生的页面损坏。

Checksum功能可以由Alter Database命令在数据库上逐个开启和关闭每一个数据库上的。当开启Checksum时,SQL Server会在页面被写入和被读取的时候计算页面的Checksum。SQL Server基于页面上的位模式计算Checksum,储存在页头部,然后发一个I/O来写页面。SQL Server在读取页面时用相同的方法再计算一次checksum,并与储存在页面头的checksum值进行比较。如果结果相同则说明在读写周期内页面没有损坏。计算checksum的算法是复杂的,因为会涉及到多个页面的读写,增加CPU的负荷,可能会影响系统的吞吐量。此外,checksum不是与页面位模式一一对应的,不同页面也有可能有相同的checksum值,所以有极小的可能性事页面损坏检查不出来。

我们对以下几种情况特别做一些说明:

l 数据库创建一段时间后才开启checksum

只有在开启checksum功能后每次写页面时才会计算checksum,读取页面时才会重新计算。如果数据库创建之初没有开启Checksum,会有一些页没有记录下checksum。当读取这些页面时SQL Server不会计算checksum,因为没有可以用来比较的checksum,计算就没有意义。目前没有命令或工具强制计算数据库所有页面的checksum。这样做并没有太大的好处。试想,当数据页面已经被破坏时,我们只能计算损坏的checksum,而不知道正常情况下的checksum,损坏也无从检测。当然,如果有这样的命令或工具存在,我们就能检测到由于位损坏(如一个有效的页在被写入到磁盘后发生损坏)引起的页面损坏,或者在数据库文件被转移或者复制到其他媒介的时检测到损坏了。

l 停止checksum功能

当不希望checksum消耗CPU资源或者确信I/O系统可靠的时候,您可以停止Checksum功能。停止后,不再计算和记录checksum值。这种情况下, SQL Server就可能受到外界造成的页面损坏,一个检测不到的损坏可能导致:

o      数据丢失,除非运行全备份恢复(前提是日志备份没有被破坏)

o      潜在的应用程序异常,特别是在损坏没有改变页面结构而只是改变了某些数据时。

o      降低数据库的可用性,因为必须要执行介质恢复来修正损坏。

l 如何验证数据库所有页的checksum

使用DBCC CHECKDB命令,最好加上PHYSICAL_ONLY参数以降低资源的消耗。

l 数据库开启残缺页(torn page)检测

数据库的Checksum检测和残缺页检测不能同时开启。因为checksum机制对于页面损坏的验证比残缺页更严格,而产生checksum匹配但是页面残缺的可能性极小,所以开启checksum相当于自动获取残缺页检测。如果您关闭了页面的checksum功能,那我们建议您开启残缺页检测,用较小的代价尽可能检测I/O子系统异常。

备份checksum

备份checksum和页面checksum算法一样,每当页面做备份时计算checksum,只不过多个页面checksum的值将合并成一个备份checksum值。备份checksum储存在备份媒介,而不是页面中。备份期间您可以选择生成备份checksum用于恢复备份时检测备份时候损坏。另外,如果页面checksum可用,可以在备份和恢复过程中用于确认。