【ふぉわーどりかばり】
フォワードリカバリ とは?
最終更新:
💡 バックアップ+ログの再生で、障害直前まで巻き戻す復旧術
バックアップを復元した後、その後のトランザクションログを順番に再適用して、データベースを障害直前など目的の時点まで復旧する手法。ロールフォワードとも呼ばれる。
📌 このページのポイント
- 定期バックアップを復元し、その後のトランザクションログ(WAL/REDOログ)を時系列順に再適用して、残っているログの範囲で障害直前まで復旧する
- ロールバック(トランザクションの取り消し)とは逆に、ログを「前に進める」のでフォワードリカバリ(ロールフォワード)と呼ばれる
- PostgreSQL、SQL Server、Oracleなど多くのRDBMSが備え、指定した時刻で止めるポイントインタイムリカバリ(PITR)にも使われる。ただしログのアーカイブや復旧モデルなどの設定が前提
- 失われるデータ(RPO)はバックアップ間隔ではなく「ログをどこまで安全な場所へ保存できたか」で決まる。ログが欠けると、その地点より先には進めない
フォワードリカバリってどういう仕組みなの?
ロールバックとは違うの?
バックアップだけじゃダメなの?
バックアップを毎日深夜に取るだけだと、最大で約1日分の更新が失われるおそれがあるよね。フォワードリカバリなら、ログが安全な場所に残っている範囲で障害の直前まで戻せるんだ。好きな時刻で止めて戻すこともできて、これをポイントインタイムリカバリ(PITR)って呼ぶよ
ログが壊れてたらどうなるの?
ログが破損や欠損していると、その地点より先には進めなくなるよ。だからログはDB本体とは別のディスクや別の場所へこまめに保存するんだ。PostgreSQLの場合、ログはファイルが一杯になってから保存されるので、archive_timeoutで保存間隔の上限を決めておくと、失うかもしれない量を抑えられるよ
実際の運用ではどう設定するの?
PostgreSQLならWALのアーカイブを有効にして、pg_basebackupで定期的にベースバックアップを取る。復旧時はバックアップを戻してrecovery.signalを置き、recovery_target_timeで「この時刻まで」と指定できるよ。Amazon RDSの自動バックアップでもPITRができるけど、元のDBを書き換えるのではなく新しいDBインスタンスを作る形なんだ
もっと詳しく知りたい人へ
Amazon RDSのPITRではどこまで直前に戻せる?
AWSのドキュメントによると、RDSはトランザクションログを5分ごとにAmazon S3へアップロードしていて、戻せる最も新しい時刻は「LatestRestorableTime」で確認できるよ。つまり障害の直前数分は戻せない可能性があるんだ。復元先は新しいDBインスタンスになるので、アプリの接続先を切り替える手順も用意しておこう。
SQL ServerでもPITRはいつでも使える?
いいえ、復旧モデルによるよ。Microsoftのドキュメントでは、特定の時点への復元は完全復旧モデル(または一括ログ復旧モデル)のデータベースが対象とされている。一括ログ復旧モデルで一括操作を含むログバックアップの途中には戻せないという注意もあるよ。単純復旧モデルではログバックアップを取れないので、最後のバックアップ時点までしか戻せないんだ。
まとめ:ざっくりこれだけ覚えればOK!
フォワードリカバリって出てきたら「バックアップにログを再適用して障害直前まで戻す復旧方法」と思えればだいたいOK!
📖 おまけ:英語の意味
「Forward Recovery」 = 前進回復
💬 Forward(前へ進む)+ Recovery(回復)で、ログを前に向かって再生していくイメージだよ。PostgreSQLのマニュアルでも、ベースバックアップから「roll forward」するという表現が使われているよ