Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
神谷 雅紀
Escalation Engineer
最近 recovery interval オプションが何を指定しているオプションであるのかはっきりしないという話がありましたので、今回は recovery interval について説明したいと思います。
データベースの復旧とは?
recovery interval は、Books Online にも記載があるとおり、データベースの復旧に必要な時間の上限を指定するオプションです。では、データベースの復旧とは何でしょうか?
データベースの復旧 (英語では recovery) とは、未完了のトランザクションの取り消し (ロールバック / roll back) と、データファイルに反映されていない完了済みトランザクションのデータファイルへの反映 (ロールフォワード / roll forward) を行う処理です。
※ ハードウェアエラーなどにより壊れてしまったデータベースを修復する (repair) ことやバックアップからデータベースを復元する (restore) ことではありませんのでご注意下さい。
データベース復旧は、データベースの開始時に自動的に行われます。データベース復旧においてロールバックやロールフォワードしなければならないトランザクションの数は、データベースシャットダウン時に実行されていたトランザクション量とデータベースファイルへの書き出しが行われてから実行された更新量に依存します。
データベースへの書き出し処理は CHECKPOINT と呼ばれ、自動 CHECKPOINT は、ユーザー処理とは非同期にバックグラウンドタスクとして実行されています。
例えば、図 1 のように、データベースのシャットダウン直前に 4 つのトランザクションが実行されていたとします。トランザクション 1 は最後の CHECKPOINT 後に Commit、トランザクション 2 は最後の CHECKPOINT 後に Rollback、トランザクション 3 はデータベースシャットダウン時にはまだ実行中で Commit も Rollback もされておらず、トランザクション 4 は最後の CHECKPOINT よりも前に Commit されている状態であったとします。
<図 1>
このようにしてシャットダウンされたデータベースを開始すると、図 2 のようにデータファイルは最後の CHECKPOINT が実行された時の状態になっています。
<図 2>
この状態から、トランザクションの原子性 (atomicity) と永続性 (durability) が保たれ、一貫性のある状態 (consistency) にするためには、図 3 のように、トランザクション 1 については、前回の CHECKPOINT 後に行われた更新をデータファイルに反映するためにロールフォワードし、トランザクション 2 と 3 については、トランザクション全体をロールバックしなければなりません。
※ ACID (atomicity, consistency, isolation and durability) については、Books Online や Wikipedia などを参照して下さい。
<図 3>
その結果、データベースには、トランザクション 1 と 4 の更新結果が反映され、トランザクション 2 と 3 は取り消された状態になり、前回データベースがシャットダウンされた時の状態となります。
この図 3 で示されているロールバックとロールフォワードの処理が、データベース復旧処理です。
データベース復旧が完了すると、データベースは利用可能な状態 (オンラインの状態) になります。
recovery interval は何を指定しているのか?
実際には、トランザクションは、その分離性および独立性 (isolation) を維持するために直列化されていますので、実際のデータベース復旧は図 4 のように複数のトランザクションが直列化された状態で行われます。このデータベース復旧に必要となる予想時間の最大時間を指定するためのオプションが recovery interval です。
<図 4>
ただし、データベースシャットダウン時に実行中であったトランザクションのロールバックにかかる時間は考慮されません。正確に言えば、考慮されないのではなく、そのようなトランザクションのロールバックは、実行されるトランザクションに依存するため、制御することができません。
例えば、recovery interval の値が既定値であっても、データベースシャットダウン時に、開始から 10 時間経過している実行中の更新トランザクションがあった場合には、次回データベース開始時の復旧では、そのトランザクションのロールバックに 10 時間必要になる場合もあります。
尚、Enterprise エディションであれば、高速復旧 (fast recovery) と呼ばれる機能により、そのようなロールバックが完了する前にデータベースはオンラインになり、ロールバック中にアクセスされるデータ以外へのアクセスは可能になります。
recovery interval の変更は何に作用するのか?
データベース復旧は、前回の CHECKPOINT 以降に行われた変更を再実行する処理であるため、CHECKPOINT 以降に行われた変更が多ければ多いほど、処理に必要な時間が長くなります。つまり、データベース復旧にかかる時間は、CHECKPOINT の頻度に左右されることになり、データベース復旧にかかる最大時間を指定する recovery interval の設定値は、「どの程度の更新が行われると CHECKPOINT を実行するか」を制御する値ということになります。
つまり、recovery interval の値を大きくすると、CHECKPOINT の間隔は長くなり、小さくすると短くなります。(図 5 の赤や黄色の○はトランザクションでの更新を表しています。)
<図 5>
recovery interval 変更時の考慮事項
recovery interval の値を大きくすると、CHECKPOINT の間隔が長くなるため、一般的に、一度の CHECKPOINT で書き出されるデータ量は多くなります。その結果、CHECKPOINT 時にディスク負荷が高くなる可能性があります。
追加情報 : さらに詳細な調整を行う方法
recovery interval 構成オプション以外にも CHECKPOINT を制御するための方法が提供されています。-k 起動パラメータや ALTER DATABASE SET TARGET_RECOVERY_TIME (SQL Server 2012 以降) がそれです。より短い CHECKPOINT 間隔が必要な状況や CHECKPOINT により書き出されるデータ量を調整したい場合には、これらの機能を使用することができます。