「ロールバックとロールフォワードはどう違うの?」という疑問はデータベースの障害復旧を学んでいる方によく浮かぶ疑問のひとつです。
どちらもデータを「元に戻す」イメージがありますが、用途と動作の方向が根本的に異なります。
本記事では、ロールバックとロールフォワードの違いとそれぞれの役割を、トランザクション・障害復旧・データ復元・使い分けの基準を交えてわかりやすく解説します。
データベースの障害復旧を学んでいる方やバックアップ・リカバリの仕組みを理解したい方にもきっと役立つ内容でしょう。
ロールバックとロールフォワードの違いを正しく理解することで、データベースの信頼性と可用性への理解が大きく深まります。
ロールバックは「処理を開始前に戻す」、ロールフォワードは「障害後に最新状態へ進める」という方向の違いが最大のポイント
それではまず、ロールバックとロールフォワードのもっとも重要な違いについて解説していきます。
ロールバック(rollback)とは、トランザクション処理中にエラーが発生した際にトランザクション開始前の状態にデータを巻き戻す操作です。
一方、ロールフォワード(roll forward)とは、データベースの障害復旧時にバックアップデータを復元した後、トランザクションログを順に再実行して障害直前の最新状態まで進める操作です。
ロールバックは「過去に戻る(巻き戻し)」操作であるのに対し、ロールフォワードは「前に進む(再実行)」操作という方向性の違いが最大のポイントでしょう。
どちらもデータの整合性と信頼性を保つための重要な仕組みですが、使われる場面と目的が根本的に異なります。
ロールバックとロールフォワードは障害復旧(リカバリ)のプロセスで組み合わせて使われます。バックアップからデータを復元した後にロールフォワードで最新状態に進め、コミットされていないトランザクションをロールバックで取り消すという流れが一般的です。
ロールバックとロールフォワードの基本比較
| 項目 | ロールバック | ロールフォワード |
|---|---|---|
| 方向 | 過去へ戻る(巻き戻し) | 未来へ進む(再実行) |
| 使用するデータ | Before Image(変更前の値) | After Image(変更後の値)・トランザクションログ |
| 主な用途 | トランザクション中のエラー処理 | 障害復旧後の最新状態への復元 |
| 実行タイミング | トランザクション中・処理失敗時 | バックアップからの復元後 |
| 対象 | 未コミットのトランザクション | コミット済みのトランザクション |
この違いを正確に理解することで、データベースの障害復旧戦略の全体像が把握できるでしょう。
ロールフォワードの仕組み
ロールフォワードがどのように動作するかを確認してみましょう。
【ロールフォワードの処理フロー】
① 火曜日午前2時のフルバックアップを取得(基準点)
② 以降のトランザクションログが蓄積される
③ 火曜日午後3時にディスク障害が発生
④ バックアップから午前2時の状態を復元
⑤ ロールフォワード:午前2時以降のトランザクションログを順に再実行
⑥ 障害直前(午後3時直前)の状態まで復元完了
ロールフォワードを使うことでバックアップ取得時点から障害発生直前までのデータを失わずに復元できるでしょう。
障害復旧におけるロールバックとロールフォワードの使い分け
続いては、実際の障害復旧シナリオでロールバックとロールフォワードがどのように使い分けられるかを確認していきます。
具体的な使い分けを理解することで、データベースの運用設計に役立てられるでしょう。
障害の種類と復旧方法
データベースの障害は大きく2種類に分けられます。
| 障害の種類 | 内容 | 主な復旧方法 |
|---|---|---|
| トランザクション障害 | 処理中のエラー・デッドロック・アプリケーション異常終了 | ロールバック |
| システム障害 | 停電・OS障害・ハードウェア障害によるデータ損失 | ロールフォワード+ロールバック |
トランザクション障害ではロールバックのみで対応できますが、システム障害ではバックアップからの復元とロールフォワード・ロールバックを組み合わせた復旧が必要でしょう。
システム障害復旧の完全な流れ
【システム障害復旧の完全なフロー】
STEP 1:バックアップからデータを復元
STEP 2:ロールフォワード
→ コミット済みのトランザクションをログから再実行
→ バックアップ時点から障害直前までのデータを復元
STEP 3:ロールバック
→ 障害発生時点でコミットされていなかったトランザクションを取り消し
→ 未完了の処理によるデータ不整合を解消
STEP 4:データベースを通常運用に戻す
ロールフォワードとロールバックをこの順序で実行することで、データの整合性が保たれた最新状態への復元が実現できるでしょう。
トランザクションログの役割
ロールバックとロールフォワードの両方においてトランザクションログが重要な役割を果たします。
トランザクションログには変更前の値(Before Image)と変更後の値(After Image)の両方が記録されており、ロールバックにはBefore Image・ロールフォワードにはAfter Imageが使用されるでしょう。
このため定期的なトランザクションログのバックアップがデータベースの障害復旧能力を大きく左右します。
主要データベースでのロールバック・ロールフォワードの実装
続いては、主要なデータベースにおけるロールバック・ロールフォワードの実装を確認していきます。
各データベースでの具体的な実装を知ることで、実務での応用がスムーズになるでしょう。
MySQLでのロールバックとポイントインタイムリカバリ
MySQLではバイナリログを使ったポイントインタイムリカバリ(PITR)がロールフォワードに相当します。
【MySQLでのポイントインタイムリカバリ手順】
1. バックアップからデータを復元
mysqldump –all-databases > backup.sql
mysql < backup.sql
2. バイナリログをロールフォワード(特定時刻まで適用)
mysqlbinlog –start-datetime=”2024-01-01 02:00:00″ \
–stop-datetime=”2024-01-01 15:00:00″ \
binlog.000001 | mysql
MySQLのバイナリログを活用することで障害直前の状態まで精度の高いデータ復元が実現できるでしょう。
PostgreSQLでのWALとポイントインタイムリカバリ
PostgreSQLではWAL(Write-Ahead Logging)とPITR(Point-in-Time Recovery)機能がロールフォワードを実現します。
PostgreSQLのrecovery.confまたはpostgresql.confにrecovery_target_timeを設定することで特定の時刻まで自動的にロールフォワードできるでしょう。
PostgreSQLのPITR機能は非常に高度で、秒単位での精密なデータ復元が可能です。
ロールバック・ロールフォワードの設計上の注意点
【障害復旧設計のポイント】
・定期的なフルバックアップとトランザクションログのバックアップを取得する
・バックアップとログを別のストレージ・場所に保管する
・定期的にリカバリ手順をテストして確実に復旧できることを確認する
・RPO(Recovery Point Objective)とRTO(Recovery Time Objective)を明確に定義する
・ロールバック・ロールフォワードの処理時間を考慮した復旧計画を策定する
障害復旧は設計と準備が重要で、実際に障害が発生してから手順を考えるのでは手遅れになる場合があるでしょう。
まとめ
本記事では、ロールバックとロールフォワードの違いとそれぞれの役割について、トランザクション・障害復旧・データ復元・使い分けを交えながら解説しました。
ロールバックはトランザクション中のエラーが発生した際に処理を開始前の状態に戻す操作で、ロールフォワードはバックアップ復元後にトランザクションログを再実行して最新状態へ進める操作という点が最大の違いです。
システム障害復旧ではバックアップからの復元→ロールフォワード→ロールバックという順序でデータの整合性を保ちながら最新状態への復元が実現できるでしょう。
定期的なバックアップとトランザクションログの保全・リカバリ手順のテストを組み合わせた障害復旧設計が、データベースの高い可用性と信頼性を支える基盤となります。
本記事がロールバックとロールフォワードへの理解を深め、データベースの障害復旧設計と運用管理の実践に役立てば幸いです。