みなさん、こんにちは。今回は バックアップからのリストアによる SQL Server のリカバリ手順についてご紹介します。
本手順では SQL Server 2012 を使用して、下記 の2 通りのリカバリ手順について記載しています。
A. 障害発生直前までのリカバリ手順
B. ある特定の時点までのリカバリ手順
■前提条件
障害発生直前、またはある特定の時点までデータベースを復旧するためには、下記 の 3 つの条件を満たしていることが必要です。
1. 完全バックアップを取得済みであること。
2. トランザクション ログが破損していないこと。
3. データベースの復旧モデルが「完全」であること。
※ 本手順は ServerA という名前のサーバー上にインストールされた SQL Server の test データベースについて、2013 年 9 月 18 日に下記のバックアップを取得済みであることを前提として記載しています。
No | 時間 | バックアップの種類 | バックアップ ファイル名 |
1 | 02:00 | 完全バックアップ | c:\work\full.bak |
2 | 02:30 | ログバックアップ | c:\work\log1.bak |
3 | 12:00 | 差分バックアップ | c:\work\diff.bak |
4 | 12:30 | ログバックアップ | c:\work\log2.bak |
A. 障害発生直前までのリカバリ手順
ディスク障害等でデータファイル (.mdf) が破損してしまった場合に、障害発生直前までデータベースを復旧する手順を下記にご紹介します。
1. コマンド プロンプトを起動し、下記のコマンドを実行して、残ったトランザクション ログ(まだバックアップしていないログ)を、NO_TRUNCATE オプションを使用してバックアップします。
---------------------------------------------------------------------------------------
C:\> sqlcmd -E -SServerA
1> BACKUP LOG test TO DISK = 'C:\work\log3.bak' WITH NO_TRUNCATE
2> go
---------------------------------------------------------------------------------------
※このログは、’ログ末尾’ や ’TAIL ログ’ とも呼ばれます。
※ NO_TRUNCATE オプションは、ログ末尾をバックアップするとともに、ログを切り捨てないという効果もあります。
2. 下記のコマンドを実行して、02:00 に取得した完全バックアップをリストアします。
--------------------------------------------------------------------------------------------------------
1> RESTORE DATABASE test FROM DISK = 'C:\work\full.bak' WITH NORECOVERY, REPLACE
2> go
--------------------------------------------------------------------------------------------------------
※NORECOVERY オプションは、まだリストアすべきバックアップがある場合に使用するオプションです。NORECOVERY を指定してリストアを行った場合は、データベースが「復旧中」(リストア中)となり、ユーザーからの接続を一切できないようにブロックします。
※REPLACE オプションは、指定したデータベースと同じ名前のデータベースが既に存在している場合でも、データベースとその関連ファイルが作成されます。その場合、既存のデータベースは削除されます。
3. 下記のコマンドを実行して、12:00 に取得した差分バックアップをリストアします。
-----------------------------------------------------------------------------------------------
1> RESTORE DATABASE test FROM DISK = 'C:\work\diff.bak' WITH NORECOVERY
2> go
-----------------------------------------------------------------------------------------------
4. 下記のコマンドを実行して、12:30 に取得したログ バックアップをリストアします。
---------------------------------------------------------------------------------------
1> RESTORE LOG test FROM DISK = 'C:\work\log2.bak' WITH NORECOVERY
2> go
--------------------------------------------------------------------------------------
5. 下記のコマンドを実行して、上記手順 1 で取得した TAIL ログをリストアします。
-------------------------------------------------------------------------------------
1>RESTORE LOG test FROM DISK = 'C:\work\log3.bak' WITH RECOVERY
2> go
-------------------------------------------------------------------------------------
※RECOVERY オプションは、リストア後にデータベースを完全復旧した状態にします。これは、リストアが完了したことの合図になり、残りのバックアップをリストアすることはできません。
6. 下記のコマンドを実行して、test データベースに接続します。
------------------
1> USE test
2> go
------------------
接続できればリカバリは完了です。 test データベースは、障害発生直前の状態まで復旧しています。
B. ある特定の時点までのリカバリ方法
データを誤って削除してしまった場合等に、ある特定の時点までデータベースを復旧する手順を下記にご紹介します。
本手順では、2013 年 9 月 18 日 の 12 時15 分 00 秒 に誤ってデータを削除してしまい、2013 年 9 月 18 日 の 12 時 14 分 59 秒 の時点までデータベースを復旧することを想定しています。
1. 上記 ‘A. 障害発生直前までのリカバリ手順’ の手順 1 から 手順 3 までを実行します。
2. 下記のコマンドを実行して、12:30 に取得したログ バックアップをリストアします。
--------------------------------------------------------------------------------------------------------------------
1> RESTORE LOG test FROM DISK = 'C:\work\log2.bak' WITH RECOVERY, STOPAT = '2013-09-18 12:14:59'
2> go
--------------------------------------------------------------------------------------------------------------------
※STOPAT オプションは、特定の時間までのデータへ復元したいという場合に使用するオプションです。
3. 下記のコマンドを実行して、test データベースに接続します。
------------------
1> USE test
2> go
------------------
接続できればリカバリは完了です。 test データベースは、データが削除される直前の状態まで復旧しています。
< 参考情報 >
自習書シリーズ
- バックアップと復元
http://www.microsoft.com/ja-jp/sqlserver/2012/technology/self-learning.aspx