撕裂页面检测和校验和是什么时候引入 SQL Server 的,升级行为是什么?

Pau*_*aul 15 sql-server

现代 SQL Server 中有两种不同的页面验证选项;被撕裂页面检测校验和当然也是一种选择。

我相信校验和是在 SQL Server 2005 中引入的,并且从先前版本升级或恢复数据库将保持其先前的页面验证方法。即没有隐式升级。

所涉及的问题是我们有一个生产数据库,该数据库使用 SQL Server 2000 投入生产,此后转移到 SQL Server 2008 R2 服务器。当我一直期望它是Torn Page Detection时,页面验证被设置为None。回顾这段时间,我们似乎认为 DB 最初是在 SQL Server 7.0 中开发的,然后迁移到 SQL Server 2000,这可以解释观察到的结果。

我想知道撕裂页面检测校验和何时成为 SQL Server 的一项功能,以及它们在迁移或升级到新版本时的表现。

编辑:总结一些答案:

撕裂页面检测进入 SQL Server 的某些日期存在一些差异。
链接 1:http : //support.microsoft.com/kb/230785
链接 2:http : //technet.microsoft.com/en-us/library/aa337525(v=sql.90).aspx

第一个链接指示 SQL 7.0 和第二个 SQL2000。我倾向于相信 SQL7.0 的建议,并且链接 2 对它在 SQL7.0 中默认关闭而在 SQL2000 中默认打开感到困惑。

Kin*_*hah 15

在 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 中的校验和

具体回答您的问题:

我相信校验和是在 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 的日志页面。这可以公开已成功提交的事务。如果日志页在故障期间被重写,则可能无法正确重写具有已提交事务的扇区。

因此,TORN_PAGE_DETECTION 从 SQL Server 7.0 开始就已经存在。即便如此,默认设置是未启用(相同链接)

注意默认情况下,SQL Server 7.0 中未启用残缺页面检测。有关如何在系统上启用检测的信息,请参阅sp_dboption

因此,如果数据库是针对 7.0 实例开发的并随后升级,它将使用 NONE 的现有 PAGE VERIFY 选项升级(如@ThomasStringer 在他的回答中指出的)。


编辑:09/24/2013 改进答案:

参考我来自 SQLSkills 的 SQL Server Internal notes,我发现使用页面转储,您可以验证是否启用了撕裂位检测 - 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
Run Code Online (Sandbox Code Playgroud)

m_tornBits:它保存页面校验和或被撕裂页面保护位置换的位 - 取决于为数据库打开的页面保护形式。

注意:我没有运行任何旧的 sql server 版本。以下是从sql server 2000 及更高版本确认的。如果您有 7.0 或 6.5 运行,您也可以确认它:-)

在此处输入图片说明


Tho*_*ger 6

看看来自 BOL参考

当用户或系统数据库升级到 SQL Server 2005 或更高版本时,将保留 PAGE_VERIFY 值(NONE 或 TORN_PAGE_DETECTION)。我们建议您使用 CHECKSUM

这表明在 SQL Server 2005 之前,该选项TORN_PAGE_DETECTION存在,但不存在CHECKSUM.

并回答你的第二点:

...并且从以前的版本升级或恢复数据库将保持它的上一页验证方法。

对,那是正确的。您需要显式设置数据库以使用CHECKSUM页面验证方法。

  • @Paul 这确实回答了在 SQL Server 2005 之前存在撕裂页面检测的问题。您是否在寻找页面验证发挥作用的 SQL Server 的哪个版本?除了上一堂历史课,我不确定你想从中获得什么。你到底想解决什么问题? (2认同)