はじめに
ITの勉強において、やっぱり全範囲を網羅的に勉強しようと思ってもなかなか、先輩・上司に追いつき追い抜くことって時間がかかるものです。そのせいでモチベーション下がったり……
だったら、1つのことに1点集中して『これに関しては同レベルor自分の方が上だ!』と思える領域を少しずつ作っていきましょう!それを続けていけば、どんどんどんどん勝てる領域が多くなり、気づいたら自分が行きたい未来に辿りつきます!
じゃあ今日は、「ロールバック・ロールフォワード」について教えてください。みんなはこれを説明できる??なので、今日はこれを教えてください!
了解じゃ!一言で言うと
『ロールバックはトランザクションをリセットするプロセス。ロールフォワードはデータベース全体を復旧するためのプロセス。』じゃ!では、ネスペ合格レベルを目指す方は以下で詳しく見ていくぞ!
ロールバックの基本知識
ロールバックとは、データベーストランザクションの一部、または全体でエラーや不整合が発生したときに、そのトランザクションが行った変更を元の状態に戻す操作を指します。ロールバックの主な目的は、データベースの一貫性(Consistency)と整合性を保つことです。
要するに、トランザクションの途中でエラーが起きると不整合が生じちゃう。でもそれだとダメだから、もう、いっそのことトランザクションの開始時点までリセットしちゃおうよっていう考え方がロールバック。こんな感じですよね?
まぁそうじゃな
トランザクション
トランザクションとは、データベースにおける一連の操作(例:複数のSQLクエリなど)をまとめたもので、すべての操作が成功するか、全て失敗して元に戻るかのどちらかでなければなりません。この特徴をAutomicity(原子性)と呼ぶ。
例えば…
銀行システムで「Aさんの口座からBさんの口座へお金を送金する」操作を考えてみましょう。口座Aからお金を引き出して、口座Bに入金するという2つの操作が必要です。トランザクションはこれらをまとめた処理であり、どちらか一方だけが成功して、もう一方が失敗することは許されません。もし途中でBさんの口座への入金が失敗した場合、ロールバックによってAさんの口座の引き出しも取り消し、最初の状態に戻す必要があります。
トランザクションのACID特性
ロールバックは、データベースのトランザクションが持つACID特性のうち、特にAtomicity(原子性)に関連しています。
- Atomicity(原子性): トランザクションは「全て成功する」か「全て失敗して元に戻る」かのどちらかであるべき、という性質です。ロールバックによって、エラーが発生した場合は全ての操作が取り消されます。
- Consistency(整合性): トランザクションが行う操作は、データベースのルールや制約(例えば外部キー制約など)を破らないことが保証されます。ロールバックによって、整合性が保たれます。
要するにAutomicityっていうのは「0か100か」ということです。中途半端な状態は許さないことを意味しています。
ロールバックの手順
- ロールバックはトランザクションログを使って行われます。
- トランザクションログには、データベースに行われたすべての変更操作が記録されています。これにより、どのデータが変更され、どのトランザクションが成功または失敗したかが追跡されます。
- もしトランザクションが途中で失敗した場合、トランザクションログを使ってその操作を取り消し、トランザクションの開始前の状態に戻します。
ロールフォワードの基本知識
ロールフォワードとは、データベースに障害が発生し、バックアップからデータベースを復元する際に使われる手法です。ロールフォワードは、データベースの復旧において、バックアップとトランザクションログの両方を組み合わせて使います。これは、主にデータベースのDurability(永続性)を保証するために行われます。
要するに、データベース全体を対象とした復旧にはロールフォワードを使うってことですね。先ほどの、ロールバックはあくまでもトランザクションが対象。このような違いがあるってことですね?
まぁそうじゃな
ロールフォワードの手順
- バックアップの取得:
- データベースは通常、定期的にバックアップされます。このバックアップはデータベースの「ある時点」の完全なコピーであり、データベース全体の状態を保存しています。バックアップは「パッケージ」のように、全てのデータをまとめて保存しており、復元が非常に高速です。
- トランザクションログの取得:
- バックアップ取得後に、データベースで行われた全ての変更(トランザクション)は、トランザクションログとして記録されます。このトランザクションログは、バックアップ後に行われた操作をすべて追跡しています。
- データベース復旧の際の流れ:
- データベースに障害が発生した場合、まずバックアップを使ってデータベースを復元します。しかし、バックアップはその取得時点の状態しか反映していないため、最新の状態には戻りません。
- そこで、バックアップ取得後のトランザクションログを使って、バックアップ以降の変更を順次適用していきます。この過程がロールフォワードです。
ロールフォワードの具体例
例えば、10月1日にデータベースのバックアップを取得し、10月3日に障害が発生したとします。この場合はまず、①10月1日のバックアップを復元し、その後、②10月1日から10月3日までに行われたトランザクションログを適用して、最新の状態に戻します。これにより、データベースは10月3日時点の最新の状態に復旧されます。
バックアップとトランザクションログの役割の違い
ふっと思ったんですけど、トランザクションログだけでよくないっすか?なんでわざわざバックアップを準備する必要があるんですか?
それは非常に鋭い疑問じぁな。ではその答えを両者を比較しながら明らかにしていこう!
バックアップ:
バックアップは、データベースのある時点の完全なスナップショットです。一度にすべてのデータを丸ごと保存しているため、障害が発生した場合に高速でデータベース全体を復元することができます。
ただし、バックアップは「ある時点」までしか復元できません。最新の状態に戻すには、バックアップ後に行われた変更を別途反映する必要があります。
バックアップとはいわば「丸ごとパッケージ」のようなもの。これがあればデータベースを0からでも高速に復元することができる!でも、ある時点までのデータしかないから、最新情報は反映されていない。
トランザクションログ:
トランザクションログは、バックアップ後に行われたすべての変更操作を逐次記録しています。ロールフォワード時に、バックアップ後の変更を追跡し、最新の状態までデータを更新するために使われます。
もし、トランザクションログのみで復元を行うと…
トランザクションログはバックアップと違い、丸ごと一気に読み込むことはできません。そのため、すべての変更を一つずつ適用する必要があります。そしてそれは、非常に時間がかかります。また、トランザクションログだけでは完全な復元ができない場合もあるため、バックアップとの併用が重要です。
まとめ
要するに…
まず、ロールバックについて説明します。ロールバックとは、トランザクション中にエラーが発生した場合に、そのトランザクションを開始する前の状態までデータをリセットする操作です。これは、途中までの処理でデータが部分的に変更され、不整合が生じることを防ぐために行われます。ロールバックは、トランザクションのAtomicity(原子性)を実現するためのもので、「すべての操作が成功するか、何もなかったことにするか」の「0か100か」の性質を保つことを目的としています。たとえば、銀行の送金処理において、送金元からの引き出しが成功しても、送金先への振り込みが失敗した場合、ロールバックによって引き出しも取り消されるようにし、一部のみが成功してしまうことでデータに不整合が生じるのを防ぎます。この動作のためにトランザクションログが用いられ、途中での変更がすべて記録されているため、エラー時には開始時点まで戻すことができるのです。
さらに、ロールバックは結果的にデータベースの整合性を保つためのものでもありますが、その主な役割はトランザクションの原子性を保証することです。データベースの一貫性(Consistency)に関わる操作とも言えますが、一貫性はデータベース全体の整合性を保つための概念であり、具体的にはビジネスルールに従ってデータが常に正しい状態にあることを指します。ロールバックは、トランザクション中の操作がすべて完了しなかった場合に一貫性を守る助けにはなりますが、その主要な機能はやはりAtomicityを保証することです。
次に、ロールフォワードについて説明します。ロールフォワードは、データベース全体に障害が発生し、データが破損した場合にデータベースを復旧するための手順です。この場合、まずバックアップデータを使ってデータベースをある時点まで戻します。バックアップデータは、その時点におけるデータベースの全体のスナップショットのようなもので、一つの大きなパッケージとしてデータをまとめて保存しています。そのため、復元時には一度にデータを読み込んで状態を戻すことができるため、迅速な復旧が可能です。しかし、バックアップはあくまである時点のデータを保存しているものに過ぎないため、それ以降に発生した変更については反映されていません。
ここでトランザクションログの出番です。バックアップである時点まで戻した後、その時点以降の変更をトランザクションログから順に適用することで、データベースを最新の状態に復元します。トランザクションログには、データベースの変更が一つずつ記録されており、最新の状態に戻すためにはそれらのログを順次適用していく必要があります。これにより、完全な復元が達成され、障害発生前の状態に戻ることが可能になります。ロールフォワードでは、バックアップのスナップショットが短時間での復旧に貢献し、その後のログの適用で最新状態に更新するため、効率的かつ確実な復元が実現されます。
このように、ロールバックとロールフォワードは、それぞれ異なる場面で用いられる操作ですが、データベースの信頼性と整合性を保つために重要な役割を果たしています。ロールバックはトランザクション単位での整合性を守るため、主にエラーが発生したトランザクションを取り消す処理であり、ロールフォワードはデータベース全体の障害に対応してシステム全体の復旧を行う操作です。この違いを理解することが、データベース管理の基本です。
おわりに
本日は『ロールバックとロールフォワード』について知見を深まりました!
やはり、知識をつけることは大切じゃからのぉ。知識があれば大抵のことはできる。逆に知識がなければ、できるもんもできない。これが世の理じゃよ。
でも、焦らず、1つずつ・1っ歩ずつ進んでいくことが大切じゃ!これからも一緒に頑張っていこう!
今日のSeeYou口説き文句は
「僕たちの間にロールバックは必要ない。だって、たとえうまくいかない時でさえも、それは僕と君が隣にいる証。そんな大切な思い出をリセットするなんてもったいない。」です。
(「ロールバック」は通常、トランザクション中に問題が発生した際にリセットして開始前の状態に戻ることを指します。しかし、ここでは2人の関係においては、どんなにうまくいかない時でもそれは2人が隣にいる証としています。喧嘩や困難な瞬間も、大切な思い出の一部であり、リセットするのはもったいないということを示唆しています。そのためロールバックは必要ないと言っているのです。)