国语自产精品视频在线看:您身边最放心的安全下载站! 最新软件|热门排行|软件分类|软件专题|厂商大全

国语自产精品视频在线看

技术教程
您的位置:首页数据库类SQL Server → SQL Server数据库损坏检测以及SQL Server数据库修复的解决方案

SQL Server数据库损坏检测以及SQL Server数据库修复的解决方案

我要评论 2013/09/22 19:00:21 来源:国语自产精品视频在线看 编辑:zbbingyang.com [ ] 评论:0 点击:360次

在【zài】一个理想的✔世界中📅,不会存⏹在【zài】任何数据库【shù jù kù】📊的损坏,就像我们不会【men bú huì】将一些【jiāng yī xiē】严重意外情况【wài qíng kuàng】列入我【liè rù wǒ】们生活🐹中的日常一样🆗,而一旦【ér yī dàn】😝这类事【zhè lèi shì】情发生【qíng fā shēng】,一定会【yī dìng huì】对我们🕔的生活【de shēng huó】造成非常显著的影响🦊,在【zài】SQL Server中也同🥣样如此😙,或许几【huò xǔ jǐ】年内您没有遇【méi yǒu yù】见过数据库【shù jù kù】📊中出现这类情况【kuàng】😠,而一旦【ér yī dàn】😝遇见这类情况【kuàng】😠,往往伴【wǎng wǎng bàn】随着数👠据的丢失,宕机【dàng jī】📛,严重甚🍈至您本【zhì nín běn】身的职【shēn de zhí】业生涯😹也会受到影响【dào yǐng xiǎng】🚄。因此对🌀于这类情况【kuàng】😠,我们需要了解数据库【shù jù kù】📊损坏方面的知🥔识,以便我们能够🎋事前准备【bèi】,事后能🎐够处理。本篇文章会对【zhāng huì duì】💫数据库【shù jù kù】📊损坏的【sǔn huài de】原因【yuán yīn】、现象、事前和事后的一些处🚜理方法以及简单的修【dān de xiū】复方法进行探👪讨。

数据库为什么会损坏?

在了解🍞数据【jù】库🐴损坏之👆前【qián】,首先我们要了【men yào le】解SQL Server是如何将数据【jù】🙈保存到🌶数据文【shù jù wén】件【jiàn】(MDF、NDF等📎)。无论更新还是🏤插入数据【jù】,数据【jù】都需要首先在内存中的【cún zhōng de】💘Buffer Pool驻留🅰,然后通过CheckPoint和Lazy Writer等📎过程将【guò chéng jiāng】内存中的【cún zhōng de】💘数据【jù】持久化到【jiǔ huà dào】磁💌盘。在这个过程中,数据【jù】脏页由内👍存写入【cún xiě rù】持久化的【de】🚏IO子系统【zǐ xì tǒng】🐤,在此期✅间【jiān】,按照IO子系统【zǐ xì tǒng】🐤的不同【de bú tóng】😌,数据可【shù jù kě】能经过这几层:

Windows(写数据【xiě shù jù】♒一定调用的是WINDOWS API)

Windows底层的中间层(杀毒软😌件,磁盘加【cí pán jiā】🤽密系统【mì xì tǒng】)

网卡【wǎng kǎ】👿、路由器、交换机【jiāo huàn jī】、光钎、网线等(如果✌IO子系统不是直连的话【lián de huà】🔨)

SAN控制器(如果使用了SAN)

RAID控制器【kòng zhì qì】🍿(IO子系统做了RAID)

磁盘或SSD等持久化存储器

因此【yīn cǐ】🖼,数据页⛲被写入持久化🎐存储期【cún chǔ qī】👅间,可能经💮过上述【guò shàng shù】🤽列表中的几项。在经历上述过程中,硬件环【yìng jiàn huán】🐩境会受【jìng huì shòu】到很多方面🕡的影响【de yǐng xiǎng】,比如说【bǐ rú shuō】🤸电压是否稳定、断电、温度过高或过低🛣、潮湿程度等🚖,而软件方面🕡,由于软件都是人写的,因此【yīn cǐ】🖼就可能存在【cún zài】BUG,这些都【zhè xiē dōu】可能导【kě néng dǎo】致数据📈页在传【yè zài chuán】输过程【shū guò chéng】中出现【zhōng chū xiàn】错误🆕。

此外,影响磁🍏盘的因素【yīn sù】也包📬括电压【kuò diàn yā】是否稳定、灰尘等【huī chén děng】因素【yīn sù】,这些也有可能引起磁【yǐn qǐ cí】🥁盘坏道【pán huài dào】🚱或整体📢损坏。

上面提到的所有因素🖕都可以🌅被归结【bèi guī jié】为IO子系统🕧。因此,造成数【zào chéng shù】据损坏🐩的情况【de qíng kuàng】绝大部分是由IO子系统🕧引起的,还有非常非常👠小的概【xiǎo de gài】✋率内存芯片也会导致【huì dǎo zhì】数据页🤱损坏🐩,但这部分情况【fèn qíng kuàng】微【wēi】乎其💳微【wēi】,因此不在本文【zài běn wén】💙的讨论【de tǎo lùn】之列【zhī liè】。

上面提到的这些导致【xiē dǎo zhì】数据损坏的原【huài de yuán】👖因都属于天灾【yú tiān zāi】🍨,还有一【hái yǒu yī】些人祸【xiē rén huò】🦏。比如说通过编辑器等⏯手动编【shǒu dòng biān】辑数据🐡文件、数据库中还有【zhōng hái yǒu】🚘需要【xū yào】Redo和Undo的事务时🎙(也就是♊没有📞Clean Shutdown)删除了日志文件(通常会导致数据库质【jù kù zhì】疑)。

发现数据库损坏

在我们【zài wǒ men】知道可能造成🧦数据库【jù kù】💍的损坏原因之【yuán yīn zhī】💁后,接下来我们来💈看【kàn】SQL Server是如何👇监测数【jiān cè shù】据库【jù kù】💍页损坏的。

在🛁SQL Server的数据库级别⏫,可以设【kě yǐ shè】置页保护类型🍌,一共有三个选【sān gè xuǎn】项【xiàng】:None,CheckSum,Torn_Page_Detection,如图🏔1所示【suǒ shì】:


图1.页保护的三种选项

关于这三种选项🎳,首先【shǒu xiān】,请无视🛥None,请不要在任何🦔场景下【chǎng jǐng xià】选择该【xuǎn zé gāi】🤥选项🎳,该选项【gāi xuǎn xiàng】🎳意味着SQL Server不对页进行保护【hù】🏭。

其次是🔕TORN_PAGE_DETECTION,在【zài】SQL Server中【zhōng】👕,数据的🈷最小单位【wèi】是🔕页【yè】💃,每一页【yè】⚡是🔕8K,但是对【dàn shì duì】🥁应磁盘【yīng cí pán】上往往是🔕16个【gè】512字节的扇区【shàn qū】🏦,如果一【rú guǒ yī】✊个【gè】页【yè】💃在写入【zài xiě rù】持久化存储的过程中【zhōng】👕,只写了【zhī xiě le】一半的页【yè】💃,这就是🔕所谓的📣TORN_PAGE_DETECTION,SQL Server通过每个【gè】扇区【shàn qū】🏦提🕗512字节中【zhōng】👕前【qián】2位【wèi】作为元数据【yuán shù jù】✌,总共16个【gè】扇区【shàn qū】🏦32位【wèi】4字节的元数据【yuán shù jù】✌(页【yè】头中【zhōng】😨标识为:m_tornBits),通过该元数据【yuán shù jù】✌来检测是🔕否存在【zài】部分🌦写的📃TORN_PAGE,但该类型的页【yè】🚺验证无法检测出页中【chū yè zhōng】🖕的写入错误🕚,因此在【yīn cǐ zài】SQL Server 2005及以上版本【bǎn běn】,尽量选择【zé】🈹CheckSum。

在【zài】📷SQL Server 2005及以上版本【bǎn běn】,引入了CheckSum,CheckSum可以理解为【jiě wéi】🔱校验和【xiào yàn hé】,当数据🖤页被写⏮入持久🕡化存储时,会根据【huì gēn jù】💌页的值【yè de zhí】😝计算【jì suàn】出一个【yī gè】🐀4字节的【de】CheckSum存于页头【tóu】(页头【tóu】中标识同为【wéi】🔱:m_tornBits),和数据【hé shù jù】⬅在【zài】📷同一页中一🍸起保存在数据【zài shù jù】💶库中【kù zhōng】🏳。当数据🖤从【cóng】IO子系统🐉被读取到内存🐌中时,SQL Server会根据【huì gēn jù】💌页内的【de】值再次计算【jì suàn】CheckSum,用该重新计算【jì suàn】🚳的【de】CheckSum和页头【tóu】中存储🧛的【de】CheckSum进行比【jìn háng bǐ】对,如果比对失败【duì shī bài】,则SQL Server就会认为【wéi】🔱该页被损坏。

由【yóu】🐱CheckSum的过程【de guò chéng】可以看出【chū】👺,只有在页被写入SQL Server的过程【de guò chéng】中才会【zhōng cái huì】计算🐸CheckSum,因此如果仅仅📈改变数据库选🏅项的话,则页头【zé yè tóu】🍷中的该【zhōng de gāi】元数据并不会随之改😀变。

与IO相关的三种错误

通过上【tōng guò shàng】述CheckSum的原理🆑可以看【kě yǐ kàn】💃出,SQL Server可以检测出页损坏,此时,具体的【jù tǐ de】表现形式可能📃为下述🔏三种【zhǒng】错🏪误的一【wù de yī】种【zhǒng】:

823错误【cuò wù】,也就是🚍所谓的硬➖IO错误【cuò wù】,可以理解为【jiě wéi】SQL Server希望读👃取页【qǔ yè】💞,而Windows告诉【gào sù】SQL Server,无法读🕗取到该【qǔ dào gāi】页。

824错误,也就是【yě jiù shì】所谓的🐪软IO错误,可以理【kě yǐ lǐ】解为🐵SQL Server已经读取到该页【yè】,但通过【dàn tōng guò】🕛计算😠CheckSum等值发【děng zhí fā】🎥现不匹【xiàn bú pǐ】配,因此SQL Server认为该页【yè】已经被损坏🙄。

825错误,也就是所谓Retry错误。

其中, 上述823和👿824错误都是错误【shì cuò wù】等级为24的严重错误,因此会【yīn cǐ huì】被记录🚙在【zài】Windows应用程🌫序日志🐨和👿SQL Server的错误【de cuò wù】日志中,而引起【ér yǐn qǐ】该错误😉的页会【de yè huì】😴被记录🚙在【zài】msdb.dbo.suspect_pages中。SQL Server错误日【cuò wù rì】志中也会记录【huì jì lù】🎀到出错㊙页的编号,如图【rú tú】2所示💓。


图🚏2.824错误在😨SQL Server错误记🍪录中的【lù zhōng de】描述【miáo shù】

因此【yīn cǐ】,如果我🌷们存在🈚完善的💹备份的🐷话【huà】🤖,我们可【wǒ men kě】以通过备份进行页还🔖原(在此再次强调一下对【yī xià duì】于DBA来说【lái shuō】,有【yǒu】”备”无患【wú huàn】),一个简单的页还原代📷码如代码清单1所示【suǒ shì】🚞。

USE [master]

RESTORE DATABASE [Corrupt_DB] PAGE='1:155' 
FROM  DISK = N'C:\xxx.bak' 
WITH  FILE = 1,  NORECOVERY,  NOUNLOAD,  STATS = 5

代码【dài mǎ】⛩清单1.一个简单的页【yè】🔵还原代码【dài mǎ】⛩,从备份中还原🦋文件【wén jiàn】⛪ID1中的第155页【yè】

记得我们前面【men qián miàn】📓说的,在读取页【yè】🕝计算校验和时出错【chū cuò】,这既可【zhè jì kě】能是🦒被写入持久化存储的页【yè】🕝本身出【běn shēn chū】错,也可能⛽是在页【yè】🕝被读取的过程中【guò chéng zhōng】出错【chū cuò】,此时【cǐ shí】🐊SQL Server会尝试【huì cháng shì】从【cóng】IO子系统🤛中再次读取该【dú qǔ gāi】🌥页【yè】🕝,最多可🤒能是🦒4次尝试【cì cháng shì】⛔,如果在😳4次尝试【cì cháng shì】⛔过程中【guò chéng zhōng】校验和通过,则会是【zé huì shì】📺825错误【cuò wù】🔝,否则是🧤824错误【cuò wù】🔝。这里要注意,与823和824错误不【cuò wù bú】🏷同的是🌮,825错误【cuò wù】🔝是一个等级仅为10的信息。

因此,由于有固定的错误编🗨号【hào】,因此可以在【yǐ zài】SQL Server Agent中对【zhōng duì】🍤823和【hé】824设置警〽报🏎。

备份CheckSum

上述页CheckSum只有在页被使【yè bèi shǐ】用时才☝会被校验页的【yàn yè de】正确性【zhèng què xìng】😑。在备份🏃数据库时👈,可以指定🍼CheckSum选项来【xuǎn xiàng lái】使得备👿份读取的页也计算校验和【yàn hé】,从而保【cóng ér bǎo】证了被【zhèng le bèi】备份的数据库是没有👧损坏的📅。在图3的备份【de bèi fèn】选项我【xuǎn xiàng wǒ】们可以注意到🆔这两条:


图📡3.CheckSum和💂Continue_After_Error选项

如果启🥑用了【le】CheckSum,当备份🆚过程中发现了【fā xiàn le】😗页校验【yè xiào yàn】🧚和错误【hé cuò wù】时🛳,就会终🦃止备份,而启用了【le】Continue_After_Error选项的【xuǎn xiàng de】话,在检测到校验和错误【hé cuò wù】时🛳,仍然继【réng rán jì】续从而🖕使得备份成功。

备份如果启用【guǒ qǐ yòng】了💰CheckSum选项😰,除去检测每一页的校验和之外【wài】🌦,还会在【hái huì zài】🤚备份完成后【chéng hòu】,对整个【duì zhěng gè】备份计🏋算校验和并存🌗储于备份头中【fèn tóu zhōng】。

此外,对于备份【fèn】,我们还🔦可以通过【guò】Restore Verifyonly with CheckSum来验证🎃备份【fèn】,来保证备份的【bèi fèn de】🚘数据没【shù jù méi】有被损坏🐾。

DBCC CheckDB

前面提到【dào】🌓SQL Server发现错【fā xiàn cuò】误的方【wù de fāng】法有两种,分别为在读取【zài dú qǔ】页⛵时【shí】😝和在备【hé zài bèi】份🗳时【shí】😝(本质上也是读取页⛵)。但如果我们希👂望对于数据一【shù jù yī】🗓致性的检查更【jiǎn chá gèng】🌃加的激进⭕,那我们【nà wǒ men】应该定期使用🍺CheckDB来检查数据的【shù jù de】一致性,而不至👩于在生产时【shí】😝间数据【jiān shù jù】被读取时【shí】😝才能发现错【fā xiàn cuò】误。

CheckDB命令会对整个【duì zhěng gè】数据库做所有的一致【de yī zhì】性检查🖇。当检查【dāng jiǎn chá】🔪对象是🏤Master数据库时,CheckDB还会检【hái huì jiǎn】🌍查🔪ResourceDB。

CheckDB最简单【zuì jiǎn dān】🍦的用法如代码【rú dài mǎ】☝清单【qīng dān】2所示📽,在当前数据库上下文💂中直接执行【zhí háng】🍺CheckDB,将会检查当前【chá dāng qián】数据库中所有的一切。

DBCC CHECKDB

代码清单【dān】🐺2.CheckDB最简单【zuì jiǎn dān】🐺的用法🎏

CheckDB命令在【mìng lìng zài】👁企业版🙎中会使【zhōng huì shǐ】用多线【yòng duō xiàn】程来进【chéng lái jìn】行【háng】👺,会对整🍹个数据库进行【háng】👺一致性【yī zhì xìng】✌检查,在该过【zài gāi guò】程中,使用了内建数🚩据库快【jù kù kuài】照的方式进行【háng】🤸,因此不会造成阻塞【zǔ sāi】,但😪CheckDB会消耗【huì xiāo hào】大量的CPU、内存和🥒IO。因此CheckDB要选择在维护🦕窗口时间或是系统闲时进行【háng】👺。

默认情况下,CheckDB命令会将输出📢所有的信息【xìn xī】🛁,但通常【dàn tōng cháng】我们并不关心🌄这些信息【xìn xī】🛁,而是只【ér shì zhī】关心错【guān xīn cuò】误信息【xìn xī】🛁,因此实际中通【jì zhōng tōng】🥣常给【cháng gěi】DBCC指定不显式信🕘息的参【xī de cān】🗃数🐴,如代码清单【qīng dān】🕓3所示。

DBCC CHECKDB WITH NO_INFOMSGS;

代码清【dài mǎ qīng】单🚧3.CheckDB通常搭配No_InfoMsgs参数【cān shù】🚈

实际上📣,CheckDB是一套🔛命令的【mìng lìng de】♈汇总【huì zǒng】,CheckDB会依次检查下述内容【shù nèi róng】:

初次检查系统表

分配单【fèn pèi dān】元检查🏜(DBCC CHECKALLOC)

完整检查系统表

对所有🔵表进行一致性逻辑检【luó jí jiǎn】🎏查【chá】(DBCC CHECKTABLE)

元数据😁检查【jiǎn chá】(DBCC CHECKCATALOG)

SSB检查

索引视图、XML索引等检查

首先【shǒu xiān】🕳,当发现系统表🎼损坏时【sǔn huài shí】,只能通【zhī néng tōng】🍣过备份【guò bèi fèn】进行恢复(这也是【zhè yě shì】为什么【wéi shí me】备份除😓TempDB之外的🛳系统表🎼非常重要【yào】)。其次,在一个📛大数据🕗库中【kù zhōng】🍐,做一次【zuò yī cì】CheckDB时间🛄会非常长,维护窗🦗口时间🛄或系统闲时的【xián shí de】时间🛄可能无法Cover这段时【zhè duàn shí】🏸间🛄,那么我们可以😻将【jiāng】CheckDB的任务分散到CHECKALLOC、DBCC CHECKTABLE、DBCC CHECKCATALOG这三个命令中。

更多关【gèng duō guān】于CheckDB的详细【de xiáng xì】🎟信息,请参阅🗾:http://technet.microsoft.com/en-us/library/ms176064.aspx。

数据库损坏的修复

数据库【shù jù kù】损坏最

关键词🧣:SQL,数据库【shù jù kù】,解决方🕗案【àn】

阅读本文后您有什么感想? 已有 人给出评价!

  • 0 欢迎喜欢
  • 0 白痴
  • 0 拜托
  • 0 哇
  • 0 加油
  • 0 鄙视