【PostgreSQL】pg_basebackup によるオンライン物理バックアップ
PostgreSQLのバックアップ方法はいくつかありますが、本記事では pg_basebackup
コマンドを使用した方法を解説します。
pg_basebackup
は物理バックアップを取得するための公式ツールであり、主にストリーミングレプリケーションのセットアップやデータの完全バックアップに利用されます。
論理バックアップを取得しリストアする「pg_dump/pg_restore」については下記のブログを参考下さい。
参考ブログ:【PostgreSQL】バックアップ・リストア 「pg_dump/pg_dumpall/pg_restore/psql」
【PostgreSQL】pg_basebackup による物理バックアップとは?
pg_basebackup
はPostgreSQLのデータディレクトリ全体をコピー(物理バックアップ)し、取得するツールです。
取得したバックアップはそのまま復元することが可能で、クラッシュリカバリやストリーミングレプリケーションのセットアップにも利用されます。
pg_basebackup(物理バックアップ)の特徴
- データベースを停止しないオンラインバックアップが可能
- データディレクトリ全体をフルバックアップする方式
- WALログと一緒に取得する為、PITR1や整合性がある
- そのままリストア(データディレクトリを置き換える)するだけで復旧可能
pg_basebackupにおけるデータの整合性
pg_basebackup
におけるデータの整合性は、以下の仕組みによって確保されます
- WAL(Write-Ahead Logging)と一緒にバックアップ
-Xs
オプションを使用すると、WAL(トランザクションログ)がバックアップとともに取得され、リストア時に適用されることで、データの一貫性が保たれます。 - チェックポイントを考慮したバックアップ
pg_basebackup
はバックアップ取得時に適切なチェックポイントを確保し、一貫したデータの状態を維持します。 - データのスナップショットを作成
バックアップの取得中もデータベースが稼働しているため、取得されたデータが部分的にならないよう、整合性を保つ仕組みが組み込まれています。

【PostgreSQL】pg_basebackupによるバックアップの例
基本的なバックアップ取得コマンド
C:\>pg_basebackup -D C:\pg_backup -Fp -Xs -P -R -U postgres -h localhost -p 5432
33827/33827 kB (100%), 1/1 テーブル空間
C:\>
■主なオプション
№ | オプション | 意 味 |
---|---|---|
1 | -D C:\pg_backup | バックアップ先ディレクトリ |
2 | -Fp | プレーンフォーマットでバックアップ |
3 | -Xs | WALも一緒に取得 |
4 | -p | 進捗表示 |
5 | -R | リカバリ構成ファイルを作成 |
6 | -U postgres | バックアップ実行ユーザー |
7 | -h localhost -p 5432 | 接続先サーバー指定 |
■C:\pg_backup
フォルダの内容

pg_basebackup のバックアップを7zip形式で圧縮
圧縮後はh:\pg_backup
ディレクトリを削除してもかまいません。
C:\>7z a -t7z C:\pg_backup.7z C:\pg_backup
7-Zip 19.00 (x64) : Copyright (c) 1999-2018 Igor Pavlov : 2019-02-21
Scanning the drive:
28 folders, 1358 files, 50891659 bytes (49 MiB)
Creating archive: C:\pg_backup.7z
Add new data to archive: 28 folders, 1358 files, 50891659 bytes (49 MiB)
Files read from disk: 1125
Archive size: 778075 bytes (760 KiB)
Everything is Ok
C:\>
スタンバイサーバー用のバックアップの取得
スタンバイサーバー用のバックアップを取得するには、ストリーミングレプリケーションに適した設定を加えて pg_basebackup
を実行します。
C:\>pg_basebackup -D C:\pg_backup_rep -Fp -Xs -P -R -C -S standby1 -U postgres -h
localhost -p 5432
33831/33831 kB (100%), 1/1 テーブル空間
C:\>
■スタンバイ用の主なオプション
№ | オプション | 意 味 |
---|---|---|
1 | -C | スタンバイサーバー用にレプリケーションスロットを作成 |
2 | -S standby1 | レプリケーションスロット名を standby1 に設定 |

【PostgreSQL】リストアの方法
PostgreSQLの停止
リストア前に管理者権限でPostgreSQLを停止します。
C:\>net stop postgresql-x64-16
postgresql-x64-16 - PostgreSQL Server 16 サービスを停止中です.
postgresql-x64-16 - PostgreSQL Server 16 サービスは正常に停止されました。
C:\>
既存データディレクトリのリネーム
既存のデータディレクトリをリネームしておきます。
C:\>ren "C:\Program Files\PostgreSQL\data" data_old
バックアップデータの解凍
バックアップデータを7zipで圧縮した場合は以下の様に解凍します。
C:\>7z x C:\pg_backup.7z -oC:\pg_backup
7-Zip 19.00 (x64) : Copyright (c) 1999-2018 Igor Pavlov : 2019-02-21
Scanning the drive for archives:
1 file, 778075 bytes (760 KiB)
Extracting archive: H:\pg_backup.7z
--
Path = H:\pg_backup.7z
Type = 7z
Physical Size = 778075
Headers Size = 8875
Method = LZMA2:24
Solid = +
Blocks = 1
Everything is Ok
Folders: 28
Files: 1358
Size: 50891659
Compressed: 778075
C:\>

バックアップデータのリストア
C:\>xcopy /E /I C:\pg_backup "C:\Program Files\PostgreSQL\data"
H:\pg_backup\backup_label
H:\pg_backup\backup_manifest
H:\pg_backup\current_logfiles
・
・
・
H:\pg_backup\pg_logical\replorigin_checkpoint
H:\pg_backup\pg_multixact\membersC:\>xcopy /E /I C:\pg_backup "C:\Program Files\PostgreSQL\16\data"
H:\pg_backup\backup_label
H:\pg_backup\backup_manifest
H:\pg_backup\current_logfiles
・
・
・
H:\pg_backup\pg_logical\replorigin_checkpoint
H:\pg_backup\pg_multixact\members\0000
H:\pg_backup\pg_multixact\offsets\0000
H:\pg_backup\pg_wal\00000001000000000000000B
H:\pg_backup\pg_xact\0000
2716 個のファイルをコピーしました
C:\>
00
H:\pg_backup\pg_multixact\offsetsC:\>xcopy /E /I C:\pg_backup "C:\Program Files\PostgreSQL\16\data"
H:\pg_backup\backup_label
H:\pg_backup\backup_manifest
H:\pg_backup\current_logfiles
・
・
・
H:\pg_backup\pg_logical\replorigin_checkpoint
H:\pg_backup\pg_multixact\members\0000
H:\pg_backup\pg_multixact\offsets\0000
H:\pg_backup\pg_wal\00000001000000000000000B
H:\pg_backup\pg_xact\0000
2716 個のファイルをコピーしました
C:\>
00
H:\pg_backup\pg_walC:\>xcopy /E /I C:\pg_backup "C:\Program Files\PostgreSQL\16\data"
H:\pg_backup\backup_label
H:\pg_backup\backup_manifest
H:\pg_backup\current_logfiles
・
・
・
H:\pg_backup\pg_logical\replorigin_checkpoint
H:\pg_backup\pg_multixact\members\0000
H:\pg_backup\pg_multixact\offsets\0000
H:\pg_backup\pg_wal\00000001000000000000000B
H:\pg_backup\pg_xact\0000
2716 個のファイルをコピーしました
C:\>
000001000000000000000B
H:\pg_backup\pg_xactC:\>xcopy /E /I C:\pg_backup "C:\Program Files\PostgreSQL\16\data"
H:\pg_backup\backup_label
H:\pg_backup\backup_manifest
H:\pg_backup\current_logfiles
・
・
・
H:\pg_backup\pg_logical\replorigin_checkpoint
H:\pg_backup\pg_multixact\members\0000
H:\pg_backup\pg_multixact\offsets\0000
H:\pg_backup\pg_wal\00000001000000000000000B
H:\pg_backup\pg_xact\0000
2716 個のファイルをコピーしました
C:\>
00
2716 個のファイルをコピーしました
C:\>
PostgreSQLの再起動
管理者権限でPsatgreSQLで起動します。
C:\>net start postgresql-x64-16
postgresql-x64-16 - PostgreSQL Server 16 サービスを開始します..
postgresql-x64-16 - PostgreSQL Server 16 サービスは正常に開始されました。
私の場合、最初 下記の様にサービスが開始できませんでした。
C:\>net start postgresql-x64-16
postgresql-x64-16 - PostgreSQL Server 16 サービスを開始します.
postgresql-x64-16 - PostgreSQL Server 16 サービスを開始できませんでした。
サービスはエラーを報告しませんでした。
NET HELPMSG 3534 と入力すると、より詳しい説明が得られます。
Applicationログを調べてみると、PostgreSQL の「postmaster.pid」に対してアクセス権限が不足しているらしいので、PostgreSQL サービスのアカウントを「ローカルシステムアカウント」に変更したら起動できました。


動作確認
正常にリストアされたか確認するため、PostgreSQLに接続してデータベースの一覧を表示してみます。正常に表示されました。
C:\>psql -U postgres -h localhost -p 5432 -d postgres
psql (16.4)
"help"でヘルプを表示します。
postgres=# \l
データベース一覧
名前 | 所有者 | エンコーディング | ロケールプロバイダー | 照合順序 | Ctype(変換演算子) | ICUロケール | ICUルール: | アクセス権限
-----------+----------+------------------+----------------------+----------+-------------------+-------------+------------+-----------------------
postgres | postgres | UTF8 | libc | C | C | | |
template0 | postgres | UTF8 | libc | C | C | | | =c/postgres +
| | | | | | | | postgres=CTc/postgres
template1 | postgres | UTF8 | libc | C | C | | | =c/postgres +
| | | | | | | | postgres=CTc/postgres
(3 行)

まとめ
PostgreSQLのバックアップには pg_basebackup
と pg_dump
の2つの主要な方法があります。それぞれの特性を理解し、用途に応じて適切な手法を選択することが重要です。
pg_basebackup の特徴
- フルバックアップ向け:データディレクトリ全体をコピーするため、データベース全体のバックアップ・リストアが容易
- 整合性の確保:WALログを含めてバックアップを取得し、一貫性のある状態を保持
- ストリーミングレプリケーション対応:レプリカサーバーのセットアップに最適
- 圧縮可能:7zipなどを使ってバックアップサイズを削減可能
- リストアがシンプル:データディレクトリを置き換えるだけで復旧可能
pg_dump の特徴
- 部分バックアップ向け:特定のデータベース、スキーマ、テーブル単位でエクスポート可能
- 移行用途に最適:異なるバージョン間の移行や他のデータベースシステムとの連携に向いている
- 柔軟なフォーマット:SQLスクリプトやカスタム形式での出力が可能
- リストアが詳細設定可能:
pg_restore
を使用して特定のデータのみ復元できる
用途別の選び方
№ | 用途 | 推奨ツール |
---|---|---|
1 | フルバックアップを取得・復元したい | pg_basebackup |
2 | 特定のテーブルやスキーマのみ取得したい | pg_dump |
3 | ストリーミングレプリケーションをセットアップしたい | pg_basebackup |
4 | データを異なる環境へ移行したい | pg_dump |
5 | 災害復旧のために完全なコピーを取りたい | pg_basebackup |
日常的なバックアップやストリーミングレプリケーションのセットアップには pg_basebackup
を、特定のテーブルやスキーマのエクスポート・移行には pg_dump
を活用すると良いでしょう。
脚 注
- PITR(Point-In-Time Recovery)
特定の時点にデータベースを復元する機能です。WAL(Write-Ahead Logging)を活用し、バックアップ取得後の変更データを適用することで、障害発生直前の状態や任意の時刻の状態に戻す事が可能です。 ↩︎