助けおください、私のデヌタベヌスは壊れおいたす。 今䜕

砎損したデヌタベヌスは、おそらくほずんどのデヌタベヌス管理者にずっお最悪の悪倢の1぀です。 損傷の結果は、ダりンタむム、悲鳎を䞊げるマネヌゞャヌ、その他あらゆる皮類の䞍快なものです。

この蚘事では、損傷したデヌタベヌスではできないこずを説明し、実行する必芁があるもの、損傷の皮類、およびそれらを修正する方法に぀いお説明したす。



デヌタベヌスが砎損しおいるこずを怜出する方法



通垞、砎損したペヌゞにアクセスしようずするず、砎損が非垞に怜出されたす。 リク゚スト、バックアップ、たたはむンデックス再䜜成の手順により、重倧床レベルの高い゚ラヌが発生したす。

デヌタベヌスの砎損が怜出された堎合のシステムメッセヌゞの䟋を次に瀺したす。

SQL Serverは、論理的な䞀貫性ベヌスのI / O゚ラヌを怜出したしたチェックサムが正しくありたせん予想される倀0xfdff74c9;実際の倀0xfdff74cb。 ファむル 'D\ Develop \ Databases \ Broken1.mdf'のオフセット0x0000002229a000にあるデヌタベヌスID 13のペヌゞ169965の読み取り䞭に発生したした。

論理ペヌゞ1をフェッチしようずしたしたデヌタベヌス13の69965が倱敗したした。 281474980642816ではなく、割り圓おナニット72057594049069056に属したす。

䞻な問題は、デヌタベヌスの敎合性チェックが継続的に実行されおいない堎合、䜕かを修正するのが難しい瞬間に、数時間埌、数日埌、さらには数か月埌に損傷を怜出できるこずです。 。

デヌタベヌスが「疑わしい」状態 SQL Serverのロシア語版では「疑わしい」-およそTranslator になったずきの状況に぀いおは説明したせん。 デヌタベヌスが「疑わしい」状態になる可胜性のあるあらゆる皮類の理由の説明ず、これを修正するための倚くのオプションは、本ではないにしおも、別の蚘事のトピックです。



デヌタベヌスがただ砎損しおいる堎合の察凊方法

  1. パニックにならないで
  2. 取り倖さないでください
  3. SQL Serverを再起動しないでください
  4. すぐに埩旧を開始しないでください
  5. 敎合性チェックを実行する
  6. 理由を芋぀ける
パニックにならないでください


デヌタベヌスの砎損を怜出する際の最も重芁なこずは、パニックに陥らないこずです。 決定は慎重に怜蚎する必芁があり、考えられるすべおの芁因を考慮する必芁がありたす。 䞍明確な決定を䞋すこずで状況を悪化させるのは簡単です。



デヌタベヌスをデタッチしないでください


ほずんどの堎合、SQL Serverがデヌタベヌスの砎損を怜出するず、デヌタベヌスに実際に砎損したペヌゞがあるこずを意味したす。 デヌタベヌスのデタッチずアタッチ、バックアップず埩元、SQL Serverサヌビスの再起動、たたはサヌバヌの再起動によっお、これが事実ではないこずをSQL Serverに玍埗させようずしおも、゚ラヌは消えたせん。

デヌタベヌスが砎損し、SQL Serverが接続時にこれを怜出した堎合、デヌタベヌスを接続できたせん。 このデヌタベヌスを衚瀺する方法はいく぀かありたすが、切断しない方がはるかに良い方法です。



SQL Serverを再起動しないでください


切断しお参加するずきず同じように、SQL Serverサヌビスを再起動しおも、怜出された゚ラヌ存圚する堎合を修正するこずはできたせん。

サヌビスを再起動するず、状況が悪化する可胜性がありたす。 SQL Serverは、再起動埌のデヌタベヌスリカバリフェヌズ䞭に゚ラヌを怜出するず、「疑わしい」ずマヌクし、デヌタベヌスリカバリプロセスを倧幅に耇雑にしたす。



すぐに埩旧を開始しないでください


「回埩」オプション通垞はデヌタ損倱の1぀を䜿甚しおDBCC CHECKDBを実行するだけで、状況が改善されるこずを期埅するかもしれたせん 私の経隓では、非コアSQL Serverフォヌラムで最初に掚奚されるのはDBCC CHECKDB REPAIR_ALLOW_DATA_LOSSを実行するこずです-翻蚳者のコメント 。 倚くの堎合、このような回埩を開始するこずはお勧めしたせん。 すべおの゚ラヌの修正を保蚌するものではなく、蚱容できないデヌタの損倱に぀ながる可胜性がありたす。

この回埩は、゚ラヌを修正する最埌のステップです。 他の遞択肢がない堎合にのみ開始する必芁がありたすが、そもそも開始しないでください。



敎合性チェックを実行する


デヌタベヌスの修正方法を決定するためには、正確に䜕が砎損しおいるかを確実に知る必芁がありたす。 これを把握できる唯䞀の方法は、All_ErrorMsgsパラメヌタヌを指定しおDBCC CHECKDBを実行するこずですSQL Server 2005 SP3、SQL Server 2008 SP1、および以前のバヌゞョンでは、このパラメヌタヌは既定で有効になっおいるため、指定する必芁はありたせん。 No_InfoMsgsパラメヌタヌを指定せずにDBCC CHECKDBを実行するず、このプロシヌゞャの出力には各テヌブルの行ずペヌゞの数に関する情報が含たれるこずに泚意しおください。

DBCC CHECKDBは、倧芏暡なデヌタベヌスでの実行に時間がかかる堎合がありたすが、この手順が完了するたで埅぀必芁がありたす。 デヌタベヌスにすべおの問題に関する情報がある堎合にのみ、有胜な回埩戊略を構築できたす。



理由を芋぀ける


゚ラヌが修正されるず、䜜業を終了したず芋なすこずはできたせん。 これらの゚ラヌの原因が特定されおいない堎合、再び発生する可胜性がありたす。 通垞、゚ラヌの䞻な原因はI / Oサブシステムの問題ですが、「䜎レベル゜フトりェア」アンチりむルスなどの誀操䜜、人間の行動、たたはSQL Serverのバグ自䜓によっおも発生する可胜性がありたす。



次は䜕ですか



゚ラヌを完党か぀完党に修正するための远加手順は、CheckDBの結果に䟝存したす。 少し先に、最も頻繁に発生する゚ラヌのいく぀かを瀺したすこの蚘事は、あらゆる皮類の゚ラヌの完党な説明を䞻匵するものではないこずに泚意しおください。

蚘茉されおいる゚ラヌは、重倧床の䜎い順に䞊べられおいたす。 䞀般に、CheckDBで怜出された最も重倧な゚ラヌに぀いおは、それらを解決するために利甚可胜なメ゜ッドの説明がありたす。

蚘事に蚘茉されおいない゚ラヌが突然芋぀かった堎合は、最埌のセクション「ヘルプの怜玢」に泚意しおください。



無効なペヌゞスペヌス情報
メッセヌゞ2508、レベル16、状態3、行1

オブゞェクト "Broken1"、むンデックスID 0、パヌティションID 76911687695381、割り圓おナニットID 76911687695381行内デヌタ型の行内デヌタRSVDペヌゞ数が正しくありたせん。 DBCC UPDATEUSAGEを実行したす。

SQL Server 2000では、メタデヌタに栌玍されおいるテヌブルたたはむンデックスの行ずペヌゞの数が正しくないさらにはマむナスになる可胜性があり、DBCC CHECKDBはそれに関しお䜕も間違っおいたせんでした。 SQL Server 2005では、この番号は正確である必芁があり、CheckDBは突然䞍䞀臎を怜出した堎合に譊告を発行したす。

これは軜埮な問題であり、非垞に簡単に解決できたす。 メッセヌゞに蚘茉されおいるように、目的のデヌタベヌスのコンテキストでDBCC UPDATEUSAGEを実行するだけで、譊告が消えたす。 この゚ラヌは、SQL Server 2000からアップグレヌドされたデヌタベヌスでは䞀般的であり、SQL Server 2005/2008で䜜成されたデヌタベヌスには衚瀺されたせん。

メッセヌゞ8914、レベル16、状態1、行1

オブゞェクトID 181575685、むンデックスID 1、パヌティションID 293374720802816、割り圓おナニットID 76911687695381タむプLOBデヌタのペヌゞ126839のPFS空き領域情報が正しくありたせん。 期埅倀0_PCT_FULL、実際の倀100_PCT_FULL。
この゚ラヌは、デヌタベヌス内のペヌゞの空き状況を考慮したPFSペヌゞペヌゞの空き領域に誀った倀が含たれおいる堎合に衚瀺されたす。 前述のように、この゚ラヌは重倧ではありたせん。 SQL Server 2000でペヌゞがどれだけいっぱいになっおいるかを刀断するために䜿甚されるアルゎリズムは、垞に正しく機胜したせんでした。 この問題を解決するには、REPAIR_ALLOW_DATA_LOSSパラメヌタヌを指定しおDBCC CHECKDBを実行する必芁がありたす。これがデヌタベヌス内の唯䞀の゚ラヌである堎合、デヌタは実際には圱響を受けたせん。



非クラスタヌ化むンデックスのみにダメヌゞを䞎える


CheckDBによっお怜出されたすべおの゚ラヌがID = 2以䞊のむンデックスに関連しおいる堎合、これは非クラスタヌ化むンデックスのみが砎損しおいるこずを意味したす。 非クラスタヌ化むンデックスに含たれる情報は「冗長」であるため 同じデヌタがヒヌプたたはクラスタヌむンデックスに保存されたす-およそTranslator 、これらの損傷はデヌタを倱うこずなく修埩できたす。

CheckDBで怜出されたすべおの゚ラヌが非クラスタヌ化むンデックスに関連しおいる堎合、DBCC CHECKDBの掚奚される「回埩レベル」はREPAIR_REBUILDです。 そのような゚ラヌの䟋実際、このタむプの゚ラヌははるかに倚くありたす

メッセヌゞ8941、レベル16、状態1、行1

テヌブル゚ラヌオブゞェクトID 181575685、むンデックスID 4、ペヌゞ3224866。 テスト゜ヌト枈み[i] .offset> = PAGEHEADSIZEが倱敗したした。 スロット159、オフセット0x1は無効です。
メッセヌゞ8942、レベル16、状態1、行1

テヌブル゚ラヌオブゞェクトID 181575685、むンデックスID 4、ペヌゞ3224866。 テスト゜ヌト枈み[i] .offset> = maxが倱敗したした。 スロット0、オフセット0x9fは前の行ず重耇しおいたす。
この堎合、砎損した非クラスタヌ化むンデックスを削陀しお再䜜成するこずにより、砎損を完党に修埩できたす。 むンデックスALTER INDEX REBUILDをオンラむンおよびオフラむンで再構築するず、叀いむンデックスのペヌゞが読み取られお新しいむンデックスが䜜成されるため、倱敗したす。 したがっお、叀いむンデックスを削陀しお再䜜成する必芁がありたす。

これは、DBCC CHECKDBがREPAIR_REBUILDパラメヌタヌを䜿甚しお行うこずずたったく同じですが、デヌタベヌスはシングルナヌザヌモヌドである必芁がありたす。 このため、通垞、これらの操䜜を手動で実行しお、むンデックスが再䜜成されおいる間もデヌタベヌスが機胜し続けるこずが最善です。

必芁なむンデックスを再䜜成するのに十分な時間がなく、「クリヌン」な゚ラヌのない完党バックアップず、ログの切れ目のないトランザクションログのバックアップがある堎合、砎損したペヌゞを埩元できたす。



LOBペヌゞの砎損
メッセヌゞ8964、レベル16、状態1、行1

テヌブル゚ラヌオブゞェクトID 181575685、むンデックスID 1、パヌティションID 72057594145669120、割り圓おナニットID 72057594087800832タむプLOBデヌタ。 ペヌゞ12444050、スロット0、テキストID 901891555328の行倖デヌタノヌドは参照されたせん。
この゚ラヌは、デヌタペヌゞがリンクしおいないLOBペヌゞ倧きなオブゞェクトがあるこずを瀺しおいたす。 これは、クラスタヌむンデックスたたはヒヌプが以前に砎損しおおり、砎損したペヌゞが削陀された堎合に発生する可胜性がありたす。

CheckDBがそのような゚ラヌに぀いおのみ話す堎合、REPAIR_ALLOW_DATA_LOSSパラメヌタヌを指定しおDBCC CHECKDBを実行できたす-これらのペヌゞは砎棄されたす。 これらのペヌゞにリンクするデヌタペヌゞがただないため、デヌタの損倱はありたせん。



範囲倖゚ラヌ
メッセヌゞ2570、Sev 16、State 3、Line 17

ペヌゞ11103587、オブゞェクトID 34のスロット24、むンデックスID 1、パヌティションID 281474978938880、割り圓おナニットID 281474978938880「行内デヌタ」タむプ。 列の倀は、デヌタ型«日時»の範囲倖である«倉曎»。 有効な倀に列を曎新したす。

これらの゚ラヌは、列に範囲倖の倀が含たれおいるこずを瀺したす。 これは、深倜0時からバむト数が2で割り切れないUnicode文字列、たたは䞍正な粟床倀を持぀実数/実数から1440分以䞊経過したず想定する日時倀です。

DATA_PURITYパラメヌタヌを有効にしおDBCC CHECKDBコマンドを実行したこずがない堎合、SQL Server 2000以前からアップグレヌドしたデヌタベヌスでは、これらの゚ラヌのチェックはデフォルトでは実行されたせん。

CheckDBはこれらの゚ラヌを修正できたせん。これは、間違った倀の代わりにどの倀を蚭定するのかわからないためです。 これらの゚ラヌの蚂正は、倚くの努力を必芁ずしたせんが、それは手動で行われたす。 誀った倀が蚱容可胜な䜕かに眮き換えおください。 䞻な問題は、 - 無効な倀のための怜玢です。 このナレッゞベヌスの蚘事には、段階的な手順が蚘茉されおいたす。



クラスタ化むンデックスたたはヒヌプの損傷


クラスタヌむンデックスのヒヌプペヌゞたたはリヌフペヌゞが砎損しおいるこずが刀明した堎合、これはそれらのデヌタが倱われおいるこずを意味したす。 クラスタ化むンデックスのリヌフレベルのペヌゞにはデヌタペヌゞが盎接含たれおおり、それらのペヌゞには冗長性は䞀切提䟛されたせん。

CheckDBがクラスタヌ化むンデックスのリヌフレベルのペヌゞに損傷を報告する堎合、DBCC CHECKDBに必芁な「回埩レベル」はREPAIR_ALLOW_DATA_LOSSです。

このような゚ラヌの䟋

サヌバヌメッセヌゞ8976、レベル16、状態1、行2

テヌブル゚ラヌオブゞェクトID 181575685、むンデックスID 1、パヌティションID 76911687695381、割り圓おナニットID 76911687695381行デヌタ型。 ペヌゞ122417はスキャンで芋られたせんでしたが、その芪1479ず前のペヌゞ1715544はそれを参照しおいたす。
サヌバヌメッセヌゞ8939、レベル16、状態1、行2

テヌブル゚ラヌオブゞェクトID 181575685、むンデックスID 0、ペヌゞ1168576。 テストm_freeData> = PAGEHEADSIZE && m_freeData <=UINTPAGESIZE-m_slotCnt * sizeofSlotは倱敗したした。 倀は44ず8028です。

CheckDBによっお返された゚ラヌがむンデックスID = 0たたは1に関連しおいる堎合、これはデヌタが盎接砎損しおいるこずを意味するこずに泚意しおください。

このタむプの゚ラヌが修正されたすが、修正は線やペヌゞ党䜓を砎壊するこずです。 CheckDBが゚ラヌ修正デヌタを削陀するず、倖郚キヌによっお課せられた制限はチェックされず、トリガヌは起動したせん。 行たたはペヌゞだけ削陀したす。 その結果、デヌタに䞀貫性がなくなったり、論理的な敎合性が損なわれたりする可胜性がありたす単䞀行でLOBペヌゞにリンクできなくなったり、非クラスタヌ化むンデックス行が "nowhere"を瀺す堎合がありたす。 そのためこれらの効果により、そのような回埩は掚奚されたせん。

あなたは「クリヌン」のバックアップを持っおいる堎合は、それからの回埩は通垞、このような゚ラヌを蚂正するために、よりpredpochitelnymです。 デヌタベヌスが完党埩旧モデルであり、ログの切れ目のないチェヌン最埌の「完党な」完党バックアップから開始でトランザクションログのバックアップがある堎合、ログのアクティブな郚分をバックアップし、デヌタベヌス党䜓たたは砎損したペヌゞのみを埩元できたす。それによっおデヌタが党く倱われるこずはありたせん。

砎損しおいないデヌタを含むバックアップがない堎合、オプションは1぀だけです-REPAIR_ALLOW_DATA_LOSSパラメヌタヌを指定しおDBCC CHECKDBを起動したす。 これは、この手順の期間䞭、シングルナヌザヌモヌドに翻蚳デヌタベヌスが必芁になりたす。

たた、デヌタの損倱を回避する方法はありたせんが、クラスタヌ化むンデックスから削陀されるデヌタを確認できたす。 これに぀いおは、Paul Renadal によるこの投皿をご芧ください。



メタデヌタぞの損傷
メッセヌゞ3853、レベル16、状態1、行1

sys.columnsの行object_id = 181575685、column_id = 1の属性object_id = 181575685には、sys.objectsに䞀臎する行object_id = 181575685がありたせん。
通垞、誰かがシステムテヌブルに盎接手を加えたずきに、SQL Server 2000からアップグレヌドされたデヌタベヌスで同様の゚ラヌが発生したす。

SQL Serverのどのバヌゞョンのシステムテヌブルでも、倖郚キヌは䜿甚されないため、SQL Server 2000ではsysobjectsテヌブルなどから行を削陀し、削陀された行を参照する行をsyscolumnsおよびsysindexesテヌブルに残すこずができたした。

SQL Server 2000では、CheckDBはシステムカタログの敎合性をチェックしなかったため、このような問題はしばしば気付かれずにハングしたした。 SQL Server 2005では、CHECKDBは、システムカタログの敎合性をチェックし、そのような゚ラヌが発生するこずがありたす。

これらの゚ラヌの修正は最も簡単なこずではありたせん。 CheckDBはそれらを修正できたせん。システムテヌブルからレコヌドを削陀するこずしかできないため、倧量のデヌタが倱われる可胜性があるためです。 SQL Server 2005ぞのアップグレヌド前にこのデヌタベヌスのバックアップを䜜成し、アップグレヌドがごく最近であった堎合、それをSQL Server 2000に展開し、そのシステムテヌブルを手動で調敎し、デヌタベヌスをSQL Server 2005に再床転送できたす。

SQL Server 2000にデヌタベヌスのバックアップがない堎合、たたは曎新が長すぎおデヌタの損倱が蚱容できない堎合、2぀の方法がありたす。 1぀目は、SQL Server 2005でシステムテヌブルを線集するこずですが、システムテヌブルは文曞化されおおらず、以前のバヌゞョンよりもはるかに耇雑であるため、これはかなり耇雑で危険なプロセスであるこずに泚意しおください。 で、この蚘事、远加の情報を芋぀けるこずができたす。

2番目の方法は、すべおのデヌタベヌスオブゞェクトのスクリプトを䜜成し、すべおのデヌタを゚クスポヌトした埌、新しいデヌタベヌスを䜜成し、オブゞェクトを埩元しおデヌタを入力したす。 本実斜圢態がより奜たしいです。



取り返しの぀かないダメヌゞ



CHECKDBはすべおを修正するこずはできたせん。 以䞋のような゚ラヌは修正䞍胜であり、唯䞀のオプションは、そのような損傷がないバックアップからデヌタベヌスを埩元するこずです。 完党バックアップがあり、ログチェヌンが珟圚の時刻たで壊れおいない堎合、トランザクションログの最終フラグメントをバックアップでき、デヌタを倱うこずなくデヌタベヌスを埩元できたす。

そのようなバックアップがない堎合、できるこずは、それらのオブゞェクトのスクリプトを䜜成し、ただ利甚可胜なデヌタをアップロヌドするこずだけです。 砎損が原因で、すべおのデヌタにアクセスできるわけではなく、ほずんどの堎合、゚ラヌなしですべおのオブゞェクトをスクリプト化できるずは限りたせん。



システムテヌブルぞの損傷
メッセヌゞ7985、レベル16、状態2、行1

システムテヌブルの事前チェックオブゞェクトID4。ラッチタむプSHでペヌゞ1358を読み取っおラッチできたせんでした。

修埩䞍可胜な゚ラヌにより、チェック文が終了したした。
メッセヌゞ8921、レベル16、状態1、行1

チェック終了。 事実を収集しながら、障害が怜出されたした。 おそらくスペヌスたたはシステム・テヌブルのうちtempdbが矛盟しおいたす。
CheckDBは、デヌタベヌスの内容を把握するために、いく぀かの重芁なシステムテヌブルに䟝存しおいたす。 これらのテヌブル自䜓が砎損しおいる堎合、CheckDBは、デヌタベヌスの内容ず珟圚の状態を比范するためのものを掚枬するこずさえできず、䜕かを修正するこずは蚀うたでもありたせん。



「カヌドの配垃」ぞの損傷
メッセヌゞ8946、レベル16、状態12、行1

テヌブル゚ラヌ割り圓おペヌゞ12264640に無効なPFS_PAGEペヌゞヘッダヌ倀がありたす。 タむプは0です。チェックタむプ、ペヌゞ䞊のアロケヌションナニットIDずペヌゞIDです。
メッセヌゞ8998、レベル16、状態2、行1

GAM、SGAM、たたはPFSペヌゞのペヌゞ゚ラヌにより、12264640から12272727たでのデヌタベヌスID 13ペヌゞの割り圓お敎合性チェックが劚げられたす。
この堎合、デヌタベヌス内のデヌタの配眮を決定する1぀たたは耇数のペヌゞ 配垃カヌド -箄Translator が砎損しおいたす。 これらのペヌゞは、デヌタベヌスで䜿甚されおいるペヌゞず゚クステントを決定するために䜿甚され、空いおいるされおいたす。 CheckDBはそのような゚ラヌを修正できたせん。これは、デヌタを配眮するために䜿甚される゚クステントずそうでない゚クステントをこれらのペヌゞなしで刀断するこずはほずんど䞍可胜だからです。 このような「配垃マップ」を単玔に削陀するこずはできたせん。それらのいずれかを削陀するず、4 GBのデヌタが削陀されるためです。



怜玢ヘルプ



䜕をする必芁があるかわからない堎合は、助けを求めおください。 突然、デヌタベヌスの砎損に関するメッセヌゞが衚瀺されたすが、このメッセヌゞは䞊蚘で説明されおいないので、助けを求めおください。 あなたが最良の回埩方法を遞択するこずがわからない堎合は - 助けを求めたす。

あなたはシニアDBAを持っおいる堎合は、それを参照しおください。 「メンタヌ」がいる堎合は、圌に聞いおください。 フォヌラムでアドバむスを求めたすが、フォヌラムで受け取ったすべおのアドバむスが圹立぀わけではないこずを忘れないでください。 実際、そこから絶察に間違った、さらには危険な決定が時々公衚されたす。

最埌に、マむクロ゜フトカスタマヌサポヌトに連絡しおください。 無料ではありたせんが、砎損したデヌタベヌスで䜕ができるかを本圓に知っおいるので、デヌタベヌスが䌁業にずっお重芁な堎合、゜リュヌションの独立した怜玢䞭のダりンタむムのコストは、サポヌトに連絡するコストよりもはるかに高くなる可胜性がありたす。



おわりに



この蚘事では、砎損したデヌタベヌスが怜出されたずきにできるこず、さらに重芁なこずずしお、しおはいけないこずの䟋をいく぀か瀺したした。 説明した問題を解決するために䜿甚できる方法ず、適切なバックアップを䜜成するこずの重芁性 および適切な埩旧モデル玄Translator  を遞択するこずを理解しおください。



泚意これは、さらに、䞀床に行われおいない私の最初の翻蚳であり、そしおいく぀かのアプロヌチでは、自由な時間がある倜は、テキスト党䜓が誰かにいく぀かの矛盟を芋えるかもしれたせんので。 私がどこかで瞛られすぎおいお、テキストの䞀郚が突然理解しにくいこずが刀明した堎合、私は喜んですべおのコメントを聞きたす。

敬具、充填されおいたせん。

PS「公開」ボタンをクリックしようずしたずきに、 SQL Server Centralからのこのようなコミックを含むメヌリングリストがメヌルに萜ちたした。










All Articles