|
SQL Serverのデータベースバックアップ機能の大きな特徴は、オンラインバックアップ機能が提供されていることです。データベースがクライアントによって使用されている間でも、該当するデータベースのバックアップを行うことができます。
データベースサーバーマシンのパワーが十分あり、オンラインバックアップ中にクライアント側アプリケーションへの影響が無ければ、データベースサーバー管理者だけの都合でデータベースのバックアップの実行が自由にできることはなんと素晴らしいことでしょうか!
しかしよくよく考えてみると、このオンラインバックアップは、すごく不思議な機能であることに気が付きます。この仕組みを探求することが、実はデ−タベースの復元操作手順を理解することに関係するのです。最初に、このオンラインバックアップの不思議さについて、勉強してみましょう。
オンラインバックアップの不思議さを調べるために、簡単なスクリプトをクエリアナライザで実験したいと思います。
最初に、図1のように、TESTデータベースを作成します。
 |
| 図1:TESTデータベースの作成 |
次に図2のように、簡単なTESTテーブルをTESTデータベースの中に作成します。
 |
| 図2:TESTテーブルの作成 |
さてこのTESTテーブルの中にレコードを図3のように、挿入します。但し、2回目のレコード挿入命令は、明示的なトランザクションを構成し、その中で1分間わざと待機させて、その後にレコード挿入を中止させます。この1分間待機している間に、データベースのバックアップを図4のように実行します。待機中に、データベースのバックアップが終わるように、キーボード操作を実行してください。
 |
| 図3:レコードの挿入。1分間待機している間にバックアップを実行する |
 |
| 図4:データベースのバックアップ命令 |
さてここで問題です。このバックアップファイルからデータベースを復元したときに、2回目のINSERT命令はどのように反映されるでしょうか?

オンラインバックアップについて考えると、このような例題のように、バックアップ命令を実行している間に、未完了のトランザクションが存在するということに直面します。この未完了のトランザクションとは、トランザクションがコミットしたのかロールバックしたのかその結果がわからない状態のトランザクションのことです。つまり例題のように、トランザクションの開始を宣言して、レコードを挿入した直後に1分間待機して、この間にデータベースのバックアップを実行しました。そのバックアップの中には、未完了状態のトランザクションの内容がそのまま含まれていることになります。

さてこのような未完了状態が含まれているバックアップからデータベースを復元し、レコードの状態を見てみましょう。
 |
| 図5:TEST2データベースの復元 |
図5のようなプログラムを実行します。その実行結果が図6です。
 |
| 図6:TEST2データベースの復元 |
結論から言えば、データベースを復元するときに、その復元内容に未完了のトランザクションが含まれているときは、その部分をすべてロールバックした状態でデータベースが復元されます。復元されたデータベースには、未完了のトランザクションは存在しません。そのため図6には、最初のレコードしか表示されないわけです。
オンラインバックアップ機能とは、未完了状態のトランザクション部分は未完了の状態でバックアップを実行します。今存在するあるがままの状態でバックアップが取られます。そのかわりデータベースを復元するときに、未完了のトランザクションはロールバックされるということになります。
では、復元命令について簡単に解説をしたいと思います。復元命令の基本形は、
RESTORE DATABASEデータベース名
FROM DISK = ‘バックアップファイル名’
です。
BACKUP DATABASE文の構文と非常によく似ています。
ハードディスクに記録されたバックアップファイルから、指定された名前でデータベースを復元します。もし同じ名前のデータベースが存在するときはエラーになりますので、上書き復元オプションが必要です。WITH REPLACEオプションを付けることによって、すでに存在する同じ名前のデータベースを破棄して復元操作が行われます。
また図5のように、物理ファイルの復元先を再定義することができます。データベースの論理ファイル名と物理ファイルとの対応関係の定義です。
RESTORE DATABASE文は、バックアップを実行したときと同じディレクトリ位置に、データベースの物理ファイルを復元します。ですから、WITH REPLACEオプションを付けない限り、物理ファイルの復元で同じ物理ファイル名がすでに存在するとエラーが発生し復元操作が失敗します。そこでMOVEオプションによって、物理ファイル名を変更することができます。
また使用中のデータベースの復元はできません。
USETEST
GO
RESTORE DATABASE TEST
FROM DISK=’バックアップファイル名’
GO
このようなミスを時々犯すことがあります。自分がTESTデータベースを使用しているので、TESTデータベースの復元はできません。
正しくは
USE master
GO
このように、masterデータベースに入りましょう。

データベースの復元では、最初に基点となる全体バックアップを復元します。その後に、差分バックアップを復元したり、トランザクションログのバックアップを復元したりと、複数個のバックアップファイルを連続して使用することがあります。
このような連続復元操作では、1つの注意が必要です。
復元操作の基本は、復元されたデータベースの中には未完了のトランザクションが存在しない状態で復元をします。ところが連続して復元操作を行うときは、一番最後を除いて途中の復元操作は、未完了のトランザクションはそのまま残さなくてはいけません。ロールバックしてはいけません。バックアップ命令を実行したときとまったく同じ状態の、あるがままの姿に復元をしてください。
それは、次の復元操作に使われるバックアップファイルの中に、その直前の未完了のトランザクションの結果が反映されていると考えるからです。
途中途中の復元は、バックアップ命令を取ったときと同じ状態に復元を行って、最後の復元操作だけ、未完了のトランザクションのロールバック処理を行います。
このことはRESTORE DATABASE命令のオプションについて注意しなければいけません。何もオプションを付けないと、未完了のトランザクションをロールバックしてデータベースが使える状態にします。これは、WITH RECOVERYオプションと呼ばれます。
それに対して、未完了のトランザクションをそのまま放置して何も操作しない状態で復元を行うときは、WITH NORECOVERYオプションを付けなければいけません。
WITH RECOVERYオプション(デフォルトです。省略できます)とWITH NORECOVERYオプションの使い分けをしっかり覚えてください。
Enterprise Managerでは、図7の中で、
 |
| 図7:復旧完了状態オプションに注意する |
『データベースは操作可能状態。別のトランザクションログの復元は不可』というオプションが、WITH RECOVERYのことです。
『データベースを操作不可状態。別のトランザクションログの復元は可能』というオプションが、WITH NORECOVERYのことです。
以上のオプションの使い分けに注意しましょう。
第4回の学習のまとめ
| (1) |
オンラインバックアップによってバックアップファイルの中に生じる未完了のトランザクションについて理解する |
| (2) |
RESTORE DATABASE文の基本構文を覚える |
| (3) |
WITH RECOVERYオプションを理解する |
| (4) |
WITH NORECOVERYオプションを理解する |
|

|