设为首页 收藏本站
查看: 395|回复: 0

[经验分享] SQL SERVER:CHECKDB还有必要性吗?

[复制链接]

尚未签到

发表于 2015-6-29 14:20:26 | 显示全部楼层 |阅读模式
  我经常被专业人士问道:在SQL SERVER 2008 中CHECKDB仍然被推荐使用吗?从SQL 2005开始SQL计算校验和来避免物理页损坏。然而,以我的经验(从SQL SERVER 7.0开始),我却从未能清楚地说明CHECKDB不是必要的。
  其他人有好的建议吗?
  _____________________________________________
From: Robert Dorr
Sent:Friday, February 20, 2009 9:04 AM
  这个问题曾经被提到很多次。的确,增加的数据库页审计校验和(DATABASE PAGE AUDIT CHECKSUM)减少了一些需要执行CHECKDB的次数。历史记录也表明,从SQL SERVER 7.0起数据库引擎的性能得到了显著提升,从而进一步减少了这种必要性。
  但是,像检验和这样的功能只是保证写入磁盘的是什么,读取出来就是什么。它并不验证许多其它的数据完整性问题,而CHECKDB就是为此面设计。比如CHECKDB验证系统表的元数据,页链,索引排序等等。
  这个问题的答案就是:从SQL SERVER 7.0起,这种必要性已经减少。一个严密的恢复计划应当包括数据库全备和CHECKDB,用以保证此计划的各个方面都是可用的。例如:你有一个干净的数据库,备份它,并用于恢复。因为在备份媒体迁移过程中发生了某些事情,它被损坏了。SQL2008中的校验和备份(Backup with CHECKSUM)能够有益于这种场景。有些供应商说:这个永远没有必要,数据库引擎能搞定所有事情。我觉得这种说法有点片面。
  例如:

  • 我曾处理过一个磁带驱动器不一致的案例。能够成功备份到磁带却不能读取它用于还原。除非执行还原操作,否则数据库引擎不会意识到硬件错误。这个客户损失了他的生产服务器并不能用恢复来还原。为此在一个磁带恢复公司身上花了$100,000.
  • 我曾经研究内存和ECC故障率。根据研究,内存传输中单独的位改变会导致数据损坏。这就是为什么SQL SERVER 2005对缓存池(Buffer Pool)增加了恒量页扫描(Constant Page Scanning)。当页在内存中时,恒量页扫描技术对校验和取样,用以确保只读页不会因为这样的错误而改变。这个技术用益于数据稳定,但是不能捕获所有的事情。所以还是可能发生ECC故障,缓存池中的页可能被改变并成功计算校验和写入磁盘。我曾经处理过一个案例就是这个问题:一个数据值中间的一个位被改变。这个列碰巧是一个被外键引用的主键。所以主键值是9,可能会被改变成19。因为这个重复的值19,导致了违反了主键约束,而外键引用的值9也不存在了。这个数据的改变不是受事务影响而发生的,只是页中任何一个值的改变都会导致。这个数据库配置了日志传送,而备机不会显示此错误,结果把“水搞得更混”。因为不是SQL SERVER直接导致主键值改变的,所以数据库日志也不会记录这个错误。所以即使做一个干净的还原,CHECKDB也不能发现问题。在做全备或者差备并成为历史存档备份前,在主库上执行DBCC CHECKDB是发现这种问题的唯一途径。
  • 像ECC SQL SERVER bugs一样,更多的XPROC和COM对象bugs导致了同样的错误。如果XPROC中的代码错误地更新了内存,将出现同样模式的错误。
  • 过去10年中我们在存储方面排名第一的问题是Stale Read(从硬件高速缓存中返回页的前一版本而不是最版本).因为这只是页的较旧版本,所以校验和测试通常不会失败。这样一个场景:我妻子存了$500到时我们的活期账户,几分钟后我取出$500.硬件高速缓存加载我妻子存款之前的账户结余。我妻子的存款被提交并写入了磁盘,但是硬件高速缓存没有被更新。当我取钱时更新未能找到这笔存款,便错误地使用初始的账户结余更新了我的账户。SQL SERVER 不会直接知道这些事情,所以这就变成了一个逻辑事务丢失。
  在这种情况下,即使执行DBCC也不能发现这个错误。除了从事务日志备份恢复此数据库,并找出哪个页被持有同样的LSN的事务更新了两次,但是这本身就是一个无效的条件。
  我从来不愿意说DBCC不需要了。您应该像还原备份一样,时不时的运行一下。
  
  Joe.TJ翻译整理,仅用于传播资讯之目的。
  原文地址:SQL Server: Is CHECKDB A Necessity?
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-81547-1-1.html 上篇帖子: 在SQL Server中调用.NET程序集 下篇帖子: 导出SQL Server中所有Job的最简单方法
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表