web-dev-qa-db-ja.com

トランザクションログのバックアップを復元する-メディアファミリエラー

バックアップ手順は次のとおりです。深夜の完全バックアップ、8時間ごとの差分バックアップ、および5分ごとのトランザクションログバックアップ。メンテナンス計画により、すべてが順調に整頓されます。

特定の時点に復元するため(昨日の午後2時5分としましょう)。 SQL Server Management Studio 2012で復元するときに、復元するデータベースを右クリックし、[タスク]> [復元]> [データベース]を選択します。次に、リカバリなしで完全バックアップを復元します(そして既存のデータを上書きします)。これにより、データベースは「復元中...」状態のままになります。次に、> [タスク]> [復元]> [ファイルとファイルグループ]に移動します。最も近いdiffバックアップ(正午)を選択します。回復せずに復元します。

トランザクションログの場合-[タスク]> [復元]> [トランザクションログ]。そのダイアログで「ファイルまたはテープから」を選択し、ボタンをクリックしてファイルを選択します。午後12時から午後14時5分までの5分間のトランザクションログを追加して選択します(そのうち25個)。ダイアログボックスで[OK]をクリックすると... SSMSがクラッシュし、次のエラーが発生します。

Transact-SQLステートメントまたはバッチの実行中に例外が発生しました。 (Microsoft.SqlServer.ConnectionInfo)

「C:...\backup_2012_12_22_120500_4174134.trn」にロードされたメディアは、1つのメディアファミリをサポートするようにフォーマットされていますが、バックアップデバイスの仕様に従って25のメディアファミリが想定されています。 RESTOREHEADERONLYが異常終了しています。 (Microsoft SQL Server、エラー:3231)

ヘルプが必要な場合は、次をクリックしてください。 http://go.Microsoft.com/fwlink?ProdName=Microsoft%20SQL%20Server&ProdVer=11.00.2218&EvtSrc=MSSQLServer&EvtID=3231&LinkId=20476

これがSQLServer 2008および2005で使用した手順とまったく同じであることを思い出すと、なぜこれが失敗するのかわかりません。これは2012年特有のものですか?バグですか?このオンラインに関する情報は見つかりませんでした。私たちはテープバックアップをまったく使用していません。メディアファミリについて私が読んだことのほとんどは、テープバックアップに関係しています。

トラブルシューティング:各トランザクションログを(一度に1つずつ)順番に選択し、作業を復元します。ただし、トランザクションログが非常に多い場合、これには15分以上かかることがあります。

試したことはありませんが、単純な古いTSQLを次の形式で記述した場合と思います。

RESTORE DATABASE [OurDB] FILE = N'db_dat' FROM  DISK = N'C:\...\diff\backup_2012_12_23_085000_4627006.bak' WITH  FILE = 1,  NORECOVERY,  NOUNLOAD,  STATS = 10

そして、xactionログごとにこれを実行しました-動作するはずです。データベースを復元するためのPowerShellなどを作成できますが、「ManagementStudio」でこれを処理することはできませんか?この答えは「いいえ」を指しているようです。 https://dba.stackexchange.com/questions/1021/how-to-restore-multiple-backups ...ただし、GUIは、複数の復元を許可することを示唆しているようです。トランザクションログbackups "-言うまでもなく、最初に複数のファイルを選択できます。

3
MikeMurko

この問題を解決する方法を見つけました

Management Studioから:

  1. Trnファイルを復元するデータベースを右クリックします
  2. タスクの選択
  3. [復元]を選択します
  4. データベースを選択してください...うん、あれ
  5. デバイスをクリックします
  6. 楕円をクリックします
  7. ファイルの追加
  8. トランザクションログファイルの場所を参照します。失敗しない場合は、バックアップ場所で日時順に並べ替えられていることを確認してください。
  9. 最初のファイルを選択し、キーボードのShiftキーを押しながら、最後のファイルを選択します。
  10. [追加]をクリックします
  11. [OK]をクリックします
  12. 宛先データベースを選択します。ファイルに移動し、宛先MDFおよびLDFファイルを反映するように、名前を付けて復元する場所を変更する必要がある場合があります。
  13. 次に、[OK]をクリックします

幸運を。

1
Abdul

バックアップをストライプ化すると、メディアファミリには複数のファイルが含まれます。したがって、バックアップを次のように呼び出すと、次のようになります。

backup log [OurDb] to file = 'c:\file1', file='c:\file2'

私の例では、バックアップは2つのファイルにまたがってストライピングされ(つまり、バックアップの半分はfile1に、残りの半分はfile2に)、復元には両方のファイルが必要になります。必要なファイルを確認するには、msdbのbackupmediafamilyを確認してください。次のクエリでそこにたどり着くはずです。

select family_sequence_number, physical_device_name
from backupmediafamily
where media_family_id = (
   select media_family_id
   from backupmediafamily
   where physical_device_name = N'C:\...\diff\backup_2012_12_23_085000_4627006.bak'
)

次に、復元するには、復元するメディアファミリごとに次のような操作を行う必要があります。

restore database [OurDb] from file = ''c:\file1', file='c:\file2', ... with norecovery

最後に、最終的にデータベースをオンラインにしたいとき(つまり、ログファイルの復元が完了したとき)に、次のことを行います。

restore database [OurDb] with recovery
1
Ben Thul