第6章 トランザクション管理 6.1 トランザクションの概念 6.2 同時実行制御 6.3 障害回復 6.3 障害回復 1.障害とその回復 (a) トランザクションと障害 【目的】 データベース操作中や実行後に何らかの障害やエ ラーが起きたとき、データベースの一貫性を保つこと。 システムがダウンしたとき、処理結果を保存して あれば、その結果は残っているがセーブしていな いデータは失われてしまう。 途中で障害が起きても良いケース 残高チェックの処理のとき障害が起きた場合 データベースは更新されていないので、 データベースの内容は正常に保たれている。 (最初からやりなおせばよい) 途中で障害が起きたら困るケース(1) ①残高チェック ②引き落とし処理(ここで障害が起きた場合) ③振込処理 A. ②の更新が行われているが、③の受取人への振込が 行われていない。 B. 最初からやり直すと2回分の引落としが行われる。 C. ③からやり直すと、バッファからまだ書き込まれていな い状態で障害が起きていたら、引落しされないで受取 人の口座に振込が行われる。 トランザクションの原子性 トランザクションを一体として扱う。 トランザクションを すべて有効とするか/すべて無効とするか のどちらかを保証する。 途中で障害が起きたら困るケース(2) 予約送金(ここで障害が起きた場合) A. ハードディスクの内容が壊れていなければ、そのまま でよい。 B. ハードディスクが壊れていたら、データ内容を回復する 必要がある。 (b) 障害の種類 ①トランザクション障害 プログラムバグや端末障害などによるトランザクションの異常終 了(単一のトランザクションに限定される) ②システム障害 ハードウェア異常やソフトウェアのバグでシステムダウンし、すべ ての処理が停止する障害。主記憶装置の内容はすべて失われる。 ③メディア障害 ディスク内容が失われる障害。ディスククラッシュ、誤操作、意図 的な消去などがある。 バッファのフラッシュ ①データベースへのアクセスは、通常バッファを用いて行う。 ②書込み時にバッファに書き込まれていないデータが残っている かどうかが問題となる。 ③未書込みのバッファをディスクに書き込み(バッファのフラッシュ という)、書込みを保証する。 (c) UNDO, REDOと障害回復 【障害回復の基本的な処理】 ①UNDO ・トランザクションがデータベースに対して行ったすべての処理の 取り消しを行う。 ・トランザクション開始前の状態に戻す。 ②REDO ・コミットしたトランザクションの再実行を行う。 ・応用プログラムを再実行するのではなく、データベースへ内容 が再実行した場合と同じであればよい。 UNDO, REDOを障害別に適用 ①トランザクション障害の回復 ・該当トランザクションをUNDOする。 ・トランザクションの再実行はユーザの責任で行う。 ②システム障害の回復 ハードウェア修理やOSによるシステム回復処理後、 データベースの回復処理を行う。 ・実行中トランザクションはUNDOする(全局的UNDO)。 ・コミットしたトランザクションの更新データが失われた場合 REDOする(局所的REDO)。 (d) メディア障害 ディスク内容が失われるので、 多くのトランザクションが影響をうける。 ハードウェア故障の場合、修理してシステムを回復後、以下を行う。 ① アーカイブ(あらかじめ保存しておいたデータ)を元にデータ ベースを以前の状態に戻す(実行中トランザクション結果はなく なるのでUNDOしなくてよい)。 ② データ保存後に実行されたトランザクションのうちコミットしたトラ ンザクションをREDOする(全局的REDO)。 ③ アーカイブ作成の頻度が高いほど作成のオーバーヘッドが増え るが、障害を早く回復できる(全局的REDOが少なくて済む)。 2.障害回復の方法 (a)ロギングによる障害回復 データベース処理の記録(ログまたはジャーナルという)を用いる 方法 最も重要な情報はデータベースへの書込み記録 ①データ更新前の内容と更新後の内容をログに書き込む。 ②REDOでは、更新後の内容を書き込む。 ③UNDOでは、更新前の内容を書き込む。 (通常、データベース本体の情報とは別のエリア、別のディスクに 書き込まれる) ログをとるタイミング ①ログをとる前にデータベース更新を行うとUNDOできなくなる。 ②コミットしたトランザクションのログがとっていないとREDOできな くなる(バッファから書き込まれるタイミングが問題となる) 【WAL(Write-Ahead Logging)プロトコル】 ①データベースの更新前にログに書く。 ②コミットする前に該当トランザクションのすべてのデータ更新をロ グに書く。 UNDO/REDOアルゴリズムでの処理 (システム障害後の回復処理に用いられる) ①トランザクション開始をログに記録。 ②読込みは、ログをとらずに行う。 ③書込みは、まずログに書き込み、次にデータを書き込む。このと き、ログとデータはバッファ内に残っていてもよい。 ④コミット時は、ログを書き込んだ後、ログをフラッシュし、ディスク に確実に書き込む。 ⑤トランザクションのロールバック時は、ログに書き込んだ後で、 データをUNDOする。 システム障害後の回復処理 ① ログを逆順に調べる。 ② コミットしていないトランザクション(終了していないかロールバッ クがログの中にある)をUNDOする。 ③ コミットしたトランザクションを順にREDOする。 その他のアルゴリズム データベース内容のバッファからディスクへの 書込みタイミングを制限する。 ① UNDO/NO-REDO(REDOを行わない) ② NO-UNDO/REDO(UNDOを行わない) ③ シャドーページ方式 トランザクション中はデータをカレントページとシャドーページに 2重化し、トランザクション終了時に一本化する。 (b) チェックポイント 回復時の効率 アーカイブとすべてのログを用いた回復 ① アーカイブをとるには時間がかかるので頻繁に行うのは困難 ② アーカイブをとってから障害までの時間が長いと、回復処理に 時間がかかる。 ③ システム障害の場合、すべてのログを参照して回復処理を行う のは時間がかかるだけでなく、不要な処理(2回更新されてい れば、2回処理を行う)も行わざるを得ない。 コミットやロールバックのとき、バッファをすべてフラッシュする? 効率が悪い。フラッシュ途中の障害への対処も必要 チェックポイントという考え方 定期的にバッファをフラッシュ(この時点をチェックポイントという)し、 それ以降のログだけを用いて障害回復を行う。 ① 新たなトランザクションの開始を禁止。 ② 実行中のトランザクション処理のデータベース処理を一時停止 させる。 ③ バッファ内容をフラッシュし、データベースに書き出す。 ④ 実行中のトランザクションをログに記録。 チェックポイントの例 チェックポイント 障害 T1 時間 T1はチェックポイント前に完了 (処理の対象外) T2 はチェックポイント時実行中で、 その後完了している。 T2 REDO T3 UNDO T3とT4は再実行 T4 REDO T5 UNDO T3 はチェックポイント時実行中で、 障害時も実行中 T4 はチェックポイント後に開始され、 その後完了している。 T5 はチェックポイント後に開始され、 障害時も実行中
© Copyright 2024 ExpyDoc