3.8. 継続的にアーカイブして PostgreSQL データのバックアップを作成
PostgreSQL は、データベースのデータファイルに対するすべての変更を、クラスターのデータディレクトリーの pg_wal/
サブディレクトリーで利用可能なログ先行書き込み (WAL) ファイルに記録します。このログは、主にクラッシュからの復元を目的としています。クラッシュ後、最後のチェックポイント以降に作成されたログエントリーを使用して、データベースの整合性まで復元できます。
オンラインバックアップとも呼ばれる継続的なアーカイブメソッドは、WAL ファイルを、稼働中のサーバーまたはファイルシステムレベルのバックアップで実行されるベースバックアップの形式でデータベースクラスターのコピーと組み合わせます。
データベース復元が必要な場合は、データベースクラスターのコピーからデータベースを復元してから、バックアップを作成した WAL ファイルからログを再生して、システムを現在の状態にすることができます。
継続的なアーカイブメソッドでは、少なくとも最後のベースバックアップの開始時間までさかのぼって、アーカイブされたすべての WAL ファイルの連続したシーケンスを保持する必要があります。そのため、基本バックアップの理想的な頻度は、次の条件により異なります。
- アーカイブされた WAL ファイルで利用可能なストレージボリューム。
- 復元が必要な場合の、データ復元の最大許容期間。最後のバックアップからの期間が長い場合、システムはより多くの WAL セグメントを再生するため、回復に時間がかかります。
pg_dump
および pg_dumpall
SQL ダンプは、継続的にアーカイブするバックアップソリューションの一部として使用することができません。SQL ダンプは論理バックアップを生成しますが、WAL 再生で使用する上で十分な情報は含まれていません。
3.8.1. 継続的なアーカイブの長所と短所 リンクのコピーリンクがクリップボードにコピーされました!
継続的なアーカイブは、PostgreSQL のその他のバックアップ方法と比較して、以下の利点があります。
- 継続的なバックアップメソッドでは、バックアップ内の内部不整合がログ再生により修正されるため、整合性が完全に取れないベースバックアップを使用することができます。したがって、実行中の PostgreSQL サーバーでベースバックアップを実行できます。
-
ファイルシステムのスナップショットは必要ありません。
tar
または同様のアーカイブユーティリティーで十分です。 - 継続的にバックアップを行うには、継続的に WAL ファイルをアーカイブします。これは、ログ再生用の WAL ファイルの順序が無限に長くなる可能性があるためです。これは、特に大規模なデータベースで有用です。
- 継続的バックアップは、特定の時点への復旧 (ポイントインタイムリカバリー) をサポートします。WAL エントリーを最後まで再生する必要はありません。再生はいつでも停止でき、ベースバックアップを作成してから、データベースをいつでもその状態に復元できます。
- 一連の WAL ファイルが同じベースのバックアップファイルで読み込まれた別のマシンが継続的に利用可能である場合は、任意の時点で、データベースで現在に一番近いコピーで、他のマシンを復元できます。
継続的なアーカイブには、その他の PostgreSQL バックアップ方法と比較して、以下の短所があります。
- 継続バックアップ方法は、サブセットではなく、データベースクラスター全体の復元のみをサポートします。
- 継続的にバックアップするには、大きなアーカイブストレージが必要です。
3.8.2. WAL アーカイブの設定 リンクのコピーリンクがクリップボードにコピーされました!
実行中の PostgreSQL サーバーでは、ログ先行書き込み (WAL) レコードのシーケンスを生成します。サーバーは、このシーケンスを WAL セグメントファイルに物理的に分割します。このファイルには、WAL シーケンスの位置を反映する数値名が与えられます。WAL のアーカイブを使用しない場合は、セグメントファイルは再利用され、より大きなセグメント番号に名前が変更されます。
WAL データをアーカイブする場合、各セグメントファイルの内容がキャプチャーされ、新しい場所に保存されてから、セグメントファイルが再利用されます。別のマシン上の NFS マウントディレクトリー、テープドライブ、または CD など、コンテンツの保存場所には複数のオプションがあります。
WAL レコードには、設定ファイルへの変更が含まれていないことに注意してください。
WAL のアーカイブを有効にするには、以下の手順に従います。
手順
/var/lib/pgsql/data/postgresql.conf
ファイルで以下を行います。-
wal_level
設定パラメーターをreplica
以降に設定します。 -
archive_mode
パラメーターをon
に設定します。 archive_command
設定パラメーターでシェルコマンドを指定します。cp
コマンド、別のコマンド、またはシェルスクリプトを使用できます。以下に例を示します。
archive_command = 'test ! -f /mnt/server/archivedir/%f && cp %p /mnt/server/archivedir/%f'
archive_command = 'test ! -f /mnt/server/archivedir/%f && cp %p /mnt/server/archivedir/%f'
Copy to Clipboard Copied! Toggle word wrap Toggle overflow %p
パラメーターは、アーカイブするファイルの相対パスに置き換えられ、%f
パラメーターはファイル名に置き換えられます。このコマンドは、アーカイブ可能な WAL セグメントを
/mnt/server/archivedir/
ディレクトリーにコピーします。%p
パラメーターおよび%f
パラメーターを置き換えると、実行されたコマンドは以下のようになります。test ! -f /mnt/server/archivedir/00000001000000A900000065 && cp pg_wal/00000001000000A900000065 /mnt/server/archivedir/00000001000000A900000065
test ! -f /mnt/server/archivedir/00000001000000A900000065 && cp pg_wal/00000001000000A900000065 /mnt/server/archivedir/00000001000000A900000065
Copy to Clipboard Copied! Toggle word wrap Toggle overflow アーカイブされる新規ファイルごとに同様のコマンドが生成されます。
注記archive コマンドは、完了した WAL セグメントでのみ実行されます。WAL トラフィックをほとんど生成しないサーバーでは、トランザクションの完了とアーカイブストレージへの安全な記録の間にかなりの遅延が生じる可能性があります。アーカイブされていないデータの古さを制限するには、以下を行います。
-
archive_timeout
パラメーターを設定して、サーバーが特定の頻度で新しい WAL セグメントファイルに切り替えるように強制します。 -
pg_switch_wal
パラメーターを使用して、セグメント切り替えを強制し、トランザクションが終了後すぐにアーカイブされるようにします。
-
-
postgresql
サービスを再起動して、変更を適用します。systemctl restart postgresql.service
# systemctl restart postgresql.service
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - アーカイブコマンドをテストし、既存のファイルが上書きされないこと、失敗した場合にゼロ以外の終了ステータスが返されることを確認します。
- データを保護するには、セグメントファイルがグループまたはワールド読み取りアクセスを持たないディレクトリーにアーカイブされていることを確認してください。
3.8.3. ベースバックアップの作成 リンクのコピーリンクがクリップボードにコピーされました!
ベースバックアップは、複数の方法で作成できます。ベースバックアップを実行する最も簡単な方法は、実行中の PostgreSQL サーバーで pg_basebackup
ユーティリティーを使用することです。
ベースバックアッププロセスは、WAL アーカイブ領域に保存され、ベースバックアップに必要な最初の WAL セグメントファイルにちなんで名付けられたバックアップ履歴ファイルを作成します。
バックアップ履歴ファイルは、開始時間および終了時間、およびバックアップの WAL セグメントが含まれる小さなテキストファイルです。ラベル文字列を使用して関連するダンプファイルを特定した場合は、バックアップ履歴ファイルを使用して復元するダンプファイルを判断できます。
データを確実に復元できるようにするために、複数のバックアップセットを維持することを検討してください。
前提条件
-
postgres
スーパーユーザー、データベースの管理者パーミッションのあるユーザー、または少なくともREPLICATION
パーミッションを持つ別のユーザーとして、コマンドを実行する必要があります。 - ベースバックアップ中およびベースバックアップ後に生成されたすべての WAL セグメントファイルを保持する必要があります。
手順
pg_basebackup
ユーティリティーを使用してベースバックアップを実行します。個々のファイル (プレーン形式) としてベースバックアップを作成するには、以下を実行します。
pg_basebackup -D <backup_directory> -Fp
$ pg_basebackup -D <backup_directory> -Fp
Copy to Clipboard Copied! Toggle word wrap Toggle overflow backup_directory は、任意のバックアップの場所に置き換えます。
テーブルスペースを使用し、サーバーと同じホストでベースバックアップを実行する場合は、
--tablespace-mapping
オプションも使用する必要があります。そうしないと、バックアップを同じ場所に書き込もうとすると、バックアップが失敗します。tar
アーカイブ (tar
および圧縮形式) としてベースバックアップを作成するには、以下を実行します。pg_basebackup -D <backup_directory> -Ft -z
$ pg_basebackup -D <backup_directory> -Ft -z
Copy to Clipboard Copied! Toggle word wrap Toggle overflow backup_directory は、任意のバックアップの場所に置き換えます。
このようなデータを復元するには、ファイルを正しい場所に手動で抽出する必要があります。
pg_basebackup が接続するデータベースサーバーを指定するには、以下のコマンドラインオプションを使用します。
ホストを定義する
-h
オプションデフォルトのホストは、ローカルホストまたは
PGHOST
環境変数により指定されたホストです。ポートを定義する
-p
オプションデフォルトのポートは、
PGPORT
環境変数またはコンパイル済みデフォルトで示されます。
- ベースバックアッププロセスが完了すると、バックアップ履歴ファイルで指定されている、データベースクラスターのコピーとバックアップ中に使用された WAL セグメントファイルを安全にアーカイブします。
- ベースバックアップで使用されている WAL セグメントファイルよりも数値が小さい WAL セグメントを削除します。これらはベースバックアップよりも古く、復元には必要ないためです。
3.8.4. 継続的なアーカイブバックアップを使用したデータベースの復元 リンクのコピーリンクがクリップボードにコピーされました!
継続バックアップを使用してデータベースを復元するには、以下の手順を行います。
手順
サーバーを停止します。
systemctl stop postgresql.service
# systemctl stop postgresql.service
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 必要なデータを一時的な場所にコピーします。
必要に応じて、クラスターデータのディレクトリー全体と、すべてのテーブルスペースをコピーします。既存データベースのコピーを 2 つ保持するには、システムに十分な空き領域が必要になることに注意してください。
十分なスペースがない場合は、システムがダウンする前にアーカイブされなかったログが含まれている可能性がある、クラスターの
pg_wal
ディレクトリーの内容を保存します。- クラスターデータディレクトリー、および使用しているテーブルスペースのルートディレクトリー下の既存ファイルおよびサブディレクトリーをすべて削除します。
ベースバックアップからデータベースファイルを復元します。
以下の点を確認してください。
-
ファイルは、正しい所有権 (
root
ではなくデータベースシステムのユーザー) で復元されます。 - ファイルは、正しいパーミッションで復元されます。
-
pg_tblspc/
サブディレクトリーのシンボリックリンクが正しく復元されます。
-
ファイルは、正しい所有権 (
pg_wal/
サブディレクトリーにあるファイルをすべて削除します。このファイルは、ベースバックアップから作成されるため、非推奨になりました。
pg_wal/
をアーカイブしていない場合は、適切なパーミッションで再作成します。-
手順 2 で保存したアーカイブされていない WAL セグメントファイルを
pg_wal/
にコピーします。 クラスターデータディレクトリーの
recovery.conf
リカバリーコマンドファイルを作成し、restore_command
設定パラメーターでシェルコマンドを指定します。cp
コマンド、別のコマンド、またはシェルスクリプトを使用できます。以下に例を示します。restore_command = 'cp /mnt/server/archivedir/%f "%p"'
restore_command = 'cp /mnt/server/archivedir/%f "%p"'
Copy to Clipboard Copied! Toggle word wrap Toggle overflow サーバーを起動します。
systemctl start postgresql.service
# systemctl start postgresql.service
Copy to Clipboard Copied! Toggle word wrap Toggle overflow サーバーは復元モードに入り、引き続き必要なアーカイブファイル (WAL) を読み込みます。
外部エラーにより復元が終了した場合は、サーバーを再起動して復元を続行します。復元プロセスが完了すると、サーバーは
recovery.conf
の名前をrecovery. done
に変更します。これにより、サーバーが通常のデータベース操作を開始した後に、誤ってリカバリーモードに戻るのを防ぐことができます。データベースのコンテンツを確認して、データベースが必要な状態に復元されたことを検証します。
データベースが必要な状態に復元されていない場合は、手順 1 に戻ります。データベースが必要な状態に復元された場合は、
pg_hba.conf
ファイル内のクライアント認証設定を復元して、ユーザーが接続できるようにします。