Sqlserver关于校验和_备份还原的CHECKSUM

官方文档
https://docs.microsoft.com/zh-cn/sql/t-sql/statements/backup-transact-sql?view=sql-server-2017
https://docs.microsoft.com/zh-cn/sql/t-sql/statements/restore-statements-transact-sql?view=sql-server-2017
https://docs.microsoft.com/zh-cn/sql/relational-databases/backup-restore/possible-media-errors-during-backup-and-restore-sql-server?view=sql-server-2017
https://docs.microsoft.com/zh-cn/sql/t-sql/statements/alter-database-transact-sql-set-options?view=sql-server-2017

总结
1、数据库备份的时候启用备份校验和,则会消耗更多资源,备份过程也会更慢
2、数据库备份的时候启用备份校验和,备份操作不会向数据库页中添加任何校验和也不会源页面和页面内容,只是把备份校验和存储在备份片上,也就是生成的备份文件上
3、如果备份的时候带CHECKSUM参数,则还原这个备份文件时候的时候自动也带CHECKSUM 参数,如果备份的时候不带CHECKSUM参数,则还原的时候默认就是NO_CHECKSUM
4、校验和其实就是写入数据的时候同时写入一条校验信息,读取数据的时候会计算一个校验信息,并把这个校验信息和写入的校验信息比较,如果两个值不匹配,则读取会失败。就像数据库备份的时候如果启用了备份校验和则在备份的同时会往生成的备份文件生成一个备份校验信息,恢复的时候也会生成一个备份校验信息,这个时候恢复过程生成的备份校验信息匹配上了备份文件的备份校验信息,则恢复可以顺利进行
5、RESTORE VERIFYONLY仅仅检查文件是否符合Microsoft Tape Format (MTF)规范,验证备份集是否完整以及整个备份是否可读。 但是,RESTORE VERIFYONLY 不尝试验证备份卷中的数据结构,即验证数据文件是否损坏,但是不验证备份文件是否含有垃圾数据。什么是垃圾数据,比如你使用一个16进制的编辑器修改了备份文件中存储的数据,这个时候备份文件没有损坏但是有垃圾数据,然后再次运行RESTORE VERIFYONLY仍然会返回“备份设备有效(The backup set is valid)”的信息。这种情况下我们就可以在备份时使用CHECKSUM选项,它会读取数据文件的页校验和或页残缺检测并写入备份文件生成备份校验和,后面RESTORE VERIFYONLY的时候就必须验证这个备份文件的备份校验和
6、如果有DBCC CHECKDB了,其实Backup备份的时候可以不需要CHECKSUM参数,因为DBCC CHECKDB也会验证页信息,就算是DBCC CHECKDB的PHYSICAL_ONLY页会验证页面残缺页、校验和错误以及常见的硬件故障。PAGE_VERIFY { CHECKSUM校验 | TORN_PAGE_DETECTION残缺页 | NONE }
7、如果备份的时候没带CHECKSUM 参数,还原的时候加上了CHECKSUM,因为备份文件没有验和,所以还原会报错

Backup备份操作是否启用备份校验和。
{ NO_CHECKSUM | CHECKSUM } 控制是否启用备份校验和。

NO_CHECKSUM 显式禁用备份校验和的生成(以及页校验和的验证)。 此选项为默认行为。

CHECKSUM 如果此选项已启用并且可用,则指定备份操作将验证每页的校验和及页残缺,并生成整个备份的校验和。
使用备份校验和可能会影响工作负荷以及备份吞吐量。

Restore还原操作是否启用备份校验和。
{ CHECKSUM | NO_CHECKSUM }
支持的语句:RESTORERESTORE FILELISTONLYRESTORE HEADERONLYRESTORE LABELONLY 和 RESTORE VERIFYONLY。
默认行为是在存在校验和时验证校验和,在不存在校验和时不进行验证并继续执行操作。也就是说如果备份的时候带CHECKSUM参数,则还原这个备份文件时候的时候自动也带CHECKSUM 参数,如果备份的时候不带CHECKSUM参数,则还原的时候默认就是NO_CHECKSUM

CHECKSUM
指定必须验证备份校验和,在备份缺少备份校验和的情况下,该选项将导致还原操作失败,并会发出一条消息表明校验和不存在。
默认情况下,当遇到无效的校验和时,RESTORE 会报告校验和错误并停止。 然而,如果指定了 CONTINUE_AFTER_ERROR,RESTORE 会在返回校验和错误以及包含无效校验和的页面编号之后继续。
备注1:仅当使用备份校验和时,页校验和才与备份操作相关。
备注2:也就是说如果备份的时候没带CHECKSUM 参数,还原的时候加上了CHECKSUM,因为备份文件没有验和,所以还原会报错

NO_CHECKSUM
显式禁用还原操作的校验和验证功能。

备份校验和
SQL Server 支持三种校验和:页校验和、日志块校验和以及备份校验和。 生成备份校验和时,BACKUP 将验证从数据库读取的数据是否与数据库中存在的任意校验和或页残缺指示一致。
BACKUP 语句选择性地计算备份流的备份校验和;如果给定页上存在页校验和或残缺页信息,则当备份该页时,BACKUP 还将验证它的校验和、残缺页状态以及 ID。 创建备份校验和时,备份操作不会向页中添加任何校验和。 将在这些页位于数据库中时对其进行备份,备份不会修改这些页。
由于验证和生成备份校验和引起的开销,使用备份校验和会对性能造成潜在的影响。 工作负荷和备份吞吐量都可能受到影响。 因此,不是必须使用备份校验和。 如果决定在备份过程中生成校验和,请仔细监视由此引起的 CPU 开销以及对系统中任何并发工作负荷造成的影响。
BACKUP 永远不会修改磁盘上的源页面和页面内容。

在启用备份校验和后,备份操作将执行以下步骤:
1、向备份介质写入页之前,备份操作将验证页级信息(页校验和或页残缺检测)是否存在。 如果两者都不存在,则备份无法验证页。 将按原样包含未经验证的页,并且其内容将添加到总备份校验和中。如果备份操作在验证过程中遇到页错误,备份将失败。
2、无论是否存在页校验和,BACKUP 都会为备份流生成一个单独的备份校验和。 还原操作可使用(可选)备份校验和来验证该备份是否损坏。 备份校验和存储在备份介质上,而不是存储在数据库页上。 备份校验还可根据需要在还原时使用。
3、备份集标记为包含备份校验和(在 msdb…backupset 的 has_backup_checksums 列中)。 有关详细信息,请参阅 backupset (Transact-SQL)。

备注1、在还原操作过程中,如果备份介质中存在备份校验和,则默认情况下,RESTORE 和 RESTORE VERIFYONLY 语句都将验证备份校验和及页校验和。 如果不存在备份校验和,则这两种还原操作直接执行,而不会进行验证;这是因为没有备份校验和,还原无法可靠地验证页校验和。
备注2、有关页校验和及页残缺检测的详细信息,请参阅 ALTER DATABASE 语句的 PAGE_VERIFY 选项。 有关详细信息,请参阅 ALTER DATABASE SET 选项 (Transact-SQL)。

ALTER DATABASE SET 选项 (Transact-SQL)
PAGE_VERIFY { CHECKSUM | TORN_PAGE_DETECTION | NONE }
发现磁盘 I/O 路径错误引起的损坏的数据库页面。 磁盘 I/O 路径错误可能是数据库损坏问题的原因。 这些错误通常由在将页写入磁盘时发生的电源故障或磁盘硬件故障所导致。

CHECKSUM
在向磁盘中写入页面时,计算整个页面内容的校验并将该值存储在页眉中。 从磁盘中读取页时,将重新计算校验和,并与存储在页头中的校验和值进行比较。 如果两个值不匹配,将同时在 SQL Server 错误日志和 Windows 事件日志中报告错误消息 824(指示校验和失败)。 校验和失败指示存在 I/O 路径问题。 若要确定其根本原因,需要调查硬件、固件驱动程序、BIOS、筛选器驱动程序(如防病毒软件)和其他 I/O 路径组件。

TORN_PAGE_DETECTION
将页面写入磁盘时,将每个 512 字节扇区的特定 2 位模式保存在 8 KB 数据库页面中并存储在数据库页头中。 从磁盘中读取页时,页头中存储的残缺位将与实际的页扇区信息进行比较。
如果值不匹配,表明只有页面的一部分被写入磁盘。 在这种情况下,将同时在 SQL Server 错误日志和 Windows 事件日志中报告错误消息 824(指示页撕裂错误)。 如果页面写入确实不完整,则数据库恢复通常会检测到页撕裂。 不过,其他 I/O 路径故障可能随时导致页撕裂。

NONE
数据库页写入不会生成 CHECKSUM 或 TORN_PAGE_DETECTION 值。 在读取过程中,即使页头中存在 CHECKSUM 或 TORN_PAGE_DETECTION 值,SQL Server 也不会验证校验和或页撕裂。

使用 PAGE_VERIFY 选项时,请考虑下列重要事项:
1、默认值为 CHECKSUM。
2、用户数据库或系统数据库升级到 SQL Server 2005 (9.x) 或更高版本后,PAGE_VERIFY 值(NONE 或 TORN_PAGE_DETECTION)不会更改。 建议更改为 CHECKSUM。
3、ORN_PAGE_DETECTION 可能使用较少资源,但提供的 CHECKSUM 保护最少。
4、无需使数据库脱机、锁定数据库或以其他方式阻止对数据库的并发访问,即可设置 PAGE_VERIFY。
5、CHECKSUM 与 TORN_PAGE_DETECTION 互相排斥。 不能同时启用这两个选项。

备注1、在 SQL Server 的早期版本中,TempDB 数据库的 PAGE_VERIFY 数据库选项设置为 NONE 且不能修改。 从 SQL Server 2008 开始,对于新安装的 SQL Server,TempDB 数据库的这一默认值为 CHECKSUM。 如果是升级安装的 SQL Server,则默认值仍为 NONE。 可以修改该选项。 我们建议为 tempdb 数据库使用 CHECKSUM。
备注2、检测到页撕裂或校验和失败时,如果失败仅限于索引页,则可通过还原数据进行恢复,可能还需要重建索引进行恢复。 如果要在校验和失败的情况下确定受影响的一个或多个数据库页面的类型,请运行 DBCC CHECKDB。 有关还原选项的详细信息,请参阅 RESTORE 参数。 虽然还原数据可解决数据损坏问题,但应尽快诊断并纠正根本原因(如磁盘硬件故障),以防止继续出错。
备注3、SQL Server 将对因校验和、页撕裂或其他 I/O 错误而失败的任何读取都重试四次。 如果在任何一次重试中读取成功,则会向错误日志写入消息。 触发读取的命令会继续执行。 如果重试失败,则该命令失败,且显示错误消息 824。

猜你喜欢

转载自blog.csdn.net/lusklusklusk/article/details/114983897