web-dev-qa-db-ja.com

複数のデータベース、1つのバックアップファイル

複数のデータベースを単一の.bakファイルにバックアップしてから、個別に復元することはできますか?

答えは明白な「はい」であるはずです-これは保守計画を設定するときの主要なオプションの1つです。複数のデータベースを選択してから、単一のファイルを指定します。これを行うと、各データベースのバックアップセットを含む1つの.bakファイルを取得します。各データベースの個々のバックアップセットはすべて存在し、ファイルの内容を調べたところ問題ありません。

しかし、セットの最初のデータベースの後でデータベースを復元しようとすると、復元ウィザードには、最初のデータベースに関連付けられているファイルしか表示されません。 [ファイル]ページでは、最初のデータベースに対して常に2つのエントリ(データファイル、ログファイル)しかありません。次に、復元タスクはエラーをスローします。

System.Data.SqlClient.SqlError:論理ファイル[最初のソースデータベース]はデータベース[ターゲットデータベース]の一部ではありません。 RESTORE FILELISTONLYを使用して、論理ファイル名をリストします。

また、RESTORE FILELISTONLYを使用すると、最初のデータベースの結果しか得られません(復元ウィザードの[ファイル]ページに表示されるものと同じです)。

何ができますか?

復元タスクをスクリプト化して論理ファイル名を手動で設定することもできますが、それらが存在する場合でも、簡単に見つける方法はありません。メディアセットの最初のバックアップは、メディアセット全体の論理ファイル名を確立し、他のデータベースに効果的にアクセスできないように見えます。

1つのバックアップファイルに複数のデータベースに関する情報がオンラインでほとんど見つかりません。ほとんどの人は、1つのデータベースを複数のファイルにまたがりたいと考えています。しかし、私の場合は、4つの小さな関連データベースが1セットとして管理される必要があるCMSがあります。すべてを4倍にするよりも、1つの統合バックアップファイル(および1つのメンテナンスプランと1つのエージェントジョブ)を用意する方がはるかに簡単です。

古いSO質問の質問 ここ があり、SP3でパッチされたバグであるというまったく同じ問題を説明しています。しかし、私は完全に実行しています-パッチが適用されたSQL Server 2014(12.0.5207.0)これは、2つの別々のシステムで見られ、1つはWeb Editionを実行し、もう1つはDev Editionを実行しています。

追加情報

この古い記事 によるPaul Randalによると、インプレース(WITH FILE = xx)を復元している場合は、位置番号(WITH REPLACE)を単に参照できるようですが、別のサーバー(ファイルパスが異なる)に復元しています。WITH MOVE [Logical File Name] TO [new file path]も使用する必要があります。同じサーバーで別の名前のコピーを復元する場合(PROD => DEVなど)、同じ問題が発生します。

4
Neil Laslett

質問で述べたように、Paul Randalの article でよく説明されています。

例を挙げましょう。

サーバー1 3つのデータベースを1つのファイルにバックアップしています。

BACKUP DATABASE [itdba] TO  DISK = N'D:\multipleDatabaseBackup.bak' WITH NOFORMAT, NOINIT,NAME = N'itdba_backup'
GO
BACKUP DATABASE [itdbatest] TO  DISK = N'D:\multipleDatabaseBackup.bak' WITH NOFORMAT, NOINIT, NAME = N'itdbatest_backup'
GO
BACKUP DATABASE [itdbatest2] TO  DISK = N'D:\multipleDatabaseBackup.bak' WITH NOFORMAT, NOINIT, NAME = N'itdbatest2_backup'
GO

ここで、バックアップをサーバー2にコピーして、itdbaデータベースの復元は他の復元と同様ですが、他の2つのデータベースの復元に問題があるとします。

Tsqlの下で実行する場合

RESTORE HEADERONLY FROM DISK = N'D:\multipleDatabaseBackup.bak'

データベースに対応するバックアップの位置が表示されます。他にも多くの列がありますが、表示している列はほとんどありません。

enter image description here

位置2のitdbatestデータベースをメモします。MOVEを使用して、サーバー1と同じドライブ/フォルダー構造を持たない別のサーバーにこれを復元できます。

itdbatestサーバー1のデータベースファイル名と場所。

enter image description here

復元する前にバックアップをサーバー2にコピーしました。

RESTORE DATABASE itdbatest FROM DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL14.SQL2017\MSSQL\Backup\multipleDatabaseBackup.bak'  
WITH REPLACE, FILE = 2,
MOVE 'ITDBATest' TO 'C:\Program Files\Microsoft SQL Server\MSSQL14.SQL2017\MSSQL\DATA\ITDBATest.mdf',
MOVE 'ITDBATest_log' TO 'C:\Program Files\Microsoft SQL Server\MSSQL14.SQL2017\MSSQL\DATA\ITDBATest_log.ldf'
GO
2
SqlWorldWide