AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 50127
Accepted
Paul
Paul
Asked: 2013-09-19 04:54:59 +0800 CST2013-09-19 04:54:59 +0800 CST 2013-09-19 04:54:59 +0800 CST

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

  • 772

现代 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
  • 4 4 个回答
  • 8113 Views

4 个回答

  • Voted
  1. Best Answer
    Kin Shah
    2013-09-19T05:17:44+08:002013-09-19T05:17:44+08:00

    在 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 时,您必须显式更改数据库选项 Page Verify 以使用 CHECKSUM。

    如果将已经在 sql 2005 上创建的数据库恢复到另一台运行 sql 2005 的服务器上,则不必进行设置。它将持续到您将“页面验证”选项设置为的任何内容。

    我还没有成功研究撕裂页面检测何时出现

    来自: http: //support.microsoft.com/kb/230785

    早于 7.0 的 SQL Server 版本

    早于 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,您也可以确认它:-)

    在此处输入图像描述

    • 15
  2. Thomas Stringer
    2013-09-19T05:17:33+08:002013-09-19T05:17:33+08:00

    看看BOL 的参考资料:

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

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

    并回答您的第二点:

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

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

    • 6
  3. user507
    2013-09-19T14:22:48+08:002013-09-19T14:22:48+08:00

    现代 SQL Server 中有两种不同的选项用于页面验证

    如您所说,有三个:TORN_PAGE_DETECTION、CHECKSUM 和 NONE。

    我相信 CHECKSUM 是在 SQL Server 2005 中引入的

    正如这篇题为“缓冲区管理”的 MSDN 文章所引用的那样:损坏页面检测是在 SQL Server 2000 中引入的。校验和是在 SQL Server 2005 中引入的。

    本文中提到的其他内容的概要是,页面验证机制是在数据库创建时指定的。因此,这取决于他们创建数据库的人以及他们如何设置数据库,也可以通过配置数据库的模型来控制。还需要注意的是,如果您更改设置,它不会影响整个数据库,只有当页面被写入下一个时。同样根据 Paul Randal 的说法,它仅在页面被读入内存、更改然后写回磁盘时完成;该信息在这里。

    我有一个使用 SQL Server 2000 投入生产的生产数据库,尽管可能是针对 SQL Server 7.0 开发的,并且已经移至 SQL Server 2008 R2 服务器。Page Verify 设置为 NONE,但我预计它是 TORN PAGE DETECTION。

    任何拥有数据库实例权限的人都可以修改该值。它可以通过 MSDN 上所述的升级持续存在:

    当用户或系统数据库升级到 SQL Server 2005 或更高版本时,将保留 PAGE_VERIFY 值(NONE 或 TORN_PAGE_DETECTION)

    它也可能在以后被修改,因为有人误解了配置并在黑暗中拍摄试图解决问题。

    我想知道撕裂页面检测何时成为页面验证功能

    SQL Server 2000 如上所述。

    迁移或升级到较新版本时的行为方式。

    如上所述,在升级过程中会保留先前的设置。

    现在我想指出这样一个事实,人们提供的其他链接表明 SQL Server 7.0 是可用的撕裂页面检测功能。正如那些文章中所说的那样,这是正确的,但是已经多次证明 Microsoft 文档在所有情况下都不应该被认为是真实的。他们错的地方很多。话虽如此,您如何确定哪个答案是可以接受的?我们都提供了 Microsoft 的文档来支持我们的回答。

    还要注意的是,从 SQL Server 2012 开始,破损页面检测就在折旧列表中,那么一开始如何在数据库上设置它有什么问题。如果我看到它设置为 CHECKSUM 以外的任何值,我会立即更改它并继续执行其他更重要的任务。我不关心如何放置错误的配置,更重要的是更正它,然后确保有权更改它的人被告知为什么不应将该配置项更改为其他任何内容。 只是我的 0.02 美元

    • 3
  4. DaniSQL
    2013-09-19T05:35:44+08:002013-09-19T05:35:44+08:00

    正如@Thomas Stringer 和@Kin 所说,它是在 SQL Server 2005 中引入的,我相信它适用于所有版本的 SQL Server。对于 TempDB,虽然 CHECKSUM 是在 SQL Server 2008 中引入的

    关联

    • 0

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    授予用户对所有表的访问权限

    • 5 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve