名站网址导航为大家提供关于数据库教程相关的教程网站知识。
误区 #27:使用BACKUP ... WITh ChECKSUM可以替代DBCC CheckDBSQL Server误区30日谈 第26天 SQL Server中存在真正的“事务嵌套
误区 #26: SQL Server中存在真正的“事务嵌套” 错误,嵌套事务可不会像其语法表现的那样看起来允许事务嵌套。我真不知道为什么有人会这样写具体相关代码,我唯一能够想到的就是某个哥们对SQL Server社区嗤之以鼻然后写了这样的具体相关代码说:“玩玩您们”。 让我更详细的解,复制具体相关代码 具体相关代码如下:,CREATE DATABASE NestedXactsAreNotReal; GO USE NestedXactsAreNotReal; GO ALTER DATABASE NestedXactsAr,复制具体相关代码 具体相关代码如下:,BEGIN TRAN OuterTran; GO INSERT INTO t1 DEFAULT Values; GO 1000 BEGIN TRAN InnerTran; GO INSERT INTO,复制具体相关代码 具体相关代码如下:,ROLLBACK TRAN InnerTran; GO,复制具体相关代码 具体相关代码如下:,消息 6401,级别 16,状态 1,第 2 行 无法回滚 InnerTran。找不到该名称的事务或保存点。,复制具体相关代码 具体相关代码如下:,ROLLBACK TRAN; GO SELECT @@TRANCOUNT, COUNT (*) FROM t1; GO,复制具体相关代码 具体相关代码如下:,BEGIN TRAN OuterTran; GO BEGIN TRAN InnerTran; GO INSERT INTO t1 DEFAULT Values; GO 1000 COMMIT TRAN,复制具体相关代码 具体相关代码如下:,ROLLBACK TRAN OuterTran; GO SELECT COUNT (*) FROM t1; GO,复制具体相关代码 具体相关代码如下:,BEGIN TRAN OuterTran; GO BEGIN TRAN InnerTran; GO INSERT INTO t1 DEFAULT Values; GO 1000 DBCC SQLPER,复制具体相关代码 具体相关代码如下:,COMMIT TRAN InnerTran; GO ChECKPOINT; GO DBCC SQLPERF ('LOGSPACE'); GO,复制具体相关代码 具体相关代码如下:,COMMIT TRAN OuterTran; GO ChECKPOINT; GO DBCC SQLPERF ('LOGSPACE'); GO,
错误
乍一看,由于BACKUP WITh ChECKSUM会检测所有分配出去的页的校验和的值,这个误区貌似是这么回事,但实际上并不是这么回事,原因如下:
由SQL Server 2000或是更早版本升上来的网站数据库page checksums必须开启,在开启后,并不是网站数据库中所有的页都会被叫上页校验和,当页损坏发生时,IO系统可不会区分损坏的页是有页校验和还是没有校验和的。所以使用BACKUP ... WITh ChECKSUM就有可能导致一些损坏页不被发现,造成的后果……
除此之外,还有一个问题是完整备份的时间间隔相对比较长,假如说一个月,而相对于DBCC CheckDB的最佳实践是一个礼拜,这导致WITh ChECKSUM不能替代ChECKDB。即使您每周都进行差异备份,但差异备份只会检测差异部分的页校验和。
最后一点,也是危害最大的一点,就是使用BACKUP WITh ChECKSUM选项不能发现内存中的页损坏。这是因为由于内存芯片或是WINDOWS进程导致内存中的页损坏,并且在这之后写回磁盘。这导致损坏页却有正常的校验和,只有使用DBCC CheckDB才能发现这类错误。
因此,说到底,您必须经常使用DBCC ChECKDB,假如如果对此您仍然心存疑问,请看我之前的一篇文章:ChECKDB From Every Angle: Consistency Checking Options for a VLDB。
扩展阅读:Search Engine Q&A #26: Myths around causing corruption 关于数据库教程相关的教程网站知识今天我们就说到这里了,希望可以帮到大家。