論理復帰
高速データベース復旧ではPVS【注1】を活用して、データの一貫性を保証したアクセスを実現しています。その動作は「論理復帰」と呼ばれます。従来のトランザクションログをもとにしたデータベース復旧との違いを理解する上で、「論理復帰」の詳細な流れを把握することはとても重要です。「論理復帰」操作では次のような流れで、一貫性を保証したデータアクセスが行われます。
- データベース内のデータが更新されると、更新前データはデータを生成したトランザクションIDと関連付けられたうえでPVSに移動されます。
- クライアントからのクエリによるデータアクセスが行われる際には、まずトランザクションIDに基づいて最新バージョンのデータを生成したトランザクションの状態(アクティブ、コミット、または中止)をチェックし、どのバージョンを使用すべきかを判断します。
- トランザクションがアクティブであるかコミットされている場合、クライアントがアクセスすべきデータはクエリ分離レベルに依存します(たとえばアクティブの場合、Read Uncommitted分離レベルと、それ以外ではアクセスすべきデータが異なりますよね)。
- トランザクションが中止された場合、関連付けられたバージョンのデータが使用されることはありません。PVS内のデータのバージョンのつながりを確認し、コミットされたデータを探し出して使用します。
この「論理復帰」操作によって、中止されたトランザクションが存在しても一貫したデータアクセスが可能となっています。ただし、コミットされたデータを取得するために複数のバージョンの状態を確認する可能性があるため、パフォーマンスの観点からはオーバ―ヘッドとなることに留意する必要があります。
【注1】PVS(Persistent Version Store):永続バージョンストア。詳細は前回記事を参照してください。
論理復元
これまでも繰り返し紹介してきましたが、高速データベース復旧の最も重要な動作は、トランザクションログを逐次適用せずにUNDOを実現し、大幅な復旧時間短縮を可能にする点です。その操作は「論理復元」(先述の「論理復帰」と類似していてややこしいのですが……)と呼ばれ、次のようなステップで実行されます。
- 中止されたトランザクションによって行われた更新操作を無効化します。そしてPVS内のコミットされたバージョンの行を、データベース内のデータページに戻すことによってデータの一貫性を保持します。この操作の後、PVS内のデータは不要になりクリーンアップ対象として削除されます。
-
PVSの行をデータページへ戻す際に、中止されたバージョンとコミットされたバージョンのデータの状態を比較し、必要な補正操作(挿入、更新、または削除)を実行して、行をコミット時の状態に復元します。この補正操作によって実行される行の復元操作は行バージョンによる管理ではなく、通常のトランザクションログを使用して更新操作が管理されます。
その理由は、論理復元によって実行されるデータ復元操作では、かならず一度に1行分のデータだけが復元されることに起因します。一連の操作は、(1行だけの復元なので) 非常に短時間で完了することが保証されているため、トランザクションログを使用した更新を行ってもデータベースの復旧時間に影響を与えることはありません。 - 「論理復帰」操作はバックグラウンドで処理され、中止されたトランザクションによって実行されたすべての更新を破棄してデータの一貫性を保ちます。