Instiq
第4章 · 障害対応·v1.0.0·更新 2026/7/8·読了目安 約14分

変更要約: 初版(主題G4・G4.1〜G4.3)

4.2破損クラスタ復旧

この節の要点

破損したデータベースクラスタからの復旧手順を学びます。PITR(ポイントインタイムリカバリ)を軸に、WAL制御情報を再構築するpg_resetwal、起動時のトラブルシューティングフラグignore_system_indexesignore_checksum_failure、コミットログを保持するpg_xact、緊急時のシングルユーザモード、トランザクションID周回対策のVACUUM FREEZEを押さえます。

クラスタそのものが破損した状況——ファイルシステム破損・誤ったDROP・トランザクションID周回の危機など——では、通常の起動やバックアップ復元だけでは対応できないことがあります。Goldではこうした「壊れたクラスタを、データをできるだけ失わずに再び動く状態へ戻す」ための専用手段(PITR・pg_resetwal・起動フラグ・シングルユーザモード)と、そもそも周回という破局的事態を未然に防ぐVACUUM FREEZEの両輪を理解する必要があります。

4.2.1PITRと起動時トラブルシューティング

  • PITR(ポイントインタイムリカバリ)=ベースバックアップにWALアーカイブを適用して、任意の時点(誤操作の直前など)まで復元する手法。「誤って本番テーブルをDROPした直後」のような事故で、その操作の直前までピンポイントで巻き戻せるのが最大の利点。
  • pg_resetwal=WALの制御情報(pg_controlの内容)を強制的に再構築する最終手段のツール。WALが破損して通常の起動やクラッシュリカバリが不可能な場合にのみ使用し、実行するとその時点以降の一貫性保証が失われ、データ損失を伴いうるため、他に手段が無いときの最後の選択肢と位置づける。
  • 起動時のトラブルシューティング用フラグignore_system_indexes(システムカタログの破損したインデックスを無視して起動を試みる)・ignore_checksum_failuredata-checksums有効時にチェックサム不一致を検出してもエラーで止めず継続する)。いずれも恒久運用設定ではなく、破損クラスタからデータを救出するための一時的な緊急手段

4.2.2コミットログとシングルユーザモード、周回対策

  • pg_xact=各トランザクションがコミット済みか・中断されたかを記録するコミットログ(旧称pg_clog)。この情報が破損すると「そのタプルが有効かどうか」の判定自体が不能になるため、クラスタ破損の中でも特に深刻な部類。
  • シングルユーザモード=ネットワーク経由の接続を受け付けず、単一のバックエンドプロセスとしてローカルから直接操作する特別な起動形態(postgres --single)。通常のクライアント接続では対応できない破損状態からの緊急修復や、後述のトランザクションID周回目前でVACUUMが拒否される状況を打開する際に使う。
  • VACUUM FREEZEトランザクションID(XID)周回への対策として、古い行を「常に可視(frozen)」とマークする処理(PostgreSQL 9.4 以降はXIDをFrozenXIDへ書き換えるのではなく、タプルヘッダのフローズンビットで実装)。PostgreSQLのXIDは32bitの循環カウンタで、周回すると未来のトランザクションが過去に見えてしまい、コミット済みデータが不可視になる致命的な破損につながるため、autovacuumが周回接近時に強制的に緊急VACUUMを実行し、それでも対応が追いつかない場合はデータベースへの新規書き込みを拒否する自己防衛が働く。
試験ポイント

「PITR=ベースバックアップ+WALアーカイブで任意時点へ復元」「pg_resetwalは最終手段でデータ損失を伴いうる」「ignore_system_indexes/ignore_checksum_failureは一時的な緊急フラグ」「pg_xactはコミット済み/中断の記録」「シングルユーザモードはネットワーク接続不可の単独バックエンド」「VACUUM FREEZE=XID周回対策・周回すると致命的破損」が最頻出です。VACUUM FREEZEは特にGold定番の出題テーマなので、周回の仕組みと自己防衛の流れ(emergency autovacuum→書き込み拒否)まで説明できるようにしておきます。

トランザクションID周回のリスクを軸に、実際のインシデント対応を追ってみましょう。ある日、ログにWARNING: database "app" must be vacuumed within 1000000 transactionsという警告が出始めます。これはXID周回が近づいている前兆で、放置すると自動的にautovacuumが緊急モードで割り込み実行され、それでも間に合わなければERROR: database is not accepting commands to avoid wraparound data lossという新規書き込み拒否の段階に至ります。ここまで来てしまった場合、通常のクライアント接続経由でVACUUMを実行しようとしても新規トランザクションの開始自体が拒否されるため、シングルユーザモードpostgres --single起動し、直接VACUUM FREEZEを実行して周回を回避する、という緊急手順を踏みます。これは平時からautovacuum関連の警告ログを監視し、書き込み拒否に至る前に定期的なVACUUM FREEZEで予防することがいかに重要かを示す典型例です。一方、破損の種類が異なるケース——例えば災害でファイルシステムが部分的に壊れ、WALの制御情報自体が読めなくなった場合——は周回対策とは別の筋道になります。まずベースバックアップとアーカイブ済みWALがあればPITRで直前の健全な時点まで復元するのが第一選択です。バックアップが無い、あるいはWAL自体も失われているなら、最終手段としてpg_resetwalでWAL制御情報を強制再構築し、起動だけでもできる状態に持ち込みます。この際、システムカタログのインデックスやチェックサムでエラーが出て起動自体が止まる場合は、ignore_system_indexesignore_checksum_failureといった一時フラグを付けて何とか起動し、データが読めるうちにpg_dumpで救出してから、フラグ無しの正常なクラスタへ移し替える、というデータ救出優先の対応になります。いずれのシナリオでも共通するのは、「壊れた箇所を直そうとする前に、まず読める状態を確保してデータを退避する」という優先順位です。

手段用途性質
PITR任意時点への復元ベースバックアップ+WALアーカイブが前提
pg_resetwalWAL制御情報の強制再構築最終手段・データ損失を伴いうる
VACUUM FREEZEXID周回の予防・回避周回すると致命的破損に至るため定期実行が重要
注意

ひっかけ: 「pg_resetwalは通常のクラッシュリカバリの一環として日常的に使ってよい」は誤りです。pg_resetwalは整合性保証を失わせる最終手段であり、通常のクラッシュ復旧はpg_ctl startによるWAL再生で自動的に行われます。また「トランザクションID周回はディスク容量を圧迫するだけの軽微な問題」も誤り=周回はコミット済みデータが不可視になる致命的破損であり、autovacuumの緊急介入や新規書き込み拒否という強い自己防衛が組み込まれています。「ignore_checksum_failureを常時有効にしておけばチェックサム破損を心配しなくてよい」も誤り=これは一時的な緊急救出用フラグで、恒久的に有効化すると破損の見逃しにつながります。

PITRの通常復旧、pg_resetwalと起動フラグの最終手段、pg_xactとシングルユーザモード、VACUUM FREEZEによる周回対策を示す図。
pg_resetwal はデータ損失を伴いうる最終手段

4.2.3この節のまとめ

  • PITR=ベースバックアップ+WALアーカイブで任意時点へ復元pg_resetwalは最終手段(WAL制御情報を強制再構築・データ損失を伴いうる)
  • ignore_system_indexes/ignore_checksum_failureは一時的な緊急起動フラグpg_xactはコミット状態の記録・シングルユーザモードは単独バックエンドでの緊急操作
  • VACUUM FREEZEでXID周回を予防。周回は致命的破損につながり、放置するとautovacuumの緊急介入→新規書き込み拒否に至る

進捗の記録にはログインが必要です。

理解度チェック

(軽い確認用)

Q1. 運用担当者が誤って本番の重要テーブルをDROPしてしまった。事故発生の直前の状態までデータベースを復元したい場合、最も適切な手段は?

Q2. サーバログに "database is not accepting commands to avoid wraparound data loss" というエラーが出て、通常のクライアント接続からVACUUMを実行しようとしても新規トランザクションの開始自体が拒否される。この状況を打開する適切な手順は?

Q3. VACUUM FREEZE がトランザクションID周回対策として果たす役割の説明として正しいものは?

理解度を確認第4章「障害対応」の問題を解く

学習の記録を残しませんか

参考書はすべて無料で読めます。無料登録すると、問題集での演習・既読と進捗の記録・間違えた問題の復習・ハイライトが使えます。