1000ページの制限に達するオンラインページの復元


13

(I / O障害により修正された)破損に苦しんでいるデータベースを回復しようとする仕事をしました。私は、データベースまたはデータベースに含まれる内容に詳しくありません。

古い(最大3週間)フルバックアップと一連のトランザクションログが与えられました...しかし、トランザクションログが欠落しているため、特定の日付までしか回復できません。2.5週間分のデータが失われています(このデータベースには常に多くのデータが追加されています)。

また、破損したデータベースのコピー(アクセス可能ですが、多くのページが破損/欠落しています)のコピーも提供されています。

私は典型的なDBCC CHECKDBコマンドを試してみました(まだありrepair_allow_data_lossません。他に何も機能しない場合、それは私の最後の手段になります)。

多くの人がデータベースに出入りした後(dbは1.5テラバイトの小さな怪物で、私がすることはすべて遅くて時間がかかります)、破損したページの最後の正常なバックアップからオンラインページの復元を試みました。

それを行うためにRESTORE DATABASE <foo> PAGE='pages' FROM DISK='<bar.bak>'DBCC CHECKDB出力から多くのコマンドを作成するスクリプトを作成しました(基本的には正規表現と異なる)...これまでのところ、これは1000ページの制限に達したと言った時点まで機能しました復元コマンドごとにファイルごと(このデータベースには8つのファイルがあります)。

そのため、「オンライン復元を完了する」ように求められますが、それを行う方法に途方に暮れています...私はテールログまたは最初の完全バックアップよりも完全なものを持っていないので、基本的に、残りのページで試行を続けるために復元を完了する方法がわかりません。

私は試してみましたRESTORE DATABASE <foo> WITH RECOVERYが、それでもうまくいきませんでした、私は持っていないログを要求します。

誰かがここから何かを回復しようとする方法についてのヒントを持っていますか?または、オンライン復元を「完了」して、さらに多くのページを復元しようとする方法はありますか?オフライン復元を試しても同じ問題が発生しますか(基本的WITH NORECOVERYにすべてを追加してから、最後に復元しようとしますか?)

データベースを手作業で処理することは基本的に元に戻せません...数百万の行を持つ数百のテーブルがあり、それが何であるかについて明確な意味はありません。SELECT数百万行を超えると、破損したDBはクエリで失敗しますが、どこで解決できるかはわかりません。すべての非クラスター化インデックスを再構築しようとしましたが、行データを含む破損したページがあるため、どちらも機能しませんでした。

ある程度のデータ損失は許容されますが、DBでの一貫性の達成は少なくとも試みられるべきです。

破損したデータベースはまだオンラインであり、クライアントが作業しているため(新しいデータを取得し続けます)、ラボベンチで行うすべてのプロセスは、後で運用データベースで再現可能です(ダウンタイムは困難です)。

これはSQL Server 2014 Enterpriseです

PS:私はDBAではありません...私はプログラマーですが、クライアントはいくつかの「エキスパート」SQLディザスタリカバリサービスを試してみましたが、彼らはあきらめました。何でもする。


更新:多くのテストの後、ページごとの復元は不要でしたので、アイデアを捨てました。手動リカバリ(破損したテーブルから不足しているレコードを手動で選択し、最後の既知の正常なバックアップに挿入する)を行い、自動化ツールを使用します(再び、何百ものテーブルがあります)。

回答:


16

標準的な手順は次のとおりです。

  1. 復元する必要があるページIDを取得します。
  2. データベース全体でページの復元を開始します。
  3. 最新の差分バックアップを適用します。
  4. 後続のログバックアップを適用します。
  5. 新しいログバックアップを作成します。
  6. 新しいlobバックアップを復元します。

新しいログバックアップが適用されると、ページの復元が完了し、ページが使用可能になります。

復元の例

RESTORE DATABASE <database> PAGE='1:57, 1:202, 1:916, 1:1016'  
   FROM <file_backup_of_file_B>   
   WITH NORECOVERY;  
RESTORE LOG <database> FROM <log_backup>   
   WITH NORECOVERY;  
RESTORE LOG <database> FROM <log_backup>   
   WITH NORECOVERY;   
BACKUP LOG <database> TO <new_log_backup>;   
RESTORE LOG <database> FROM <new_log_backup> WITH RECOVERY;  
GO  

参照:ページの復元(SQL Server)(Microsoft Docs)参照:RESTOREステートメント(Transact-SQL)(Microsoft Docs)

ただし、TLOGバックアップにホールがあり、上記の手順で復元すると、データベースが希望しない状態に戻る可能性があります。


あなたは複雑な状況にあります。

  1. データベースに破損したページがあり、会社は絶えず問題のあるデータベースに新しいデータを追加しています。これにより、データベースの合計ダウンタイムが発生する可能性があります。でください、あなたはそれを危険にさらすしたいですか?

  2. 誰かが責任を負うことになり、あなたがそれを修正しようとすればするほど、より多くの管理者があなたが最終的にその人であるかもしれないと決める傾向があります。でください、あなたはそれを危険にさらすしたいですか?

  3. あなたは、自分が雇用されていない役割を引き受けることによって、困難な状況に陥っています。あなたは、会社のDBAも外部コンサルタントもできなかったことを達成しようとしています。高貴なジェスチャーのように思えるかもしれませんが、あなたは自分自身を危険にさらしています。あなたはあなたが決して達成できないであろう何かを「暗黙のうちに約束した」かもしれません。でください、あなたはそれを危険にさらすしたいですか?

  4. データベースで作業している人が破損したデータを照会すると、エラーメッセージを受け取る可能性があります。毎日の仕事はすでに影響を受けています。避けられないほど長く待つほど、生産性に影響が出ます。でください、あなたはそれを危険にさらすしたいですか?(この質問は経営陣にも提起される可能性があります)

  5. 会社のバックアップ手順に問題があるようです(それ以外の場合、TLOGバックアップはどのように失われますか?)。問題がないかのように運用データベースを実行しています。でください、あなたはそれを危険にさらすしたいですか?

最善の推奨事項は、生産を中止してマイクロソフトに連絡することです!または、少なくともマイクロソフトに連絡して、生産を停止することもあります。

私の文章は過度に用心深く、あなたの観点からは少し脚色されているように見えるかもしれませんが、私は個人的に、DBAとしての経験に似た状況でデータが失われたと思います。我々は唯一の半分の日のデータを失ったが、我々はしなければならなかった周囲のシステムとのデータの多くを再同期させます

長く待つと、より高価な回復になります。


ページの復元の制限については、公式ドキュメントからの引用をここに:

復元シーケンスで単一ファイルに復元できるページ最大数は1000です。ただし、ファイルに破損したページが少数以上ある場合は、ページではなくファイル全体を復元することを検討してください。

強調鉱山)

リファレンス:RESTOREステートメント-引数(Transact-SQL)(Microsoft Docs)


すべてが正常に戻ったら、DBAや外部コンサルタントは、データベースに別のバックアップ/復元ポリシー/手順を実装することを検討する必要があります。7x24である必要があるため、どのような状況でも適切な復元機能を提供しないバックアップ手順を行うリスクはありません。


2
私が既に提起し、世話をしたあなたの懸念のほとんど(何かがうまくいかなかったり、生産が停止した場合など、私は確かに責任を負いません)。私はその点について非常に明確にしていますが、そこにはコントロールも決定もありません。私はそれが過度に用心深くまたは劇化されたとは思わない...私は彼らが基本的に間違っていると思います、そして私はここで助けようとしていますが、自己妥協なしです。私は1000ページの制限を理解していますが、それが単一の復元コマンドのためであることを望んでいました(私はそれをオンラインでやっているので、私は順番になっていないことを望んでいました...ドキュメントを明確にすることができませんでした) 。
Jcl

1

特に1 TBを超えるサイズのこの破損したデータベースを修復するために、データリカバリの「エキスパート」と連携するなど、さまざまな方法を試したことがあります。これにより、プロセスが非常に難しくなり、時間との競合が発生します。経験豊富なDBAとして、ほとんどの場合、復元に使用できる適切なバックアップがある同様の状況に遭遇しました。不良なバックアップと破損したデータベースを継承する場合、私はStellar Phoenix SQL Database Repair toolと呼ばれるサードパーティのツールに大きく依存しています。このツールは、破損したデータベース(.mdfおよび.ndf)の修復で有名です。以下は、ツールのいくつかの機能です。

  • 破損したSQLデータベース(.mdf&.ndf)ファイルを修復します
  • テーブル、トリガー、インデックス、キー、ルール、ストアドプロシージャを回復する
  • SQLデータベースから削除されたレコードの回復を実行します

  • データベースのスキャン結果を保存して、後の段階でリカバリを実行します

  • 修復されたファイルをMSSQL、HTML、XLSおよびCSV形式で保存できます
  • MS SQL Server 2016、2014、2012、2008およびそれ以前のバージョンをサポート

このツールを使用するには、.mdfファイルと.ndfファイルがオフラインである必要があるため、破損したPRODデータベースのコピーがあり、SQL Serverサービスを停止する必要はありません。

最良の部分は、修復されたデータベースをエクスポート/保存できないことを除いて、試用版がツールのすべての機能を提供することです。修復されたすべてのデータベースオブジェクトと、修復プロセスのさまざまな段階の詳細を提供する広範な修復ログファイルを引き続き表示できます。

気軽にダウンロードして、役立つかどうかを確認してください。ここからダウンロード

このサイトでツールがどのように機能するかについてのブログも書いています:samosql blogs

今日のヒーローになってくれてありがとう。

PS。この嵐が終わったら、特にそのようなデータベースのバックアップ手順の大幅な見直しが必要であることを管理者に伝えることを忘れないでください。このシナリオの繰り返しはまったく受け入れられません!:)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.