復元できません(エラー3456)


9

簡単に理解できない状況があり、このフォーラムで他の人に提案があるかどうか尋ねたいと思いました。

Windows Server 2008R2 EnterpriseでSQL Server 2008 R2 Standard SP3を実行しています。

データベースにはいくつかのメンテナンスが必要でしたが、その後、別のサーバーに復元する必要がありました。COPY_ONLYで実行される完全なdbバックアップと、4つのtlogバックアップのセットがあります。

  1. 開始する前に、tlogbackup1を作成します
  2. 以下からの変更FULLへのBULK_LOGGED復旧モデル
  3. 新しいファイルグループを追加する
  4. newfilegroupにファイルを追加する
  5. newfilegroupをデフォルトに設定
  6. テーブルに選択(newfilegroup)
  7. 元のテーブルをドロップ
  8. 元のファイルを削除
  9. 元のファイルグループを削除する
  10. 新しいテーブルの名前を元のテーブルと一致するように変更する
  11. 元のファイルグループと一致するようにnewfilegroupのファイル名を変更する
  12. 元のファイル名と一致するようにカタログのファイル名を変更する
  13. OSレベルでファイル名を変更して元のファイル名と一致させる
  14. 既定のファイルグループを元のファイルグループに設定する
  15. dbをオンラインにする
  16. 以下からの変更BULK_LOGGEDへのFULL復旧モデル
  17. すべての手順が完了したら、tlogbackup2を作成します

復元サーバーでのドライブ文字の変更により、すべてのバックアップの復元にはWITH MOVEを使用する必要があります。

回復手順:

RESTORE database SomeDB FROM DISK = 'D:\REPRO\SomeDB.bak'   
WITH 
MOVE 'SystemData' TO 'D:\SQLDATA\SomeDB.mdf'
,MOVE 'SystemDataPDS' TO 'D:\SqlData\SomeDB.ndf'
,MOVE 'SystemData_log' TO 'D:\SQLLogs\SomeDB.LDF'
,NORECOVERY
,stats = 1

RESTORE LOG SomeDB FROM DISK = 'D:\REPRO\tlogbackup1.trn'   
WITH 
MOVE 'SystemData' TO 'D:\SQLDATA\SomeDB.mdf'
,MOVE 'SystemDataPDS' TO 'D:\SqlData\SomeDB.ndf'
,MOVE 'SystemData_log' TO 'D:\SQLLogs\SomeDB.LDF'
,NORECOVERY
,stats = 1

RESTORE LOG SomeDB FROM DISK = 'D:\REPRO\tlogbackup2.trn'   
WITH 
MOVE 'SystemData' TO 'D:\SQLDATA\SomeDB.mdf'
,MOVE 'SystemDataPDS' TO 'D:\SqlData\SomeDB.ndf'
,MOVE 'SystemData_log' TO 'D:\SQLLogs\SomeDB.LDF'
,NORECOVERY
,stats = 1

最終的なtlogの復元は100%になり、エラー3456で失敗します。

ファイル1のデータベース「SomeDB」、ファイル「SystemData」の368ページを処理しました

ファイル1のデータベース「SomeDB」、ファイル「SystemDataPDS」の7656520ページを処理しました

ファイル1のデータベース「SomeDB」、ファイル「SystemData_log」の172430ページを処理しました

メッセージ3456、レベル16、状態1、行1
ログレコード(210388:123648:232)をやり直すことができませんでした(4:8088)、ページ(4:8088)、トランザクションID(0:1016710921)、データベース 'SomeDB'(データベースID 6) 。ページ:LSN =(0:0:1)、タイプ=11。ログ:OpCode = 4、コンテキスト11、PrevPageLSN:(210388:122007:1)。データベースのバックアップから復元するか、データベースを修復します。メッセージ3013、レベル16、状態1、行1 RESTORE LOGが異常終了しています。

完全なdbバックアップが問題ないことを確認するためだけに、それを復元しCHECKDB、エラーは発生しませんでした。

すべてのフィードバックを歓迎します。

前もって感謝します、

ネッドカワウソ


1
切れ目のないログチェーンがあると思う理由について詳しく教えてください。データベースをBULK_LOGGEDモードに切り替えてスキーマをいじり始めた瞬間、ログチェーンを壊さないようにするすべての賭けは無効になります。
Thomas Kejser、2015

返信ありがとうございます、トーマス。投稿のタイトルが間違っていたことがわかりました。ポイントインタイムリカバリは必要ありませんが、4番目のtlogバックアップの最後まで完全に復元します。そのため、BULK_LOGGEDを設定しても問題は発生しません。2番目のtlogバックアップが失敗する原因となった方法がわかりません-すべてのコマンドがSQL Serverでサポートされており、同じデータベースで同じ手順を実行しましたが、より小さなデータベースで実行できました。問題なく2番目のtlogバックアップを復元します。
NedOtter、2015

エラーは破損のようです。内部エラーです。すべてのバックアップファイルの整合性を確認できますか?チェックサム付きですか?
usr

CHECKDBを実行して、完全なdbバックアップにエラーがないことを確認しました。CHECKSUMが使用されたかどうかを確認する必要があります。
NedOtter 2015

1
バックアップでチェックサムが有効になっている場合は、復元にもチェックサムを使用する必要があります。ページタイプ11はPFSページです。つまり、修正できず、完全な復元しか実行できません。また、コピーのみのバックアップがいつ取られたかは言いません。そのバックアップはタイムラインのどこにありましたか?
ロバートLデイビス

回答:


9

エラー3456がスローされる理由を理解するには、少し前に戻り、SQL Serverが回復のこのコーナーをどのように処理するかを理解する必要があります。

SQL Serverが操作をやり直し、そのやり直しがページの変更である場合、SQL Serverはすばやくチェックします。ページヘッダーには最終的にが含まれますPageLSN。これは、ページによって記録された、そのページを変更した最後のLSNを示すものです。このように考えると、ページは変更を加えた最後のLSNを追跡し続けます。これがPageLSNです。

ログに記録されたページ変更操作があるたびに、そのログレコードにはいくつかのLSNが含まれます。つまり、ログレコードのLSN(... 現在のLSNと考えてください)、そしてそれには、前ページのLSNPrevPageLSN今後)と呼ばれるものが含まれます。したがって、ページを変更する場合、ログレコードに書き込まれるデータの1つは、ページを変更する最後のLSNとしてページが示すものです

このように考えてみてください...あなたの車はそれに取り組む必要があります。メカニックジョンはあなたの車で作業します。エンジンベイには小さなタグがあり、メカニックジョンは「ジョンがこの車で最後に作業した」と書きます。次に、車を別のショップに持ち込むと、メカニックマークはエンジンベイを調べ、メカニックジョンが最後にこの車で作業したことを確認します。彼はデータシートにこの情報を書いています。SQL Serverについても同じ考えです。

これはやや混乱を招く可能性があるため、ページの順次変更についての以下の画像と、PageLSNとのPrevPageLSN関係をご覧ください。

ここに画像の説明を入力してください

ループバックしてみましょう。ページの操作(復元、回復、HAなど)をやり直す必要があるときに、これらすべてが機能します。SQL Serverがページ操作をやり直す必要がある場合PageLSN、ページのPrevPageLSNがログレコードに含まれると一致するかどうかを確認するために、健全性チェックを行います。等しくない場合は、エラー3456がスローされます。

PageLSNPrevPageLSNと同じですか?番号???エラー3456を停止して発生させる...

次の方法を含むエラーメッセージを分析しましょう。

トランザクションID(0:1016710921)、ページ(4:8088)、データベース 'SomeDB'(データベースID 6)のログレコード(210388:123648:232)をやり直すことができませんでした。ページ:LSN =(0:0:1)、タイプ=11。ログ:OpCode = 4、コンテキスト11、PrevPageLSN:(210388:122007:1)。データベースのバックアップから復元するか、データベースを修復します。メッセージ3013、レベル16、状態1、行1 RESTORE LOGが異常終了しています。

エラーの原因となる不等式がある2つのデータを太字にしています。あなたは私たちがいることを確認できPageLSNている1:0:0(これはページのヘッダーで発見された)、そして私たちはPrevPageLSNある210388:1:122007(これはやり直すことしようとしていたログレコードのデータで発見されました)。これらは明らかに等しくないため、err3456です。

したがって、このイベントの理由を見つけるには、なぜここに格差があるのか​​を見つけることです。実際に、4:8088ページのライフサイクルを追跡し、切断の場所を確認する必要があります。残念ながら、これ以上の情報や実践的なトラブルシューティングがなければ、この回復操作の背景とエラーの原因を説明する以外にできることは他にありません。


久しぶりだと思いますが、それでも...良い説明、徹底した説明ありがとうございます!
RThomas 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.