pg_basebackupとは
pg_basebackupは、稼働中のPostgreSQLサーバーからデータベースクラスタ全体の物理バックアップを取得するコマンドである。
取得したバックアップは、レプリカの構築やリストアに使用する。
pg_dumpのような論理バックアップとは異なり、データファイルをそのままコピーするため、大規模なデータベースでも高速にバックアップを取得できる。
基本的な使い方
pg_basebackupを実行するには、レプリケーション権限を持つユーザーで接続する必要がある。
$ pg_basebackup -h [host] -U [replication user] -D /path/to/backup -Fp -P -X stream -c fast
-D: バックアップの出力先ディレクトリ-Fp: プレーンフォーマットで出力(ディレクトリ構成をそのままコピー)-P: 進捗状況を表示-X stream: バックアップ取得中のWALをストリーミングで並行取得-c fast: バックアップ開始時のチェックポイントを即座に実行
実行すると、以下のように進捗が表示される。
waiting for checkpoint
23191/23191 kB (100%), 0/1 tablespace
23191/23191 kB (100%), 1/1 tablespace
完了すると、出力先ディレクトリにbaseディレクトリやpg_walディレクトリなど、データベースクラスタと同じ構成のファイル一式が生成される。
tar形式でバックアップする
-Ftオプションを指定すると、tar形式でバックアップを取得できる。-zオプションを併用するとgzip圧縮される。
$ pg_basebackup -h [host] -U [replication user] -D /path/to/backup -Ft -z -P -X stream -c fast
出力先ディレクトリには、base.tar.gz、pg_wal.tar.gz、バックアップの整合性を検証するためのbackup_manifestが生成される。
base.tar.gz
pg_wal.tar.gz
backup_manifest
プレーンフォーマットに比べてファイル数が少なくなるため、バックアップの転送や保管がしやすくなる。
レプリカ構築用の設定を自動生成する
-Rオプションを指定すると、取得したバックアップにレプリカとして起動するための設定ファイルが自動生成される。
$ pg_basebackup -h [host] -U [replication user] -D /path/to/backup -Fp -P -X stream -c fast -R
-Rオプションを付けると、出力先ディレクトリにstandby.signalファイルと、接続先プライマリの情報を含むpostgresql.auto.confが生成される。
primary_conninfo = 'user=postgres passfile=''/root/.pgpass'' host=... port=5432 ...'
バックアップ取得先のディレクトリをそのままレプリカのdata_directoryとして起動すれば、プライマリからストリーミングレプリケーションを開始するレプリカを構築できる。
注意点
pg_basebackupを実行するユーザーには、REPLICATION権限が必要である。
ALTER ROLE [user name] WITH REPLICATION;
また、接続元ホストからのレプリケーション接続を許可するよう、プライマリ側のpg_hba.confにエントリを追加しておく必要がある。
host replication [user name] [client CIDR] scram-sha-256
バックアップ取得中はプライマリのディスクI/Oやネットワーク帯域を消費するため、業務への影響が少ない時間帯に実行するとよい。
pg_dumpとの違い
pg_dumpはSQL文などの形式でデータベースの内容を出力する論理バックアップである。
テーブル単位で選択的にバックアップでき、異なるPostgreSQLバージョン間でも復元しやすい一方、リストア時はSQLの再実行によってテーブルを再構築するため、大規模なデータベースでは時間がかかる。
pg_basebackupはデータファイルをそのままコピーする物理バックアップである。クラスタ全体が対象となる代わりに、高速にバックアップを取得できる。
ただし復元先は同一メジャーバージョン・同一OSやアーキテクチャに限られる。
テーブル単位の移行やバージョン間の移行ではpg_dumpが向いている。災害対策やレプリカ構築、大規模データベースの高速バックアップにはpg_basebackupが向いている。
