データベースの基礎

多くのDBMSは、データを更新するとき、更新の内容をログ(ジャーナル)に記録し、そのログをデータベース本体より先に不揮発性の記憶装置に書き込む(WAL: ログ先行書き込み)。この方式をとる主な理由はどれか。

  1. A障害が起きても、ログをもとにコミット済みの更新をやり直し、コミットしていない更新を取り消して、正しい状態に戻せるから
  2. Bログを先に書くと、データベース本体の容量が小さくなるから
  3. CSELECT文の検索で、ログを索引として使えるから
答えと解説を見る

正解:A. 障害が起きても、ログをもとにコミット済みの更新をやり直し、コミットしていない更新を取り消して、正しい状態に戻せるから

データベース本体のページは、性能のため、メモリ上のバッファで更新したあと、しばらくしてから記憶装置に書き込まれます。そのため、障害が起きた瞬間には、コミットしたのに本体に書かれていない更新や、コミットしていないのに本体に書かれた更新が混ざっている可能性があります。更新前の値と更新後の値をログに記録し、ログを本体より先に書き込んでおけば、障害のあとにログをもとに、コミット済みの更新をやり直し(ロールフォワード、REDO)、コミットしていない更新を取り消して(ロールバック、UNDO)、正しい状態に戻せます。コミットは、そのトランザクションのコミットの記録がログに書き込まれた時点で完了とみなせるので、本体のページを毎回すぐに書き込む必要がなく、性能も保てます。この仕組みが、ACID特性の原子性と耐久性を支えています。

  • A. 正しい。ログを先に書いておくことで、障害のあとにREDOとUNDOで正しい状態に戻せます。
  • B. ログは本体とは別に記録するもので、本体の容量を小さくするものではありません。
  • C. ログは障害から回復するための記録で、検索の索引には使いません。
この分野を解く 分野ページへ

関連する計算ツール

データベースの基礎の参考書を探す PR

Amazonの検索結果へのリンクです。Amazonのアソシエイトとして、半導体教室は適格販売により収入を得ています。

データベースの基礎のほかの問題

  1. トランザクションT1〜T5があり、障害が発生する前にチェックポイントを1回取った。T1はチェックポイントの前に開始してコミットした。T2とT3はチェックポイントの前に開始し、T2はチェックポイントのあと障害の前にコミットし、T3は障害の時点でコミットしていなかった。T4とT5はチェックポイントのあとに開始し、T4は障害の前にコミットし、T5はコミットしていなかった。障害のあとの回復で、ログを使ってロールフォワードする必要があるトランザクションはどれか。
  2. 100万行ある会員表の会員番号の列にB+木のインデックスを作成した。一般に期待できる効果と、その代償の組み合わせとして正しいものはどれか。
  3. 100万行の会員表で、会員番号(すべて異なる)、都道府県(47種類)、性別(2種類でほぼ半々)の列に、それぞれB+木のインデックスを作ることを考える。WHERE句で1つの列の値を指定して検索するとき、インデックスの効果が最も小さいと考えられる列はどれか。
  4. NoSQLと呼ばれるデータベースのうち、キー・バリュー型の特徴として、一般に正しいものはどれか。
  5. 複数のサーバにデータの複製を置く分散データベースについての、CAP定理の説明として適切なものはどれか。