2013年2月21日木曜日

◆ログバックアップと差分バックアップ

ログバックアップと差分バックアップ

完全バックアップは時間がかかるので、その対策として「ログバックアップ」と「差分バックアップ」が用意されている。

ログバックアップ

前回のバックアップ以降の増分情報のみをバックアップする機能。
時間短縮が可能になる。

image

リストアするには、最初に完全バックアップをリストアした後に、ログバックアップを古い方から順にすべてリストアする。

差分バックアップ

前回の完全バックアップ以降の差分情報のみをバックアップする機能。
ログバックアップほどではないが時間短縮が可能。

image

リストアするには、完全バックアップをリストアした後、最後の差分バックアップをリストアする。

ログバックアップと差分バックアップを組み合わせて以下のようなバックアップも可能。
ただし、運用が複雑になりそうなのでよっぽどデータ量が多くないと使わないと思われ。
image

ログバックアップの実行方法
  1. 「SSMS」を起動
  2. 「オブジェクトエクスプローラ」で対象のDBを右クリックして「タスク」「バックアップ」を選択
    image
  3. 「バックアップの種類」で「トランザクションログ」を指定する
    image
  4. コマンドでバックアップするときは「BACKUP DATABASE」だったものが「BACKUP LOG」に変わる
    image
差分バックアップの実行方法

「バックアップの種類」に「差分」を指定する以外は「ログバックアップ」と同様

コマンドでバックアップする時は

image
完全バックアップと同様だが、WITHオプションに「DIFERENTIAL」を指定する

サンプル

「フル」「ログ」「差分」「ログ」の順でバックアップを取得してみる。

<バックアップ>

「フル」

BACKUP DATABASE Northwind
  TO DISK = 'D:\data\BackupTest\Northwindfull.bak'

「ログ」

BACKUP LOG Northwind
  TO DISK = 'D:\data\BackupTest\NorthwindLog1.bak'

「差分」

BACKUP DATABASE Northwind
  TO DISK = 'D:\data\BackupTest\NorthwindDiff.bak' WITH DIFERENTIAL

「ログ」

BACKUP LOG Northwind
  TO DISK = 'D:\data\BackupTest\NorthwindLog2.bak'


<リストア>

ここでテーブルの中身を消すなどして、リストアを試してみる。
リストアはスポット的な作業であり、状況に応じた作業になるのでGUIから行うことが一般的と思われる。

  1. 「SSMS」を起動
  2. 「オブジェクトエクスプローラ」で対象のDBを右クリックして「タスク」「復元」「データベース」をクリック
    image
  3. 「データベースの復元」ダイアログが表示され、「復元するバックアップセットの選択」に完全バックアップ以降の最新状態に戻すために必要なバックアップが自動的に表示されているのが判る。
    image
  4. 「オプション」ページで、「復元オプション」に「既存のデータベースを上書きする」をチェック、「ログ末尾のバックアップ」で「復元の前にログ末尾のバックアップを実行する」のチェックを外す。
    image
  5. 「OK」ボタンを押すとリストアが始まり以下のダイアログが表示されれば完了
    image
    ※排他される場合は「SSMS」を立ち上げなおすと良さそうだ。(どうしてもだめなときはシングルモードにしてから)

<差分バックアップまでのリストア>

  1. 先ほどと同様に「SSMS」で「タスク」「復元」「データベース」をクリック
  2. 「データベースの復元」ダイアログの「復元するバックアップセットの選択」で最後のログのチェックをはずす
    image
  3. 「オプション」ページの「復元オプション」で「既存のデータベースを上書きする」をチェックして、「ログ末尾のバックアップ」で「復元の前にログ末尾のバックアップを実行する」のチェックを外して「OK」をクリック。この後、残りのログをリストアする場合は「復旧状態」に「RESTORE WITH STANBY」もしくは「RESTORE WITH NORECOVERY」を指定する。
    (「RESTORE WITH RECOVERY」を指定すると残りのログはリストアできなくなる)
    image

<残りのログバックアップの復元>

「差分バックアップまでのリストア」で「RESTORE WITH RECOVERY」を指定した場合

  1. 先ほどと同様に「SSMS」で「データベースの復元」ダイアログを開く
  2. ここで、最後のログバックアップのみを選択しようとしても選択できない。(完全バックアップも選択されてしまう)
  3. そこで、別途ログバックアップをパスで指定するのだが、そのパスが画面には表示されていない。「復元するバックアップセット」にファイル自体は表示されているので「SSMS」自身はパスを覚えているのだが・・・。
    仕方がないので、「スクリプト」ドロップダウンを表示させて「新しいクエリウィンドウ」にでも表示させて確認。
  4. パスが確認できたら、「ソース」で「デバイス」を選択し、「バックアップデバイスの選択」ダイアログを表示させて「追加」ボタンでログファイルを追加
    image
  5. しかし、このままでは「データベースの復元」画面に戻った際にエラーが表示されてしまう。これを回避するには次の「復旧状態オプション」を使う
    image

「差分バックアップまでのリストア」で「RESTORE WITH STANBY」を指定した場合

データベースは「スタンバイ/読み取り専用」になっている

  1. 「データベース」を右クリックし「タスク」「復元」「トランザクションログ」を選択
    image
  2. 「復元元」のデータベースを選択し「復元するトランザクションログのバックアップを選択」で2つめのログをチェックして「OK」
  3. 「成功」のダイアログが出れば完了。(データが復元されたのを確認する)
RESTOREステートメントによる複数バックアップの復元

GUIでリストアする場合はバックアップ履歴をもとにどのバックアップを戻せばよいか「SSMS」が表示してくれるので特別意識しなくてもリストアが可能。

しかし、このバックアップ履歴は「msdb」に保持されているので、これ自体が破損してしまうと履歴が参照できなくなる。

そこで、履歴が存在しない場合のリストア方法を確認してみる。

バックアップ履歴がない場合のリストア

途中のリストアは「NORECOVERY」または「STANDBY」オプションを指定してリストアする必要がある。
最後のバックアップをリストアするときに「RECOVERY」オプションを指定して完了の合図とする。

image

GUIでやった以下のリストアをコマンドでやってみる。

image

(フルバックアップからのリストア)

USE master
RESTORE DATABASE Northwind
FROM DISK = 'D:\data\BackupTest\NorthwindFull.bak'
WITH NORECOVERY,REPLACE

(差分バックアップからのリストア)

USE master
RESTORE DATABASE Northwind
FROM DISK = 'D:\data\BackupTest\NorthwindDiff.bak'
WITH NORECOVERY

(ログファイルからのリストア)

USE master
RESTORE DATABASE Northwind
FROM DISK = 'D:\data\BackupTest\NorthwindLog2.bak'
WITH RECOVERY

※最後のリストアの時に、「RECOVERY」指定を忘れてしまったときは以下のコマンドで完了状態にできる。
image

バックアップ履歴がない場合のGUIでのリストア

履歴がなくても自分でファイルを指定すればGUIからのリストアが可能だ。(こちらのほうが簡単)

  1. 「SSMS」起動
  2. 「オブジェクトエクスプローラ」で対象のDBを右クリックして「タスク」「復元」「データベース」をクリック
  3. 「ソース」に「デバイス」を選び、対象のバックアップファイルをすべて指定する
    image
  4. 「オプション」で「既存のデータベースを上書きする」をチェックし「復元の前にログ末尾のバックアップを実行する」のチェックを外し「OK」を押してリストア実行

※間違って差分バックアップ前の不要なログバックアップを選んだりしてもSQLServerが判断して不要なものは「復元するバックアップセット」表示されない

0 件のコメント:

コメントを投稿