ポイントインタイムリカバリ
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— 特定のトランザクションIDrecovery_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つの手順で行います。
- 実行中のPostgreSQLインスタンスを停止します。
- ベースバックアップをデータディレクトリに復元します。
- リカバリパラメータを設定し、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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 論理バックアップと物理バックアップ
- ポイントインタイムリカバリ
- 復元をテストする
- ディザスタリカバリ計画