この記事を読むのに必要な時間は約 9 分です。
SQLserver リストア(完全バックアップから)
完全バックアップからのリストア
SQL Serverのデータベースについてバックアップからのリストアを行いたいと思います。リストアするバックアップは完全バックアップからであることをを前提として説明します。※差分バックアップではない
早速ですが、SQL文の最小構成は以下のような形となります。
USE [master] RESTORE DATABASE [test001] FROM DISK = N'G:\file\DBBK\test001.bak' GO
バックアップを取得した際は意図的に指定していませんでしたが、リストアを行う際は
USE [master]
を指定します。これは[test001]をリストアする際に、[test001]を触っているとリストアが失敗するためです。そのため、意図的にmasterに移動します。
実行結果は以下の通りです。
+++++++++++++++++++++++++++++++++
データベース ‘test001’ の 28152 ページ、ファイル 1 のファイル ‘test001’ を処理しました。
データベース ‘test001’ の 2 ページ、ファイル 1 のファイル ‘test001_log’ を処理しました。
RESTORE DATABASE により 28154 ページが 21.003 秒間で正常に処理されました (10.472 MB/秒)。
+++++++++++++++++++++++++++++++++
ここで、上記赤字のファイル1に注目してください。今回リストアしたデータベースファイルを改めて確認してみたいと思います。
RESTORE HEADERONLY FROM DISK = N'G:\file\DBBK\test001.bak'
最新のバックアップファイルはファイル1では無く、ファイル8であることが確認できました。バックアップメディアの中に複数のバックアップセットが含まれていると適切なオプションを指定しないと、意図しないファイル(最新ではない)をリストアする事になります。
バックアップセットを指定したリストア
バックアップメディアの中より最新のバックアップセットをリストアします。
SQL文は以下の通りです。
USE [master] RESTORE DATABASE [test001] FROM DISK = N'G:\file\DBBK\test001.bak' with file=8 GO
オプションで with file=8 を指定する事により、最新のバックアップセットを利用してリストアする事ができました。
+++++++++++++++++++++++++++++++++
データベース ‘test001’ の 28152 ページ、ファイル 8 のファイル ‘test001’ を処理しました。
データベース ‘test001’ の 2 ページ、ファイル 8 のファイル ‘test001_log’ を処理しました。
RESTORE DATABASE により 28154 ページが 21.777 秒間で正常に処理されました (10.099 MB/秒)。
+++++++++++++++++++++++++++++++++
異なるデータベースにリストアする
バックアップしたデータベースは通常は、バックアップしたデータベースにリストアします。
[speech_bubble type=”drop” subtype=”L1″ icon=”02ukiyoe/tomi_R.png” name=”とみさん”]ん?回文?[/speech_bubble]
通常ではない場合とは異なる名前のデータベースに復元する場合です。あまり実施されることは無いかもしれませんがサンプルとして test002データベースを作成し、そこにリストアを行います。
以下の通り、test002データベースを作成し、リストアします。
USE [master] RESTORE DATABASE [test002] FROM DISK = N'G:\file\DBBK\test001.bak' WITH FILE = 8, NOUNLOAD, STATS = 5 GO
しかし、残念ながらこれはエラーとなってしまいます。
バックアップ セットは、既存のデータベース ‘test002’ 以外のデータベースのバックアップを保持しています。
メッセージ 3013、レベル 16、状態 1、行 2
RESTORE DATABASE が異常終了しています。
これはデータベース自体の保護機能で、通常は取得したバックアップにそのままリストアする事が当たり前だからです。ただ、何らかの理由により異なるデータベースに対して復元する場合は若干複雑になり以下の通りになります。
USE [master] RESTORE DATABASE [test002] FROM DISK = N'G:\file\DBBK\test001.bak' WITH FILE = 8 , replace , MOVE N'test001' TO N'C:\Program Files\Microsoft SQL Server\MSSQL14.MSSQLSERVER\MSSQL\DATA\test002.mdf' , MOVE N'test001_log' TO N'C:\Program Files\Microsoft SQL Server\MSSQL14.MSSQLSERVER\MSSQL\DATA\test002_log.ldf' , STATS = 5 GO
データベースが異なる場合は replace オプションを意図的に指定する必要があります。また、 move オプションで、DB本体とログファイルの場所を明示的に指定する必要があります。
異なるデータベースにリストアする事はあまり無いかもしれませんが、この様な方法でリストア可能です。
関係ないデータベースのバックアップファイルをリストアする
直前の内容は異なるデータベースに対するリストアでした。今回はデータベースに対するリストアを行うのではなく、DB本体にそのままバックアップファイルを接続するようなイメージで復元してみたいと思います。現在test001とtest002がありますので、test003にしてみたいと思います。SQL文は以下の通りです。
USE [master] RESTORE DATABASE [test003] FROM DISK = N'G:\file\DBBK\test001.bak' WITH FILE = 8, MOVE N'test001' TO N'C:\Program Files\Microsoft SQL Server\MSSQL14.MSSQLSERVER\MSSQL\DATA\test003.mdf', MOVE N'test001_log' TO N'C:\Program Files\Microsoft SQL Server\MSSQL14.MSSQLSERVER\MSSQL\DATA\test003_log.ldf', STATS = 10 GO
以下の通りバックアップファイルを利用して新規にデータベースが作成されたような状態を作ります。
既存のデータベースに復元する方法と殆ど一緒です。本番環境のデータベースを試験環境に持ってくるような場合等で実行致します。