现代 SQL Server 中有两种不同的选项用于页面验证;是残页检测和校验和。无当然也是一种选择。
我相信Checksum是在 SQL Server 2005 中引入的,并且从以前的版本升级或恢复数据库将保持其以前的页面验证方法。即没有隐式升级。
所涉及的问题是,我们有一个使用 SQL Server 2000 投入生产的生产数据库,并且已经转移到 SQL Server 2008 R2 服务器。当我期待它是Torn Page Detection时, Page Verify 设置为None。回顾这段时间,我们似乎认为数据库最初是在 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 中默认打开而感到困惑。
在 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 - 将在写入页面和读取页面时计算页面的校验和,假设它上面有校验和。
参考:SQL2005中的校验和
具体回答您的问题:
是的 CHECKSUM 是在 SQL Server 2005 中引入的,是DEFAULT。当您从 2000 升级到 2005 时,您必须显式更改数据库选项 Page Verify 以使用 CHECKSUM。
如果将已经在 sql 2005 上创建的数据库恢复到另一台运行 sql 2005 的服务器上,则不必进行设置。它将持续到您将“页面验证”选项设置为的任何内容。
来自: http: //support.microsoft.com/kb/230785
因此,自 SQL Server 7.0 以来,TORN_PAGE_DETECTION 就一直存在。即便如此,默认设置是未启用(相同链接)。
因此,如果数据库是针对 7.0 实例开发并随后升级的,它将使用现有的 PAGE VERIFY 选项 NONE 进行升级(正如@ThomasStringer 在他的回答中指出的那样)。
编辑:09/24/2013 改进答案:
从 SQLSkills 参考我的 SQL Server 内部注释,我发现使用页面转储,您可以验证是否启用了撕裂位检测 - TORN_PAGE_DETECTION 或 CHECKSUM:
m_tornBits:它保存页面校验和或被损坏页面保护位替换的位 - 取决于为数据库打开哪种形式的页面保护。
注意:我没有运行任何较旧的 sql server 版本。以下是从sql server 2000 及更高版本确认的。如果您运行的是 7.0 或 6.5,您也可以确认它:-)
看看BOL 的参考资料:
这表明在 SQL Server 2005 之前存在的选项
TORN_PAGE_DETECTION
存在,但不存在CHECKSUM
.并回答您的第二点:
对,那是正确的。您需要显式设置数据库以使用
CHECKSUM
页面验证方法。如您所说,有三个:TORN_PAGE_DETECTION、CHECKSUM 和 NONE。
正如这篇题为“缓冲区管理”的 MSDN 文章所引用的那样:损坏页面检测是在 SQL Server 2000 中引入的。校验和是在 SQL Server 2005 中引入的。
本文中提到的其他内容的概要是,页面验证机制是在数据库创建时指定的。因此,这取决于他们创建数据库的人以及他们如何设置数据库,也可以通过配置数据库的模型来控制。还需要注意的是,如果您更改设置,它不会影响整个数据库,只有当页面被写入下一个时。同样根据 Paul Randal 的说法,它仅在页面被读入内存、更改然后写回磁盘时完成;该信息在这里。
任何拥有数据库实例权限的人都可以修改该值。它可以通过 MSDN 上所述的升级持续存在:
它也可能在以后被修改,因为有人误解了配置并在黑暗中拍摄试图解决问题。
SQL Server 2000 如上所述。
如上所述,在升级过程中会保留先前的设置。
现在我想指出这样一个事实,人们提供的其他链接表明 SQL Server 7.0 是可用的撕裂页面检测功能。正如那些文章中所说的那样,这是正确的,但是已经多次证明 Microsoft 文档在所有情况下都不应该被认为是真实的。他们错的地方很多。话虽如此,您如何确定哪个答案是可以接受的?我们都提供了 Microsoft 的文档来支持我们的回答。
还要注意的是,从 SQL Server 2012 开始,破损页面检测就在折旧列表中,那么一开始如何在数据库上设置它有什么问题。如果我看到它设置为 CHECKSUM 以外的任何值,我会立即更改它并继续执行其他更重要的任务。我不关心如何放置错误的配置,更重要的是更正它,然后确保有权更改它的人被告知为什么不应将该配置项更改为其他任何内容。 只是我的 0.02 美元
正如@Thomas Stringer 和@Kin 所说,它是在 SQL Server 2005 中引入的,我相信它适用于所有版本的 SQL Server。对于 TempDB,虽然 CHECKSUM 是在 SQL Server 2008 中引入的
关联