Document

リカバリ
東大生研 情報融合研究センタ
喜連川優
リカバリの考え方
• トランザクション障害からのリカバリとは障
害時点に最も近いconsistentな状態へ復帰
することを指す
• ログ:リカバリのための情報格納
• カタストロフィーからの復帰
– テープ上のバックアップからログを適応して
(redo)障害直前の状態まで戻す
• アボート等からの回復
– オンラインログを利用して、処理を元に戻す
(undo)ことにより正常な状態へ戻す
更新手法
• Deferred update
– トランザクションがコミットするまで、更新情報
をすぐにはディスクに反映しない手法。NOUNDO/REDO 方式と呼ばれる。
• Immediate update
• Immediate Update
– コミット前にデータベースが更新される可能性
がある。UNDO/REDO 手法と呼ばれる。
– すべての更新をDBに反映した後にのみ、コ
ミットするという手法を採用する場合には
redoは不要となるため、UNDO/NO-REDO手
法と呼ばれる。
• OSとの関連が非常に強いのが実情
• 性能上極めて重要なため、OSに制御を委ねる
のではなく、DBMSが強制管理
• <disk page address, buffer location>
• pin, un-pin操作
• 更新技法
– Inplace update 元の場所を更新(ログが必須)
– Shadowing
新しい場所に更新を保存
Write Ahead Log
• in-place updateをする場合には、リカバリ
のためにはログが不可欠であり、before
imageがDB上で上書きされる前にログ上
にBIを強制的に書き込む必要がある。この
処理は write ahead loggingと呼ばれる。
• steal/ no steal
– コミット前には更新をDBに書かない(no steal):
deferredと同義
– 書き込みを許す。(steal)
• force/ no force
– コミット時にDBをすぐ更新(force)
– 更新しなくても良い(no force)
• 通常のDBMSは steal/ no force
– Stealにしないと巨大なバッファ空間が必要
– No forceにすると、更新頻度の高いページを毎
回ディスクに書き込む必要がなくなる。
チェックポイント
• DBMSのバッファの更新された全てのブロックを
定期的にDBに吐き出す。
• この時、ログ上に[checkpoint]なるレコードを記録
• [checkpoint]以前の[commit,T]なるトランザクショ
ンに対しては障害発生時にredo不要。
• チェックポイントの期間設定はどうする?
– ○分毎 あるいは
– ○個のトランザクションがコミットする毎
チェックポイントの取得
•
•
•
•
トランザクションの実行を一時的にサスペンド
更新された主記憶上のバッファをDBへ強制的に反映
[checkpoint]の書き込み
トランザクションの再開
– 追加情報:アクティブトランザクションのリスト、それぞれに対して、最初
と最後のログレコードの場所も書き込んでおくと、UNDOが容易。
• Fuzzy checkpointing
– [checkpoint]レコードを書き、DBに書きながら通常トランザクションを実
行。書き込み終了以前には前の[checkpoint]を利用。完了すると当該
[checkpoint]に切り替え。
ロールバック
• データベースを更新し、コミット前に障害が発生し
たらロールバックが必要。
• undo logを利用
• 例
– T3が最初に起動され、*でBを更新
– T2が**時点でその値を参照し、更に更新、また、T
2は下の**でもDを更新。
– 従ってT3をロールバックすると、その更新を参照した
T2も同時にロールバックする必要がある。
• 通常はcascade rollbackをすることはまづない。プ
ロトコルをstrictにしている為。
• ログにreadを入れているが、これはcascade
rollbackの必要性を判断する為のものであり、
strictにすればこのエントリも不要。
Deferred Update時のリカバリ
• Deferred Update protocol:
– トランザクションはコミットポイントに至るまでデータ
ベースを変更出来ない。
– トランザクションは全ての更新をログに書きそれをディ
スクに強制書き込みするまではコミットポイントに至ら
ない
• 一般的にはトランザクションが短い実行時間で、
更新対象数が少ない場合にのみ適応可能。そ
れ以外はバッファ溢れが生ずる。
• WALと同じこと。
• NO UNDO/REDO プロトコル
同時実行制御とリカバリ
(単一ユーザ)
• 最近のチェックポイント以降、コミットしたトランザ
クションのリスト 及び、アクティブトランザクショ
ンのリスト(この場合高々一つ)を利用
• コミットしたトランザクションwrite操作をログから
抽出し、記載された順にREDOを施す。その後再
投入
• ここでREDOとは[write_item,T,X,new_value]なる
エントリに対して、new_valueをXに設定すること。
• REDO= idempotent
– リカバリ最中にシステムがダウンしても回復可能
T1のwriteのみREDO
T2は 未コミット
マルチユーザ環境
• 同時実行制御とリカバリは強い関連が有り一体
化することが多い。一般的には並列性を上げよう
とすると、その分だけリカバリが複雑になること
が多い。
• Strict Two Phase Locking:コミット時点までロック
を開放しない。
• 前述同様に最近のチェックポイント以降、コミット
したトランザクションリストとアクティブトランザク
ションリストを利用
• ログに記載された順でコミットしたトランザクショ
ンのみそのWRITE操作をREDO。アクティブでコ
ミット前のトランザクションを再投入
例
•
•
•
•
•
•
•
t1:チェックポイント
T1はコミット済み
T3,T4は 未コミット
t2 :システムダウン
T2とT3はコミット、T4とT5はまだ。
T1のREDO不要 チェックポイント前
T2とT3のREDO必要、チェックポイントの後でコ
ミットしている。
• T4とT5は REDO不要
リカバリの効率化
• REDOを昔から現在にむかって適応する
のではなく、時間を遡って適用する。
REDONEリストを作成し、既にREDOして
いたら、無視する。(どうせ上書きしている
ので)
• マルチユーザのリカバリの例
UNDO/REDO Recovery based
on Immediate Updates
• 最近のチェックポイント以降のコミットしたトランザク
ションのリスト(コミットリスト)とアクティブトランザク
ションのリストを利用
• アクティブトランザクションのwrite操作をUNDOする。
• UNDOとは[write_item, T,X,oldvalue,newvalue] なるロ
グエントリに関して、Xの値をoldvalueに設定。UNDO
操作はログに書き込まれた順序と逆の順序で行う。
• コミットしたトランザクションに関しては前述のように
REDO操作を行う。
Shadow Paging
• トランザクション実行開始時にcurrentからshadow
にページへのポインタをコピー、それをディスク
へ格納。ディレクトリはメモリ常駐
• 前の状態をshadow pageとしてshadow directoryに
保持
• トランザクションはcurrent directoryの指すページ
を操作
• コミット時にはshadowを破棄
• アボート時にはcurrentを破棄
• 問題
– Currentからshadowへのディレクトリ移動をATOMICに実行するこ
とが前提
– ディスク上でのデータページが動くため最適化困難
– GC