2013年2月24日日曜日

◆障害発生直前までの復旧

自動復旧

通常、バックアップからの復旧が必要になるのはハードディスクの障害。
それ以外のハードおよび、停電やブルースクリーンなどによる障害は、次回正常起動時にSQLServerが自動的にデータを復旧する。

この動作は「自動復旧処理」と呼ばれ以下のようなイメージになっている。

image

なので、このような障害の時には特にユーザーに作業が発生することはない。

障害発生直前までの復旧

ハードディスクに障害が発生し、データファイル(mdfファイル)が破損しても以下の条件を満たせば障害直前までの復旧が可能になる。

  • 完全バックアップが実行されている(必要に応じてそのあとのログバックアップがある)
  • トランザクションログが破損していない
  • 復旧モデルが「完全」になっている

この条件を満たせば、「フルバックアップ」からのリストア、「ログバックアップ」からのリストア、ログバックアップ以降のログ(ログ末尾)のロールフォワードによって障害発生直前までの復旧が可能になる。

image

復旧手順

まず、残ったログ(まだバックアップしていないログ)を「NO_TRUNCATE」オプションを利用してバックアップする。

image

試してみる
  1. 最後のログバックアップ後にデータを1件追加しておく
  2. 「SQLServer」サービスを止めて「mdf」ファイルを削除し障害をシュミレートする
  3. サービスを再開し「SSMS」を起動するとデータベースが「復旧待ち」となっているのを確認
    image
  4. 「NO_TRUNCATE」オプションをつけてログをバックアップ

    BACKUP LOG Northwind
    TO DISK = 'D:\data\BackupTest\NorthwindLogX'
    WITH  NO_TRUNCATE

  5. 完全バックアップを「NORECOVERY」オプションを指定してリストア

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

  6. 差分バックアップを「NORECOVERY」オプションを指定してリストア

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

  7. ログバックアップを「NORECOVERY」オプションを指定してリストア

    USE master
    RESTORE LOG Northwind
    FROM DISK = 'D:\data\BackupTest\NorthwindLog1'
    WITH NORECOVERY

  8. 最後に「NO_TRUNCATE」オプションを使用して取得したバックアップログを「RECOVERY」オプション指定でリストアする

    USE master
    RESTORE LOG Northwind
    FROM DISK = 'D:\data\BackupTest\NorthwindLogX'
    WITH RECOVERY

  9. 障害発生直前に追加したデータまで復元されているのを確認する

結局のところ、データファイルとログファイルを物理的に別のDISKに割り当てる必要があり、ハード自体が複数RAID構成を要求するのが難しいところだろうか・・・。

復旧モデルとトランザクションログ

復旧モデルは「SSMS」の以下の操作で設定することができる。

  1. 「SSMS」起動
  2. 「オブジェクトエクスプローラ」で対象のDBを右クリックして「プロパティ」を選択
    image
  3. 「オプション」ページを選び「復旧モデル」のドロップダウンを展開すると「完全」「一括ログ」「単純」の3種類が選択できる
    image

コマンドからこの指定を行うには以下の通り
image

なお、複数DBをまとめて設定する場合はPowerShellなんかを使っても良さそう。
PowerShell: ◆SQLServer データベースの復旧モデルを更新する

復旧モデルの違い

復旧モデルの説明を以下からそのまま転載しておく。
自習書シリーズ - Microsoft SQL Server 2012

  • 完全(Full)モデル
    完全モデルは、トランザクション ログへすべての処理履歴を完全に記録するモデルです。これは、Standard エディション以上のデフォルトの復旧モデルです。このモデルでは、前の手順で試したように、障害発生時に障害が発生した直前までデータを復旧することができます。また、時刻を指定した復旧も可能で、ほとんどの環境で最適なモデルです。
  •  一括ログ(Bulk Logged)モデル
    一括ログ モデルは、一括(bulk:バルク)操作(インデックスの作成や再構築、bcp コマン
    ド、BULK INSERT ステートメント、Integration Services パッケージ、SELECT INTO、INSERT INTO など)のパフォーマンスを向上するために、トランザクション ログへ記録する情報を最小限に抑えるモデルです(この動作は、最小ログ記録とも呼ばれています)。
    しかし、ログへ記録される情報が少なくなるということは、障害発生時に一部の操作が復旧できない可能性があることを意味します。また、このモデルでは、時刻を指定した復旧もできません。障害復旧よりも一括操作のパフォーマンス向上を重視したい場合には、このモデルを使用します。
  • 単純(Simple)モデル
    単純モデルは、SQL Server 7.0 以前のバージョンでは「チェックポイント時のログ切り捨て」(trunc. log on chkpt)と呼ばれていました。その名のとおり、チェックポイントが完了するごとに、現在実行されているトランザクションを除いて、トランザクション ログを切り捨てます。これによって、トランザクション ログの使用領域を最小に抑えて、ログの肥大化を防ぐことができます。
    このモデルでも、自動復旧機能は正常に動作しますが、障害発生時に障害が発生した直前までデータを復旧することはできません。また、トランザクション ログのバックアップも実行することができません。したがって、開発時などディスク領域を節約したい場合や、障害時にバックアップを取得した時点までの復元ができれば良い場合にのみ利用するようにします。

0 件のコメント:

コメントを投稿