データベースの基礎
多くのDBMSは、データを更新するとき、更新の内容をログ(ジャーナル)に記録し、そのログをデータベース本体より先に不揮発性の記憶装置に書き込む(WAL: ログ先行書き込み)。この方式をとる主な理由はどれか。
- A障害が起きても、ログをもとにコミット済みの更新をやり直し、コミットしていない更新を取り消して、正しい状態に戻せるから
- Bログを先に書くと、データベース本体の容量が小さくなるから
- CSELECT文の検索で、ログを索引として使えるから
答えと解説を見る
正解:A. 障害が起きても、ログをもとにコミット済みの更新をやり直し、コミットしていない更新を取り消して、正しい状態に戻せるから
データベース本体のページは、性能のため、メモリ上のバッファで更新したあと、しばらくしてから記憶装置に書き込まれます。そのため、障害が起きた瞬間には、コミットしたのに本体に書かれていない更新や、コミットしていないのに本体に書かれた更新が混ざっている可能性があります。更新前の値と更新後の値をログに記録し、ログを本体より先に書き込んでおけば、障害のあとにログをもとに、コミット済みの更新をやり直し(ロールフォワード、REDO)、コミットしていない更新を取り消して(ロールバック、UNDO)、正しい状態に戻せます。コミットは、そのトランザクションのコミットの記録がログに書き込まれた時点で完了とみなせるので、本体のページを毎回すぐに書き込む必要がなく、性能も保てます。この仕組みが、ACID特性の原子性と耐久性を支えています。
- A. 正しい。ログを先に書いておくことで、障害のあとにREDOとUNDOで正しい状態に戻せます。
- B. ログは本体とは別に記録するもので、本体の容量を小さくするものではありません。
- C. ログは障害から回復するための記録で、検索の索引には使いません。