0Pricing
SQL Academy · レッスン

ポイントインタイムリカバリ

WALを使って任意の時点に復元します。

「ポイントインタイムリカバリ」はCoddyKit上の無料SQL Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSQL Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 SQL Academyコースには全4レッスンが含まれています。

ポイントインタイムリカバリとは

ポイントインタイムリカバリ(PITR)を使用すると、最後のバックアップスナップショットの時点だけでなく、過去の任意の特定の時点にデータベースを復元できます。

これが可能なのは、PostgreSQLがすべての変更を先行書き込みログ(WAL)と呼ばれるストリームに継続的に書き込むためです。ベースバックアップに対してWALレコードを再生することで、必要な時点に正確に到達できます。

先行書き込みログ(WAL)

すべてのINSERT、UPDATE、DELETE、DDL文は、実際のデータファイルに反映される前に、まずWALに書き込まれます。これにより、サーバーが書き込みの途中でクラッシュしても永続性が保証されます。

PITRでは、アーカイブされたWALセグメントがタイムマシンのテープの役割を果たします。ベースバックアップが出発点となり、WALがその後に発生したすべての内容を補います。

-- Check current WAL write location
SELECT pg_current_wal_lsn() AS current_lsn,
       pg_walfile_name(pg_current_wal_lsn()) AS current_wal_file;

WALアーカイブの有効化

PITRを使用するには、まずpostgresql.confでWALアーカイブを有効にする必要があります。主要なパラメータはwal_level、archive_mode、archive_commandです。

アーカイブコマンドは、完了した各WALセグメントを、ローカルディレクトリ、NFSマウント、クラウドストレージバケットなどの安全な場所にコピーします。

-- View current WAL and archive settings
SELECT name, setting, unit
FROM   pg_settings
WHERE  name IN (
  'wal_level',
  'archive_mode',
  'archive_command',
  'archive_status'
)
ORDER  BY name;

ベースバックアップの取得

ベースバックアップは、サーバーの実行中に取得する、データディレクトリ全体の整合性のあるコピーです。PostgreSQLには、この処理を調整するためのpg_basebackupユーティリティと低レベルのSQL関数が用意されています。

バックアップ開始時点以降に記録されたアーカイブ済みWALセグメントとバックアップを組み合わせれば、PITRに必要なものがすべて揃います。

-- Check the latest base backup information
SELECT backup_start,
       backup_end,
       pg_size_pretty(backup_total) AS total_size
FROM   pg_stat_basebackup;

復旧ターゲット時刻の指定

災害が発生したら、最初に復元先とする正確なタイムスタンプを特定します。一般的には、誤って大量のDELETEを実行した場合など、問題のあるイベントの直前のタイムスタンプを見つけます。

トランザクションログテーブルやアプリケーションログに、このタイムスタンプが記録されていることがよくあります。track_commit_timestampが有効な場合、WAL自体にもコミットのタイムスタンプが記録されます。

-- Find the commit timestamp of recent transactions (requires track_commit_timestamp=on)
SELECT xid,
       pg_xact_commit_timestamp(xid::xid) AS committed_at
FROM   pg_stat_activity
WHERE  state = 'idle'
LIMIT  10;

recovery.conf / recoveryパラメータ

復旧の動作は、postgresql.conf(PostgreSQL 12以降)または以前のrecovery.confファイルに配置するパラメータによって制御されます。特に重要なものは次のとおりです。

  • restore_command — アーカイブ済みWALセグメントの取得方法
  • recovery_target_time — 停止する正確なタイムスタンプ
  • recovery_target_action — ターゲットに到達したときの動作(promote、pause、shutdown)
-- Inspect recovery settings that are currently active
SELECT name, setting
FROM   pg_settings
WHERE  name IN (
  'restore_command',
  'recovery_target_time',
  'recovery_target_action',
  'recovery_target_inclusive'
)
ORDER  BY name;

その他のリカバリターゲットの種類

リカバリターゲットを指定する方法は時間だけではありません。PostgreSQLでは、4種類のターゲットに対応しています。

  • recovery_target_time — タイムスタンプ文字列
  • recovery_target_xid — 特定のトランザクションID
  • recovery_target_lsn — WALログシーケンス番号
  • recovery_target_name — pg_create_restore_point()で作成した名前付きリストアポイント
-- Create a named restore point before a risky migration
SELECT pg_create_restore_point('before_migration_2024_07_01') AS restore_lsn;

災害をシミュレーションする

テスト環境でPITRを練習するには、現在時刻を記録した後、意図的にデータを破損または削除します。これにより、リカバリが正しい時点で完了することと、削除した行が復元されることを確認できます。

-- Record the 'safe' timestamp, then simulate an accident
SELECT now() AS safe_point;

-- (In a test DB only!) accidentally delete important rows
DELETE FROM orders WHERE created_at < '2024-01-01';

-- Confirm the damage
SELECT COUNT(*) AS remaining_orders FROM orders;

リカバリを実行する

リカバリは3つの手順で行います。

  1. 実行中のPostgreSQLインスタンスを停止します。
  2. ベースバックアップをデータディレクトリに復元します。
  3. リカバリパラメータを設定し、PostgreSQLをリカバリモードで起動します。PostgreSQLはターゲット時刻に到達するまでWALを再生し、その後、通常の読み書き可能なサーバーに昇格します。

サーバーログには適用された各WALファイルが表示されるため、進行状況を簡単に追跡できます。

-- After recovery completes, confirm the cluster is no longer in recovery
SELECT pg_is_in_recovery() AS in_recovery,
       pg_last_xact_replay_timestamp() AS last_replayed_txn;

リカバリを検証する

サーバーが昇格したら、データが期待どおりの状態になっていることを確認します。行数、最新の行のタイムスタンプ、業務上重要な値を確認してください。

アプリケーションからのトラフィックを再開する前に、これらの検証クエリを実行することをおすすめします。必要に応じて、ロールフォワードするか、ターゲット時刻を調整できるためです。

-- Verify row counts and the latest transaction timestamp after recovery
SELECT 'orders'       AS tbl, COUNT(*) AS rows FROM orders
UNION ALL
SELECT 'order_items'  AS tbl, COUNT(*) AS rows FROM order_items
UNION ALL
SELECT 'customers'    AS tbl, COUNT(*) AS rows FROM customers
ORDER  BY tbl;

PITRのベストプラクティス

信頼性の高いPITR環境には、アーカイブを有効にするだけでは不十分です。主なプラクティスは次のとおりです。

  • リストアを定期的にテストする — テストされていないバックアップは、バックアップではありません。
  • WALアーカイブの遅延を監視する — アーカイブされたWALに欠落があると、完全なリカバリができません。
  • 十分なWAL履歴を保持する — 最も古い有効なベースバックアップまで遡れるようにセグメントを保持します。
  • 別のストレージ場所を使用する — プライマリディスクに障害が発生すると、同じディスク上のアーカイブ済みWALも失われます。
-- Check for any WAL archiving failures
SELECT archived_count,
       failed_count,
       last_archived_wal,
       last_archived_time,
       last_failed_wal,
       last_failed_time
FROM   pg_stat_archiver;

理解度チェック

ポイントインタイムリカバリについての理解度を確認しましょう。

まとめ:ポイントインタイムリカバリ

このレッスンでは、PostgreSQLのWrite-Ahead Logによって過去の任意の時点へリカバリできる仕組みを学びました。

  • WALアーカイブは、ベースバックアップ取得後のすべての変更を記録します。
  • リカバリターゲットには、タイムスタンプ、トランザクションID、LSN、名前付きリストアポイントを指定できます。
  • リカバリプロセスでは、ベースバックアップを復元し、アーカイブ済みWALを再生して、ターゲットに到達した時点で昇格します。
  • 検証によって、トラフィックを再開する前にデータの整合性を確認します。
  • ベストプラクティスには、定期的なリストアテスト、アーカイブの監視、オフサイトでのWAL保管などがあります。

PITRは、人為的ミスやデータ破損に対するセーフティネットです。これを習得すれば、ディザスタリカバリも習得したことになります。

よくある質問

「ポイントインタイムリカバリ」レッスンは無料ですか?

はい。「ポイントインタイムリカバリ」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、SQL Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 SQL Academyコースには全4レッスンが含まれています。

「ポイントインタイムリカバリ」で何を学びますか?

WALを使って任意の時点に復元します。 ブラウザで直接実行するハンズオンコードでSQL Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

SQL Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのSQL Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「ポイントインタイムリカバリ」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このSQL Academyレッスンでコードを書いて実行できますか?

はい。すべてのSQL Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 論理バックアップと物理バックアップ
  2. ポイントインタイムリカバリ
  3. 復元をテストする
  4. ディザスタリカバリ計画
← SQL Academyに戻る