在SQL Server 2000中,如果要标识损坏的页面,则应将数据库选项TORN_PAGE_DETECTION设置为TRUE。
但是在SQL 2005及更高版本中,新设置PAGE_VERIFY代替了旧的TORN_PAGE_DETECTION,该设置可以从两种不同的页面验证类型中进行选择:TORN_PAGE_DETECTION和CHECKSUM。
现在的问题是要设置哪一个-TORN_PAGE_DETECTION或CHECKSUM?
TORN_PAGE_DETECTION-在页面中每512字节写入一个位,使您可以检测何时页面未成功写入磁盘。问题是它不会告诉您存储在这512个字节中的数据是否正确,这是由于几个字节可能被错误地写入的事实。
CHECKSUM-将在写入页面和读取页面时计算页面的校验和,假设页面上有校验和。
SQL Server根据页面上的位模式计算校验和,并将其存储在页面标题中,然后发出I / O来写入页面。当SQL Server读取页面时,它将使用相同的逻辑重新计算校验和,然后将其与页面标题中的可用值进行比较。如果校验和值匹配,则假定在读写周期内页面未损坏。
由于计算校验和的成本是在读取和写入每个页面时产生的,因此它可能会增加CPU开销,并可能影响工作负载的吞吐量。要记住的另一件事是,校验和对于页面上的特定位模式不是唯一的。两个页面可能可以映射到相同的校验和值。因此,极有可能无法检测到页面损坏。
参考:SQL2005中的校验和
要专门回答您的问题:
我相信Checksum是在SQL2005中引入的,从先前版本升级或还原数据库将保持其先前的页面验证方法。即没有隐式升级。
是的,CHECKSUM是SQL Server 2005中引入的,并且是DEFAULT。从2000升级到2005时,必须显式更改数据库选项“页面验证”以使用CHECKSUM。
如果将已经在sql 2005上创建的数据库还原到另一台运行sql 2005的服务器,则不必进行设置。它将一直保持到您将“页面验证”选项设置为的状态。
进入“残破页面检测”时,我尚未成功进行研究
来自:http : //support.microsoft.com/kb/230785
SQL Server 7.0之前的版本
7.0之前的SQL Server版本不提供日志奇偶校验或位破损检测功能。实际上,这些版本可以多次写入同一日志页面,直到日志记录填满2 KB的日志页面为止。这可以暴露已成功提交的事务。如果在失败期间正在重写日志页面,则具有已提交事务的扇区可能无法正确重写。
因此,从SQL Server 7.0开始,TORN_PAGE_DETECTION就存在了。即使那样,默认值是未启用(相同链接)。
注意默认情况下,SQL Server 7.0中不启用残缺页检测。有关如何在系统上启用检测的信息,请参见sp_dboption。
因此,如果数据库是针对7.0实例开发的,随后又进行了升级,则该数据库将使用现有的PAGE VERIFY选项NONE进行升级(如@ThomasStringer在其回答中所述)。
编辑:09/24/2013 要改善答案:
参考我的SQLSkills的SQL Server内部注释,我发现使用页面转储,您可以验证是否启用了破位检测-TORN_PAGE_DETECTION或CHECKSUM:
use database_name -- change here for your database !!
checkpoint
go
dbcc traceon (3604) -- send output to screen
go
dbcc page (dbaalert, 1,1,0)
dbcc traceoff (3604) -- turn off the trace flag
go
m_tornBits:它保留页面校验和或被页面撕裂保护位所取代的位-取决于为数据库启用哪种形式的页面保护。
注意:我没有任何较旧的sql server版本正在运行。从sql server 2000及更高版本中确认以下内容。如果您运行的是7.0或6.5,也可以确认它:-)