【ふぉわーどりかばり】

フォワードリカバリ とは?

最終更新:
💡 バックアップ+ログの再生で、障害直前まで巻き戻す復旧術

バックアップを復元した後、その後のトランザクションログを順番に再適用して、データベースを障害直前など目的の時点まで復旧する手法。ロールフォワードとも呼ばれる。

📌 このページのポイント
フォワードリカバリ(ロールフォワード)の流れ バックアップ 月曜 0:00 Tx1 Tx2 Tx3 Tx4 障害発生! 火曜 14:30 ← トランザクションログ → 復旧手順: Step 1 バックアップを復元 (月曜 0:00 の状態) → Step 2 ログを順番に再適用 Tx1 → Tx2 → Tx3 → Tx4 → 復旧完了 残ったログの 最後まで復旧 注意: トランザクションログが破損・欠損していると、その地点以降は復旧できない → ログはDB本体とは別のディスク・遠隔地に保管するのがベストプラクティス
バックアップ復元後にトランザクションログを再適用して障害直前まで復旧する
ひよこ ひよこ
フォワードリカバリってどういう仕組みなの?
ペンギン先生 ペンギン先生
まず定期的に取っておいたバックアップを復元するんだ。でもバックアップは少し前の状態だよね。そこからトランザクションログ(更新記録)を1つずつ再適用して、障害が起きた直前の状態まで「前に進める」んだよ
ひよこ ひよこ
ロールバックとは違うの?
ペンギン先生 ペンギン先生
逆方向だね。ロールバックは「未完了のトランザクションを取り消して戻す」操作。フォワードリカバリは「完了済みのトランザクションを再適用して進める」操作だよ。後ろに戻すか前に進めるかの違いだね
ひよこ ひよこ
バックアップだけじゃダメなの?
ペンギン先生 ペンギン先生
バックアップを毎日深夜に取るだけだと、最大で約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」するという表現が使われているよ

参考資料

← 用語集にもどる