范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

数据库损坏(SQLServer数据库损坏检测以及简单的修复办法)

  数据库损坏(SQL Server数据库损坏、检测以及简单的修复办法)
  在一个理想的世界中,不会存在任何数据库的损坏,就像我们不会将一些严重意外情况列入我们生活中的日常一样,而一旦这类事情发生,一定会对我们的生活造成非常显著的影响,在SQL Server中也同样如此,或许几年内您没有遇见过数据库中出现这类情况,而一旦遇见这类情况,往往伴随着数据的丢失,宕机,严重甚至您本身的职业生涯也会受到影响。因此对于这类情况,我们需要了解数据库损坏方面的知识,以便我们能够事前准备,事后能够处理。本篇文章会对数据库损坏的原因、现象、事前和事后的一些处理方法以及简单的修复方法进行探讨。
  数据库为什么会损坏?
  在了解数据库损坏之前,首先我们要了解SQL Server是如何将数据保存到数据文件(MDF、NDF等)。无论更新还是插入数据,数据都需要首先在内存中的Buffer Pool驻留,然后通过CheckPoint和Lazy Writer等过程将内存中的数据持久化到磁盘。在这个过程中,数据脏页由内存写入持久化的IO子系统,在此期间,按照IO子系统的不同,数据可能经过这几层:
  Windows(写数据一定调用的是WINDOWS API)
  Windows底层的中间层(杀毒软件,磁盘加密系统)
  网卡、路由器、交换机、光钎、网线等(如果IO子系统不是直连的话)
  SAN控制器(如果使用了SAN)
  RAID控制器(IO子系统做了RAID)
  磁盘或SSD等持久化存储器
  因此,数据页被写入持久化存储期间,可能经过上述列表中的几项。在经历上述过程中,硬件环境会受到很多方面的影响,比如说电压是否稳定、断电、温度过高或过低、潮湿程度等,而软件方面,由于软件都是人写的,因此就可能存在BUG,这些都可能导致数据页在传输过程中出现错误。
  此外,影响磁盘的因素也包括电压是否稳定、灰尘等因素,这些也有可能引起磁盘坏道或整体损坏。
  上面提到的所有因素都可以被归结为IO子系统。因此,造成数据损坏的情况绝大部分是由IO子系统引起的,还有非常非常小的概率内存芯片也会导致数据页损坏,但这部分情况微乎其微,因此不在本文的讨论之列。
  上面提到的这些导致数据损坏的原因都属于天灾,还有一些人祸。比如说通过编辑器等手动编辑数据文件、数据库中还有需要Redo和Undo的事务时(也就是没有Clean Shutdown)删除了日志文件(通常会导致数据库质疑)。
  发现数据库损坏
  在我们知道可能造成数据库的损坏原因之后,接下来我们来看SQL Server是如何监测数据库页损坏的。
  在SQL Server的数据库级别,可以设置页保护类型,一共有三个选项:None,CheckSum,Torn_Page_Detection,如图1所示:
  图1.页保护的三种选项
  关于这三种选项,首先,请无视None,请不要在任何场景下选择该选项,该选项意味着SQL Server不对页进行保护。
  其次是TORN_PAGE_DETECTION,在SQL Server中,数据的最小单位是页,每一页是8K,但是对应磁盘上往往是16个512字节的扇区,如果一个页在写入持久化存储的过程中,只写了一半的页,这就是所谓的TORN_PAGE_DETECTION,SQL Server通过每个扇区提512字节中前2位作为元数据,总共16个扇区32位4字节的元数据(页头中标识为:m_tornBits),通过该元数据来检测是否存在部分写的TORN_PAGE,但该类型的页验证无法检测出页中的写入错误,因此在SQL Server 2005及以上版本,尽量选择CheckSum。
  在SQL Server 2005及以上版本,引入了CheckSum,CheckSum可以理解为校验和,当数据页被写入持久化存储时,会根据页的值计算出一个4字节的CheckSum存于页头(页头中标识同为:m_tornBits),和数据在同一页中一起保存在数据库中。当数据从IO子系统被读取到内存中时,SQL Server会根据页内的值再次计算CheckSum,用该重新计算的CheckSum和页头中存储的CheckSum进行比对,如果比对失败,则SQL Server就会认为该页被损坏。
  由CheckSum的过程可以看出,只有在页被写入SQL Server的过程中才会计算CheckSum,因此如果仅仅改变数据库选项的话,则页头中的该元数据并不会随之改变。
  与IO相关的三种错误
  通过上述CheckSum的原理可以看出,SQL Server可以检测出页损坏,此时,具体的表现形式可能为下述三种错误的一种:
  823错误,也就是所谓的硬IO错误,可以理解为SQL Server希望读取页,而Windows告诉SQL Server,无法读取到该页。
  824错误,也就是所谓的软IO错误,可以理解为SQL Server已经读取到该页,但通过计算CheckSum等值发现不匹配,因此SQL Server认为该页已经被损坏。
  825错误,也就是所谓Retry错误。
  其中, 上述823和824错误都是错误等级为24的严重错误,因此会被记录在Windows应用程序日志和SQL Server的错误日志中,而引起该错误的页会被记录在msdb.dbo.suspect_pages中。SQL Server错误日志中也会记录到出错页的编号,如图2所示。
  图2.824错误在SQL Server错误记录中的描述
  因此,如果我们存在完善的备份的话,我们可以通过备份进行页还原(在此再次强调一下对于DBA来说,有"备"无患),一个简单的页还原代码如代码清单1所示。USE[master]RESTOREDATABASE[Corrupt_DB]PAGE='1:155'FROMDISK=N'C:\xxx.bak'WITHFILE=1,NORECOVERY,NOUNLOAD,STATS=5
  代码清单1.一个简单的页还原代码,从备份中还原文件ID1中的第155页
  记得我们前面说的,在读取页计算校验和时出错,这既可能是被写入持久化存储的页本身出错,也可能是在页被读取的过程中出错,此时SQL Server会尝试从IO子系统中再次读取该页,最多可能是4次尝试,如果在4次尝试过程中校验和通过,则会是825错误,否则是824错误。这里要注意,与823和824错误不同的是,825错误是一个等级仅为10的信息。
  因此,由于有固定的错误编号,因此可以在SQL Server Agent中对823和824设置警报。
  备份CheckSum
  上述页CheckSum只有在页被使用时才会被校验页的正确性。在备份数据库时,可以指定CheckSum选项来使得备份读取的页也计算校验和,从而保证了被备份的数据库是没有损坏的。在图3的备份选项我们可以注意到这两条:
  图3.CheckSum和Continue_After_Error选项
  如果启用了CheckSum,当备份过程中发现了页校验和错误时,就会终止备份,而启用了Continue_After_Error选项的话,在检测到校验和错误时,仍然继续从而使得备份成功。
  备份如果启用了CheckSum选项,除去检测每一页的校验和之外,还会在备份完成后,对整个备份计算校验和并存储于备份头中。
  此外,对于备份,我们还可以通过Restore Verifyonly with CheckSum来验证备份,来保证备份的数据没有被损坏。
  DBCC CheckDB
  前面提到SQL Server发现错误的方法有两种,分别为在读取页时和在备份时(本质上也是读取页)。但如果我们希望对于数据一致性的检查更加的激进,那我们应该定期使用CheckDB来检查数据的一致性,而不至于在生产时间数据被读取时才能发现错误。
  CheckDB命令会对整个数据库做所有的一致性检查。当检查对象是Master数据库时,CheckDB还会检查ResourceDB。
  CheckDB最简单的用法如代码清单2所示,在当前数据库上下文中直接执行CheckDB,将会检查当前数据库中所有的一切。DBCCCHECKDB
  代码清单2.CheckDB最简单的用法
  CheckDB命令在企业版中会使用多线程来进行,会对整个数据库进行一致性检查,在该过程中,使用了内建数据库快照的方式进行,因此不会造成阻塞,但CheckDB会消耗大量的CPU、内存和IO。因此CheckDB要选择在维护窗口时间或是系统闲时进行。
  默认情况下,CheckDB命令会将输出所有的信息,但通常我们并不关心这些信息,而是只关心错误信息,因此实际中通常给DBCC指定不显式信息的参数,如代码清单3所示。DBCCCHECKDBWITHNO_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的话,那只能检讨之前的准备工作并祈祷你不会因此丢了工作。

电脑不能关机怎么回事(电脑关不了机是怎么回事)电脑不能关机怎么回事(电脑关不了机是怎么回事)电脑关不了机是怎么回事?我们在长时间使用电脑后,想要关机,却会发现电脑偶尔卡在关机界面,相信大家都遇到过电脑关不了机的情况,遇到这样的错误651(宽带拨号时提示651错误)错误651(宽带拨号时提示651错误)很多朋友在使用电脑进行宽带拨号时,发现提示错误代码651,不知道是什么原因导致的,也不知道该如何修复,本期文章就说说解决宽带错误651代码的方安全证书过期(安全证书过期怎么办)安全证书过期(安全证书过期怎么办)现在的浏览器是越来越多了,什么2345浏览器,猎豹浏览器,360浏览器,UC浏览器等等,还有就是系统自带的IE浏览器了,而我们在使用的过程中也会遇网站证书过期怎么办(internet证书过期怎么办)网站证书过期怎么办(internet证书过期怎么办)随的着科技的发展网络的普及,实用电脑的用户越来越多,不得不面临的就是电脑会出现层出不穷的问题,最近小编就遇到一个用户的提问打开自义无反顾是什么意思(义无反顾词语解释)义无反顾是什么意思(义无反顾词语解释)义无反顾拼音ywfng五笔yfrd义无反顾怎么写好看义无反顾书法图片义无反顾的解释(1)honourpermitsnoturningback高电脑蓝屏的解决方法(电脑总是蓝屏怎么办)电脑蓝屏的解决方法(电脑总是蓝屏怎么办)电脑怎么又蓝屏了这样的话,想必大家是经常听到的,在使用电脑的过程中出现蓝屏的现象,对于每个人来说都是一件非常烦心的事情。如果你的电脑出现了很手机连接不上电脑怎么办(手机连接电脑没反应的原因以及解决办法)手机连接不上电脑怎么办(手机连接电脑没反应的原因以及解决办法)不知道大家有没有了过这样的困惑,就是手机在连接电脑的时候会出现没反应的现象。小编最近就遇到这样的问题,不管怎么连接就是电脑时间不能同步(电脑时间不能同步的原因和图文解决方法)电脑时间不能同步(电脑时间不能同步的原因和图文解决方法)不少朋友都可能遇到电脑时间不能同步或电脑时间不准的情况,出现电脑时间不能同步的多数原因是由于电脑主板上工作电池老化,或者电脑84消毒液使用方法(84消毒液,你用对了吗?)84消毒液使用方法(84消毒液,你用对了吗?)84消毒液被广泛用于单位和家庭的卫生消毒,在超市一般有多种品牌和包装的84消毒液出售。84消毒液的主要消毒成分是次氯酸钠,有效氯含量5汽车玻璃划痕(车窗玻璃有划痕怎么办)汽车玻璃划痕(车窗玻璃有划痕怎么办)汽车玻璃划痕十分影响汽车美观,那汽车玻璃划痕是否可以修复呢?下面一起来看看汽车玻璃划痕修复小窍门。汽车玻璃划痕修复小窍门第一步玻璃表面清洁,及玻车身划痕修复方法(车漆有划痕别往4S店跑)车身划痕修复方法(车漆有划痕别往4S店跑)子开久了,难免出现划痕。有些是不小心被绿化带的灌木枝划的有些是停车时不小心擦碰的车门把手处常被指甲刮到,更会惨不忍睹,这些小擦痕,重新喷漆
房屋常识我想问下外地人如何迁户口很多朋友们现在对于房产方面的知识了解的偏少,不管是从购房的角度,或者是装修房子的角度,我们都需要对房产方面的一些知识进行了解,所以小编今天就在网上搜集了一些房产方面相关的知识来分享房屋常识我想问下买了房子不迁户口可以吗很多朋友们现在对于房产方面的知识了解的偏少,不管是从购房的角度,或者是装修房子的角度,我们都需要对房产方面的一些知识进行了解,所以小编今天就在网上搜集了一些房产方面相关的知识来分享房屋常识我想问一下我父母上个月通过中介二手交易了一套住宅房产证上有我父母和我的名字但是做商业贷款的时候贷款人是我父母我并没有贷款这样我可以申请一年提现一次公积金吗很多朋友们现在对于房产方面的知识了解的偏少,不管是从购房的角度,或者是装修房子的角度,我们都需要对房产方面的一些知识进行了解,所以小编今天就在网上搜集了一些房产方面相关的知识来分享房屋常识买过一套房用的商业贷款已经卖了现在要买一套全部用公积金贷款可以吗很多朋友们现在对于房产方面的知识了解的偏少,不管是从购房的角度,或者是装修房子的角度,我们都需要对房产方面的一些知识进行了解,所以小编今天就在网上搜集了一些房产方面相关的知识来分享房屋常识公积金能还商贷吗我用商业贷款买的房现在能不能用公积金来还款很多朋友们现在对于房产方面的知识了解的偏少,不管是从购房的角度,或者是装修房子的角度,我们都需要对房产方面的一些知识进行了解,所以小编今天就在网上搜集了一些房产方面相关的知识来分享房屋常识2019用住房公积金贷款利率是多少很多朋友们现在对于房产方面的知识了解的偏少,不管是从购房的角度,或者是装修房子的角度,我们都需要对房产方面的一些知识进行了解,所以小编今天就在网上搜集了一些房产方面相关的知识来分享房屋常识住房公积金贷款首付多少住房公积金贷款最低首付款是什么意思很多朋友们现在对于房产方面的知识了解的偏少,不管是从购房的角度,或者是装修房子的角度,我们都需要对房产方面的一些知识进行了解,所以小编今天就在网上搜集了一些房产方面相关的知识来分享房屋常识个人公积金住房贷款上限是多少很多朋友们现在对于房产方面的知识了解的偏少,不管是从购房的角度,或者是装修房子的角度,我们都需要对房产方面的一些知识进行了解,所以小编今天就在网上搜集了一些房产方面相关的知识来分享房屋常识公积金缴存6个月了,可以贷款多少很多朋友们现在对于房产方面的知识了解的偏少,不管是从购房的角度,或者是装修房子的角度,我们都需要对房产方面的一些知识进行了解,所以小编今天就在网上搜集了一些房产方面相关的知识来分享房屋常识北京绿地新都会房子户型面积多大谁知道呢很多朋友们现在对于房产方面的知识了解的偏少,不管是从购房的角度,或者是装修房子的角度,我们都需要对房产方面的一些知识进行了解,所以小编今天就在网上搜集了一些房产方面相关的知识来分享房屋常识北京富力新城房子户型面积多大谁知道呢很多朋友们现在对于房产方面的知识了解的偏少,不管是从购房的角度,或者是装修房子的角度,我们都需要对房产方面的一些知识进行了解,所以小编今天就在网上搜集了一些房产方面相关的知识来分享