A型システムエンジニアの勉強メモ

情報処理試験の午前問題をネタにして、解説をじっくり書きながら勉強しています。基礎は大事。

広告

基本情報技術者試験 平成31年度 春期 午前 問57

トランザクションと、ロールフォワードと、ロールバックについての問題。

 

--------------------------

基本情報技術者試験

平成31年度 春期 午前 問57

 

ディスク障害時に、フルバックアップを取得してあるテープからディスクにデータを復元した後、フルバックアップ取得時以降の更新後コピーをログから反映させてデータベースを回復する方法はどれか。

 

ア チェックポイントリスタート

イ リブート

ウ ロールバック

エ ロールフォワード

--------------------------

解説

 

データベースの処理にはトランザクションという考え方がある。

意味のある一連の処理をまとめたもので、原子性(atomicity)という特性をもつ必要がある。

原子性とは "一連の処理が全て完了している" か "何も処理をしていない" のどちらかの状態になることが保証されていることを示す。

 

 

複数のトランザクションがデータベースを利用している状況を考えてみる。

 

f:id:koki2016:20201205112639p:plain

 

 各トランザクションがどのようなことをしているか。

  • データベースの内容を更新する場合は、ディスク装置から必要な部分のデータをメモリ上にもってきて、メモリ上でデータベースの内容を更新する。
  • メモリ上でデータベースの内容を更新する前に、どのような更新をするかが書いてあるログ(トランザクションログ、ジャーナルログとも呼ぶ)をディスク上(データベースとは別の領域)に保管する。
  • 一連の処理が全て完了したらコミットによりトランザクションの処理を確定させる。トランザクションログにもコミットをしたことを記載する。

 

トランザクションによるデータベースの更新データはメモリ上にしかないこと、トランザクションログはデータベースとは別の領域に保管されていること、トランザクションログにコミットの記録があれば一連の処理全て完了していることになる、が重要。

 

 

データベースの更新データはメモリ上にしかないので、このままでは障害が発生したときに、メモリ上の更新データは消失してしまう。

メモリ上の更新データを定期的にディスク装置上のデータベースに反映する処理がチェックポイントとなる。

 

f:id:koki2016:20201205112649p:plain


チェックポイントでどのようなことが起きているか。

  • トランザクションがメモリ上で処理したデータベースの更新内容を、ディスク装置上にあるデータベース本体に全て反映する。
  • トランザクションどのような状態であるかは気にしない。上の図でトランザクション②は処理の途中であるため、ディスク上のデータベースは中途半端な状態になってしまっている。

 

ディスク装置のフルバックアップを取った場合、そのバックアップに含まれているデータベースの内容は、最も最近のチェックポイントにおいて更新された状態になる。

 

 

トランザクションとチェックポイントの説明をしたところで、障害が発生した場合を考える。

 

f:id:koki2016:20201205142839p:plain

 

赤矢印のタイミングで障害が発生し、システムが停止したとする。

データベースはフルバックアップから回復し、トランザクションログは全て無事である状況とする(=問題と同じ状況)。

  • フルバックアップからの復旧により、図のチェックポイントのタイミングで更新された状態のデータベースまでは回復している。
  • チェックポイント~障害発生の間のデータベース更新は全てメモリ上で行われていたので、システム停止により全て消失している。
  • トランザクションログはチェックポイント関係なくディスクに出力されているので、障害発生の直前の状態で残っている。

 

ここからどうやって回復処理を続けるかを各トランザクション毎にみる。

 

トランザクション①の場合

  • チェックポイントの前に開始し、チェックポイントの前に完了(コミット)している。
  • チェックポイントの前に全ての処理が完了しているので、ディスク装置上のデータベースにも全ての更新データが反映されている。
  • つまり何もする必要がない。トランザクションログも用なし。

 

トランザクション②の場合

  • チェックポイントの前に開始し、チェックポイント通過後、障害発生の前に完了(コミット)している。
  • データベースの状態はチェックポイントのタイミングなので、トランザクション②については中途半端な処理の状態がデータベースに残ってしまっている。
  • つまり原子性が保てていないので不正な状態になっている。
  • 障害発生前に完了(コミット)はしているので、トランザクションログにはチェックポイント以降に(メモリ上で)更新した処理の履歴が全て残っている。
  • トランザクションログに残っている更新後の情報をデータベースに反映すれば、トランザクション②が完了した状態にもっていくことができる(原子性が保てる)。
  • このような処理をロールフォワードと呼ぶ。バックアップで復元した状態からトランザクションログで前向き(forward)に転がる(roll)からロールフォワード。
  • 問題文にある "更新後コピーをログから反映" はこの処理のことをいっている。なので問題の答えは選択肢エ

 

トランザクション③の場合

  • チェックポイントの前に開始し、チェックポイント通過後、障害発生時点で完了(コミット)できていない。
  • データベースの状態はトランザクション②と同じく中途半端な、原子性が保てていない状態で残ってしまっている。
  • トランザクションログには完了(コミット)のログがないので、ロールフォワードはできない。
  • この場合、トランザクションログにある更新前の情報を用いて、トランザクション③の開始~チェックポイントの間にやった更新を全て取り消せば、トランザクション③がなにも実行されていない状態になり、原子性が保てる。
  • このような処理をロールバックと呼ぶ。バックアップで復元した状態からトランザクションログで後ろ向き(back)に転がる(roll)からロールバック

 

 

Q:なんでデータベースの更新を毎回ディスクに反映しないのか?

A:性能を保つため。全てのトランザクションがデータ更新する度にディスク装置に書き込みをしていたら時間がかかってしまい、データベース全体として性能が劣化してしまう。ディスク装置への書き込みは、メモリの更新と比較してすごい時間がかかる。

 

Q:全てのトランザクションログを保管していれば、フルバックアップがなくても回復できる?

A:回復できる。ただし、ものすごい時間がかかる可能性がある。障害復旧では迅速な回復が求められるので、フルバックアップを戻したのちに必要なトランザクションログだけを回復に利用する方がいい。

 

Q:障害時にトランザクションログも壊れていた場合はどうなるのか?

A:ロールバックもロールフォワードもできないので、原子性が保てていない不正な状態のデータベースのままになってしまう。トランザクションログは信頼性の高いディスクに出力することがオススメ。

 

 

前後の問題はこちら。

koki2016.hatenadiary.com