【PostgreSQL】バックアップの種類と比較
PostgreSQLには主に以下の3種類のバックアップ方法があり、それぞれに特徴とメリット・デメリットがあります。
バックアップを実施するには目的に合った方法を理解し適切にバックアップを行う事が重要です。
論理バックアップ
論理バックアップとはデータベースの内容をSQLスクリプトや圧縮ファイルとしてエクスポートするバックアップ方法です
特 徴
pg_dump
やpg_dumpall
を使用- SQLスクリプトとしてエクスポート
- テーブル単位、データベース単位での復元が容易
メリット
- 柔軟な復元(テーブル単位、スキーマ単位など)
- 異なるバージョンのPostgreSQLへの移行が容易
デメリット
- 大規模データベースでは時間がかかる
- 一貫性のあるスナップショットを取得するには注意が必要
論理バックアップ「pg_dump/pg_restore」については下記のブログを参考下さい。
参考ブログ:【PostgreSQL】バックアップ・リストア 「pg_dump/pg_dumpall/pg_restore/psql」

オフライン物理バックアップ
PostgreSQLを停止しデータディレクトリ全体を手動でコピーするバックアップ方法です。データの一貫性が確保されるシンプルで確実な手法ですが、バックアップ中はデータベースを使用できないという制約があります。
特 徴
- PostgreSQLを停止し、データディレクトリ全体をコピー
メリット
- シンプルで確実な方法
- すべてのデータが一貫性のある状態でバックアップされる
デメリット
- バックアップ中はデータベースを使用できない
- 柔軟性が低い(部分的な復元が困難)
オンライン物理バックアップ (pg_start_backup())
PostgreSQLを停止せずにデータディレクトリを手動でコピーするバックアップ方法です。
WAL (Write-Ahead Logging) を活用し、一貫性のあるスナップショットを取得できるため、PITR (ポイントインタイムリカバリ) にも対応可能です。
- WAL(Write-Ahead Logging)とは?
データの整合性を保つための技術で、データが変更される前にその変更内容をログに記録することで、システムがクラッシュしても、ログを使って変更を復元できるようにしています。 - PITR (ポイントインタイムリカバリ) とは?
データベースの復旧方法の一つで、特定の時点にデータベースを戻すプロセスです。これにより、データベースがクラッシュしたり、誤ってデータを削除した場合でも、指定した時点まで正確に復旧することができます。
特 徴
pg_start_backup()
を使用し、PostgreSQLを停止せずにデータディレクトリを手動でコピー- Write-Ahead Logging (WAL) を利用
メリット
- サーバーを停止せずにバックアップ可能
- 一貫性のあるスナップショットを取得可能
- PITR(Point-in-Time Recovery)に対応
デメリット
- 手動操作が必要で手順が複雑
- WALファイルの管理が必要

【PostgreSQL】pg_start_backup() を使用したオンライン物理バックアップの手順
前提条件
wal_level が replica 以上に設定されている(WALログを適切に取得するために必要)
wal_level
は、PostgreSQLのWAL (Write-Ahead Logging) の詳細度を決定する設定パラメータで、以下の3つのレベルがあります。
minimal
もっとも低いレベルで、クラッシュリカバリのみをサポート。レプリケーションや PITR (ポイントインタイムリカバリ) には対応しない。replica
(推奨)
ストリーミングレプリケーションやアーカイブをサポートする標準設定。logical
論理デコーディングをサポートし、データ変更を詳細に記録。
オンライン物理バックアップを行う場合は、wal_level = replica
以上に設定する必要があります。設定を変更するには、postgresql.conf
を編集し、PostgreSQLを再起動してください。
wal_level = replica
バックアップの取得手順
バックアップモードの開始(psql で実行)
pg_backup_start()はスーパーユーザーで実行します。又、下記の「backup label」にはバックアップが特定できる一意の文字を入力します。
- PostgreSQL 14以前
pg_start_backup('backup_label');
- PostgreSQL 15以降
pg_backup_start('backup_label', true);
C:\>psql -U postgres
psql (16.4)
"help"でヘルプを表示します。
postgres=# SELECT pg_backup_start('backup_label', true);
pg_backup_start
-----------------
0/2000028
(1 行)
データディレクトリをコピー(コマンドプロンプトで実行)
C:\>xcopy /E /I /EXCLUDE: "C:\Program Files\PostgreSQL\data" C:\backup_directory\data
C:\Program Files\PostgreSQL\data\backup_label.old
C:\Program Files\PostgreSQL\data\backup_manifest
・
・
・
C:\Program Files\PostgreSQL\data\pg_wal\archive_statusC:\>xcopy /E /I /EXCLUDE: "C:\Program Files\PostgreSQL\16\data" C:\backup_directory\data
C:\Program Files\PostgreSQL\16\data\backup_label.old
C:\Program Files\PostgreSQL\16\data\backup_manifest
・
・
・
C:\Program Files\PostgreSQL\16\data\pg_wal\archive_status\000000010000000000000002.done
C:\Program Files\PostgreSQL\16\data\pg_xact\0000
2006 個のファイルをコピーしました
C:\>
0000010000000000000002.done
C:\Program Files\PostgreSQL\data\pg_xactC:\>xcopy /E /I /EXCLUDE: "C:\Program Files\PostgreSQL\16\data" C:\backup_directory\data
C:\Program Files\PostgreSQL\16\data\backup_label.old
C:\Program Files\PostgreSQL\16\data\backup_manifest
・
・
・
C:\Program Files\PostgreSQL\16\data\pg_wal\archive_status\000000010000000000000002.done
C:\Program Files\PostgreSQL\16\data\pg_xact\0000
2006 個のファイルをコピーしました
C:\>
00
2006 個のファイルをコピーしました
C:\>
バックアップモードの終了(psql で実行)
- PostgreSQL 14以前
pg_stop_backup();
- PostgreSQL 15以降
pg backup_stop();
postgres=# SELECT pg_backup_stop();
NOTICE: WAL archiving is not enabled; you must ensure that all required WAL segments are copied through other means to complete the backup
pg_backup_stop
---------------------------------------------------------------------------
(0/3000060,"START WAL LOCATION: 0/2000028 (file 000000010000000000000002)+
CHECKPOINT LOCATION: 0/2000060 +
BACKUP METHOD: streamed +
BACKUP FROM: standby +
START TIME: 2025-02-10 06:08:54 JST +
LABEL: backup_label +
START TIMELINE: 1 +
","")
(1 行)
postgres=#
WALログを保存(コマンドプロンプトで実行)
C:\>xcopy /E /I "C:\Program Files\PostgreSQL\data\pg_wal" C:\backup_directory\pg_wal
C:\Program Files\PostgreSQL\data\pg_walC:\>xcopy /E /I "C:\Program Files\PostgreSQL\16\data\pg_wal" C:\backup_directory\pg_wal
C:\Program Files\PostgreSQL\16\data\pg_wal\000000010000000000000002
C:\Program Files\PostgreSQL\16\data\pg_wal\000000010000000000000003
C:\Program Files\PostgreSQL\16\data\pg_wal\archive_status\000000010000000000000002.done
3 個のファイルをコピーしました
0000010000000000000002
C:\Program Files\PostgreSQL\data\pg_walC:\>xcopy /E /I "C:\Program Files\PostgreSQL\16\data\pg_wal" C:\backup_directory\pg_wal
C:\Program Files\PostgreSQL\16\data\pg_wal\000000010000000000000002
C:\Program Files\PostgreSQL\16\data\pg_wal\000000010000000000000003
C:\Program Files\PostgreSQL\16\data\pg_wal\archive_status\000000010000000000000002.done
3 個のファイルをコピーしました
0000010000000000000003
C:\Program Files\PostgreSQL\data\pg_wal\archive_statusC:\>xcopy /E /I "C:\Program Files\PostgreSQL\16\data\pg_wal" C:\backup_directory\pg_wal
C:\Program Files\PostgreSQL\16\data\pg_wal\000000010000000000000002
C:\Program Files\PostgreSQL\16\data\pg_wal\000000010000000000000003
C:\Program Files\PostgreSQL\16\data\pg_wal\archive_status\000000010000000000000002.done
3 個のファイルをコピーしました
0000010000000000000002.done
3 個のファイルをコピーしました
オンライン物理バックアップ(pg_basebackup)との違い
データベースを停止しないオンライン物理バックアップには(
コマンドを使用する方法もあります。pg_basebackup
)
は主に以下の場合に使用されます。pg_basebackup
- データディレクトリ全体のスナップショットを取得し、復旧のために必要な全てのデータを取得する場合
- レプリケーションのスタンバイサーバをセットアップする場合
- Point-In-Time Recovery (PITR) を行うための基盤となるバックアップを作成する場合
- 別のサーバーにPostgreSQLデータベースを移行する場合
- 定期的なバックアップを自動化する場合
「
」を使用したオンライン物理バックアップについては下記のブログを参考下さい。pg_basebackup
参考ブログ:【PostgreSQL】pg_basebackup によるオンライン物理バックアップ
№ | 項目 | pg_start_backup() | pg_basebackup |
---|---|---|---|
1 | 操作方法 | 手動でコピー | コマンドで一括取得 |
2 | 柔軟性 | 高い(ディレクトリ選択可能) | 低い(全体コピー) |
3 | WAL管理 | 手動で取得が必要 | 自動取得 |
4 | 使いやすさ | 複雑 | 簡単 |
5 | 利用ケース | 高度なバックアップ戦略 | 簡単なフルバックアップ |

【PostgreSQL】バックアップの復元
バックアップの復元手順
既存のデータディレクトリを削除(または別の場所に移動)
C:\>net stop postgresql-x64-16
postgresql-x64-16 - PostgreSQL Server 16 サービスを停止中です.
postgresql-x64-16 - PostgreSQL Server 16 サービスは正常に停止されました。
C:\>ren "C:\Program Files\PostgreSQL\data" "data_old"
バックアップをリストア
c:\>xcopy /E /I C:\backup_directory\data "C:\Program Files\PostgreSQL\data"
C:\backup_directory\datac:\>xcopy /E /I C:\backup_directory\data "C:\Program Files\PostgreSQL\16\data"
C:\backup_directory\data\000000010000000000000002
C:\backup_directory\data\000000010000000000000003
C:\backup_directory\data\backup_label.old
C:\backup_directory\data\backup_manifest
・
・
・
C:\backup_directory\data\pg_wal\000000010000000000000003
C:\backup_directory\data\pg_wal\archive_status\000000010000000000000002.done
C:\backup_directory\data\pg_xact\0000
2009 個のファイルをコピーしました
C:\>
0000010000000000000002
C:\backup_directory\datac:\>xcopy /E /I C:\backup_directory\data "C:\Program Files\PostgreSQL\16\data"
C:\backup_directory\data\000000010000000000000002
C:\backup_directory\data\000000010000000000000003
C:\backup_directory\data\backup_label.old
C:\backup_directory\data\backup_manifest
・
・
・
C:\backup_directory\data\pg_wal\000000010000000000000003
C:\backup_directory\data\pg_wal\archive_status\000000010000000000000002.done
C:\backup_directory\data\pg_xact\0000
2009 個のファイルをコピーしました
C:\>
0000010000000000000003
C:\backup_directory\data\backup_label.old
C:\backup_directory\data\backup_manifest
・
・
・
C:\backup_directory\data\pg_walc:\>xcopy /E /I C:\backup_directory\data "C:\Program Files\PostgreSQL\16\data"
C:\backup_directory\data\000000010000000000000002
C:\backup_directory\data\000000010000000000000003
C:\backup_directory\data\backup_label.old
C:\backup_directory\data\backup_manifest
・
・
・
C:\backup_directory\data\pg_wal\000000010000000000000003
C:\backup_directory\data\pg_wal\archive_status\000000010000000000000002.done
C:\backup_directory\data\pg_xact\0000
2009 個のファイルをコピーしました
C:\>
0000010000000000000003
C:\backup_directory\data\pg_wal\archive_statusc:\>xcopy /E /I C:\backup_directory\data "C:\Program Files\PostgreSQL\16\data"
C:\backup_directory\data\000000010000000000000002
C:\backup_directory\data\000000010000000000000003
C:\backup_directory\data\backup_label.old
C:\backup_directory\data\backup_manifest
・
・
・
C:\backup_directory\data\pg_wal\000000010000000000000003
C:\backup_directory\data\pg_wal\archive_status\000000010000000000000002.done
C:\backup_directory\data\pg_xact\0000
2009 個のファイルをコピーしました
C:\>
0000010000000000000002.done
C:\backup_directory\data\pg_xactc:\>xcopy /E /I C:\backup_directory\data "C:\Program Files\PostgreSQL\16\data"
C:\backup_directory\data\000000010000000000000002
C:\backup_directory\data\000000010000000000000003
C:\backup_directory\data\backup_label.old
C:\backup_directory\data\backup_manifest
・
・
・
C:\backup_directory\data\pg_wal\000000010000000000000003
C:\backup_directory\data\pg_wal\archive_status\000000010000000000000002.done
C:\backup_directory\data\pg_xact\0000
2009 個のファイルをコピーしました
C:\>
00
2009 個のファイルをコピーしました
C:\>
WALログを適用
C:\>xcopy /E /I C:\backup_directory\pg_wal "C:\Program Files\PostgreSQL\data\pg_wal"
C:\backup_directory\pg_walC:\>xcopy /E /I C:\backup_directory\pg_wal "C:\Program Files\PostgreSQL\16\data\pg_wal"
C:\backup_directory\pg_wal\000000010000000000000002
C:\backup_directory\pg_wal\000000010000000000000003
C:\backup_directory\pg_wal\archive_status\000000010000000000000002.done
3 個のファイルをコピーしました
C:\>
0000010000000000000002
C:\backup_directory\pg_walC:\>xcopy /E /I C:\backup_directory\pg_wal "C:\Program Files\PostgreSQL\16\data\pg_wal"
C:\backup_directory\pg_wal\000000010000000000000002
C:\backup_directory\pg_wal\000000010000000000000003
C:\backup_directory\pg_wal\archive_status\000000010000000000000002.done
3 個のファイルをコピーしました
C:\>
0000010000000000000003
C:\backup_directory\pg_wal\archive_statusC:\>xcopy /E /I C:\backup_directory\pg_wal "C:\Program Files\PostgreSQL\16\data\pg_wal"
C:\backup_directory\pg_wal\000000010000000000000002
C:\backup_directory\pg_wal\000000010000000000000003
C:\backup_directory\pg_wal\archive_status\000000010000000000000002.done
3 個のファイルをコピーしました
C:\>
0000010000000000000002.done
3 個のファイルをコピーしました
C:\>
PostgreSQLを起動
C:\>net start postgresql-x64-16
postgresql-x64-16 - PostgreSQL Server 16 サービスを開始します.
postgresql-x64-16 - PostgreSQL Server 16 サービスは正常に開始されました。
C:\>
まとめ
pg_start_backup()
を使用すると、柔軟で細かい管理が可能になりますが、pg_basebackup
の方が簡単にフルバックアップを取得できます。運用環境に応じて適切な方法を選択して下さい。
№ | バックアップ方式 | メリット | デメリット |
1 | 論理バックアップ | 柔軟な復元、異なるバージョン対応 | 大規模DBでは遅い、一貫性管理が必要 |
2 | オフライン物理バックアップ | シンプルで確実 | 停止が必要、部分復元不可 |
3 | オンライン物理バックアップ (pg_start_backup() ********) | 柔軟な管理が可能 | 手順が複雑、WAL管理が必要 |
4 | pg_basebackup | 簡単に取得可能 | カスタマイズ性が低い |