• 沙里软件

  • ShaliSoft.com [手机站]   办公桌收纳抽屉
  • 首页
  • 博文
  • 演示
  • 管理
  • SQLSERVER数据库检查DBCC CheckDB

    网络   2015/7/22 23:39:26

      前面提到SQL Server发现错误的方法有两种,分别为在读取页时和在备份时(本质上也是读取页)。但如果我们希望对于数据一致性的检查更加的激进,那我们应该定期使用CheckDB来检查数据的一致性,而不至于在生产时间数据被读取时才能发现错误。

        CheckDB命令会对整个数据库做所有的一致性检查。当检查对象是Master数据库时,CheckDB还会检查ResourceDB。

        CheckDB最简单的用法如代码清单2所示,在当前数据库上下文中直接执行CheckDB,将会检查当前数据库中所有的一切。

    DBCC CHECKDB

    代码清单2.CheckDB最简单的用法

     

        CheckDB命令在企业版中会使用多线程来进行,会对整个数据库进行一致性检查,在该过程中,使用了内建数据库快照的方式进行,因此不会造成阻塞,但CheckDB会消耗大量的CPU、内存和IO。因此CheckDB要选择在维护窗口时间或是系统闲时进行。

        默认情况下,CheckDB命令会将输出所有的信息,但通常我们并不关心这些信息,而是只关心错误信息,因此实际中通常给DBCC指定不显式信息的参数,如代码清单3所示。

    DBCC CHECKDB WITH NO_INFOMSGS;

    代码清单3.CheckDB通常搭配No_InfoMsgs参数

     

        实际上,CheckDB是一套命令的汇总,CheckDB会依次检查下述内容:

    • 初次检查系统表

    • 分配单元检查(DBCC CHECKALLOC)

    • 完整检查系统表

    • 对所有表进行一致性逻辑检查(DBCC CHECKTABLE)

    • 元数据检查(DBCC CHECKCATALOG)

    • SSB检查

    • 索引视图、XML索引等检查

     

        首先,当发现系统表损坏时,只能通过备份进行恢复(这也是为什么备份除TempDB之外的系统表非常重要)。其次,在一个大数据库中,做一次CheckDB时间会非常长,维护窗口时间或系统闲时的时间可能无法Cover这段时间,那么我们可以将CheckDB的任务分散到CHECKALLOC、DBCC CHECKTABLE、DBCC CHECKCATALOG这三个命令中。

        更多关于CheckDB的详细信息,请参阅:http://technet.microsoft.com/en-us/library/ms176064.aspx。

     

    数据库损坏的修复

        数据库损坏最行之有效的办法就是存在冗余数据,使用冗余数据进行恢复。所谓的冗余数据包括热备、冷备、和暖备。

        使用镜像或可用性组作为热备,当检测到错误时,可以自动进行页修复(镜像要求2008以上,可用性组是2012的功能)。镜像当主体服务器遭遇824错误时,会向镜像服务器发送请求,将损坏的页由镜像复制到主体解决该问题。对于可用性组,如果数据页是在主副本上发现的,则主副本将会向所有辅助副本发送广播,并由第一个响应的辅助副本的页来修复页错误,如果错误出现在只读辅助副本,则会向主副本请求对应的页来修复错误。在这里有一点值得注意的是,无论是哪一种高可用性技术,都不会将页错误散播到冗余数据中,因为SQL Server中所有的高可用性技术都是基于日志,而不是数据页。

        其次是使用暖备或冷备来还原页,我已经在代码清单1中给出了详细的代码,这里就不细说了。

        如果没有合适的备份存在,如果损坏的数据页是存在于非聚集索引上,那么你很幸运,只需要将索引禁用后重建即可。

        如果存在基准的完整备份,并且日志链没有断裂(包括差异备份可以Cover日志缺失的部分),则可以通过备份尾端日之后还原数据库来进行修复。

        最后,如果基础工作做的并不好,您可能就需要通过损失数据的方式来换回数据库的一致性,我们可以通过DBCC CheckDB命令的REPAIR_ALLOW_DATA_LOSS来修复数据库。使用该方法可能导致数据损失,也可能不会导致数据损失,但大部分情况都会通过删除数据来修复一致性。使用REPAIR_ALLOW_DATA_LOSS需要将数据库设置为单用户模式,这意味着宕机时间。

        无论是哪种情况修复数据库,都要考虑是否满足SLA,如果出现了问题之后,发现无论用哪种方式都无法满足SLA的话,那只能检讨之前的准备工作并祈祷你不会因此丢了工作。


    阅读(3908) 分享(0)

    上一篇: asp.net 格式化显示时间为几个月,几天前,几小时前,几分钟前,或几秒前
    下一篇: FORM提交表单,数据由gb2312传到utf-8 乱码的解决方案.

  • 精彩推荐

    ◆ 导出Excel 格式 mso-number-format
    ◆ JS 银行卡号判断验证
    ◆ StackOverflow网站架构,.NET技术架构解析
    ◆ 移动设备屏幕适配,字体px pt dp的区别?
    ◆ 怎么防止数据库被下载密码不被泄露
    ◆ 58同城沈剑:好的架构是进化来的,不是设计来的
    ◆ 关闭vs2010的托盘提示 "Improve Microsoft Visual Studio performance"
    ◆ CIH病毒作者陈盈豪现状
    ◆ PHP利用mysqli操作数据库方法总结
    ◆ 马云、马化腾、刘强东的童年大揭底!
  • 用心做事 不能唯利是图

    • 吊儿
    • 用QQ联系我17905772
  • 搜索


  • 最新文章

    • 导出Excel 格式 mso-number-format
    • 服务器iis支持tls1.2,windows server 2008 r2 中IIS启用TLS 1.2(安装SSL后用TLS 1.2)
    • MySQL配置优化
    • EditPlus 添加文件比较工具winmerge
    • 滚动悬浮固定JS特效

  • 热门文章

    • php sso单点登录实现代码
    • 中国菜刀(China chopper) 最新黑客工具
    • redis.conf中文版(基于2.4)
    • 搜索引擎名单大全
    • php图片上传类,支持加水印,生成略缩图

  • 最新图库


  • 最新评论


  • 友情链接

  • 沙里软件

  • 最近访客

    Powered by ShaliSoft.com 豫ICP备13008529号

    免责声明:本站部分内容来源于互联网,转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,不为其版权负责,也不构成任何其他建议。如果发现侵犯版权,联系QQ17905772进行删除。