web-dev-qa-db-ja.com

オンラインのページ復元が1000の制限に達しました

私は(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ページの制限に達したと述べました(このdbには8つのファイルがあります)。

そのため、「オンラインリストアを完了する」ように求められますが、その方法に途方に暮れています...開始ログの完全バックアップよりも完全なテールログまたはそれ以上のものがありません。私は基本的に、残りのページを試すために復元を完了する方法を知りません。

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

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

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

ある程度のデータ損失は許容できますが、DBの整合性は少なくとも達成しようとする必要があります。

破損したデータベースは引き続きオンラインであり、クライアントはデータベースに取り組んでいるため(新しいデータを取得し続けます)、ラボベンチで実行するプロセスはすべて、後で本番データベースで再現できます(ダウンタイムは困難です)。

これはSQL Server 2014 Enterpriseです

PS:私はDBAではありません...私はプログラマーですが、クライアントは「エキスパート」のSQL災害復旧サービスを試してみましたが、彼らはあきらめたので、それを見て私ができるかどうか確認するように求められました何でもする。


pdate:多くのテストの後、ページごとの復元は不可能だったので、私たちはアイデアを捨てました。手動で回復(破損したテーブルから欠落しているレコードを手動で選択し、最新の既知の適切なバックアップに挿入する)を行い、そのための自動化ツールをいくつか実行します(ここでも、数百から数百のテーブルがあります)。

13
Jcl

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

  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  

参照:Restore Pages(SQL Server) (Microsoft Docs)
参照:RESTOREステートメント(Transact-SQL) (Microsoft Docs )

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


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

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

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

  3. あなたは、あなたが雇われていない役割を引き受けることによって、困難な状況に陥っています。あなたは、会社のDBAも外部コンサルタントもできなかったことを達成しようとしています。それは高貴な仕草のように思えるかもしれませんが、あなたは自分を危険にさらしています。あなたは、あなたが決して成し遂げることができない何かを「黙示的に約束した」かもしれません。 あなたは危険を冒したいですか?

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

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

私があなたに与えることができる最もよい推薦は生産を止めてマイクロソフトに電話することです!または、少なくともマイクロソフトに連絡して、生産を停止する可能性があります。

私の執筆は非常に用心深く、あなたの観点からは少しドラマチックに見えるかもしれませんが、私は個人的に、同様の状況でデータが失われたDBAとしての経験に関連付けることができます。私たちはonly半日分のデータを失いましたが、大量のデータを周囲のシステムと再同期する必要がありました。

待機時間が長くなるほど、回復にコストがかかります。


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

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

強調私のもの)

参照:RESTOREステートメント-引数(Transact-SQL) (Microsoft Docs)


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

16

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

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

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

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

このツールでは、.mdfファイルと.ndfファイルがオフラインである必要があるため、破損したPRODデータベースのコピーがあり、SQL Serverサービスを停止する必要がないことが問題なく機能します。

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

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

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

今日のヒーローにしてくれてありがとう、HTH!

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

1
samosql