pg_dump は PostgreSQL の単一データベースを一貫性を保ってスクリプトまたはアーカイブへ出力するバックアップツールです。稼働中のDBでも他ユーザーをブロックせずに取得できます。クラスタ全体やロール等のグローバルオブジェクトは pg_dumpall を使います。(PostgreSQL)
実務では、定期バックアップ・移行・リリース前後のスナップショット取得に使います。(PostgreSQL)
構文(Syntax)
# 基本
pg_dump [connection-option...] [option...] DBNAME
# 代表的な接続オプション(libpq準拠)
pg_dump -h HOST -p PORT -U USER -d DBNAME
pg_dump "postgres://USER:[email protected]:5432/DBNAME"
# 出力形式の指定
pg_dump -F {p|c|d|t} [-f FILE_OR_DIR] DBNAME
# p: plain(SQL), c: custom, d: directory, t: tar
plainはpsqlで復元、custom/directory/tarはpg_restoreを使用します。並列ダンプ(-j)はdirectory形式のみ対応です。(PostgreSQL)
主なオプション一覧
| オプション | 説明 | 使用例 |
|---|---|---|
| `-F {p | c | d |
-f FILE_OR_DIR | 出力先を指定。-Fd 時はディレクトリを指定(事前に存在しないこと)。 | pg_dump -Fd -f dumpdir mydb (PostgreSQL) |
-j N | 並列ダンプ(テーブルを最大 N 並列)。-Fd と併用必須。 | pg_dump -Fd -j 5 -f dumpdir mydb (PostgreSQL) |
-a, --data-only | データのみを出力(スキーマ除外)。 | pg_dump -a mydb > data.sql (PostgreSQL) |
-s, --schema-only | スキーマのみを出力(データ除外)。 | pg_dump -s mydb > schema.sql (PostgreSQL) |
-n PATTERN / -N PATTERN | スキーマの抽出/除外(ワイルドカード可)。 | pg_dump -n app_* mydb > app.sql (PostgreSQL) |
-t PATTERN / -T PATTERN | テーブルの抽出/除外。 | pg_dump -t 'public.emp*' -T public.employee_log mydb > emp.sql (PostgreSQL) |
--inserts / --column-inserts | COPY ではなく INSERT で出力(互換性重視・遅い)。 | pg_dump --inserts mydb > dump.sql (PostgreSQL) |
--rows-per-insert N | 1 回の INSERT に含める行数を制御。 | pg_dump --rows-per-insert=1000 mydb > dump.sql (PostgreSQL) |
-O, --no-owner | 所有者変更コマンドを出力しない(任意ユーザーで復元しやすい)。 | pg_dump -O mydb > dump.sql (PostgreSQL) |
-x, --no-privileges | 権限(ACL)を出力しない。 | pg_dump -x mydb > dump.sql (PostgreSQL) |
| `-Z [level | method[:detail]]` | 圧縮方式/レベル(gzip/lz4/zstd/none)。形式により挙動が異なる。 |
--lock-wait-timeout T | 取得開始時の共有ロック待ちに上限を設定。 | pg_dump --lock-wait-timeout=5s mydb (PostgreSQL) |
-h/-p/-U/-d | 接続先やユーザー指定。-d/DBNAME は接続文字列も可。 | pg_dump -h db -U app -d "postgres://app@db/mydb" (PostgreSQL) |
実行例
1) カスタム形式でバックアップし、pg_restore で復元
説明:最も柔軟な形式。復元時にオブジェクト単位の選択・並べ替えが可能。
コマンド
pg_dump -F c -f /backup/mydb.dump mydb
pg_restore -d newdb /backup/mydb.dump
補足:plain 形式は psql -f で復元、custom/directory/tar は pg_restore を使用。(PostgreSQL)
2) ディレクトリ形式で並列バックアップ
説明:大規模DB向けにテーブル単位で並列化します。
コマンド
pg_dump -Fd -j 8 -f /backup/mydb_dir mydb
# 復元(並列)
pg_restore -j 8 -d newdb /backup/mydb_dir
ポイント:並列ダンプは -Fd のみ。並列復元は -Fc と -Fd に対応。(PostgreSQL)
3) スキーマだけをエクスポート
説明:オブジェクト定義のみを取得(データなし)。
コマンド
pg_dump --schema-only mydb > schema.sql
出力例:CREATE TABLE ... や ALTER ... が並ぶSQL。(PostgreSQL)
4) 特定スキーマ/テーブルだけを抽出
説明:app_ で始まるスキーマ配下のうち、特定テーブルを除外。
コマンド
pg_dump -n 'app_*' -T app_audit_log mydb > app.sql
補足:ワイルドカードはシェル展開に注意し、引用符で囲む。(PostgreSQL)
5) エラー例:-j を -Fc で使ってしまった
説明:並列ダンプはディレクトリ形式のみ。-Fc などで -j を指定するとエラーになります。
コマンド
pg_dump -Fc -j 4 -f /backup/mydb.dump mydb
echo $?
出力例(例)
pg_dump: error: parallel dump is only supported by the directory format
1
関連コマンド
pg_restore:custom/directory/tar形式のアーカイブを復元。並列復元(-j)対応。(PostgreSQL)pg_dumpall:クラスタ内すべてのDBとグローバルオブジェクトをまとめて出力。(PostgreSQL)psql:plain形式のSQLを流し込んで復元。(PostgreSQL)
備考
- 互換性:
pg_dumpは自分より新しいサーバーからはダンプできません(同等/古いサーバーは可)。異なるメジャーバージョン間では、古いサーバーへの復元は手修正が必要になる場合があります。(PostgreSQL) - 接続と認証:
-U/-h/-pほか.pgpassや環境変数(PGHOST/PGPORT/PGUSER/PGDATABASE)が利用されます。DBNAMEは接続文字列でも指定可能です。(PostgreSQL) - ロックと整合性:内部で
ACCESS SHAREロックを取得します。並列時に他クライアントが排他ロックを要求すると失敗し得ます。(PostgreSQL) - 圧縮:
custom/directoryは既定でテーブル単位圧縮、tarは非対応、plainはレベル指定時に全体圧縮挙動。(PostgreSQL) - 復元後:統計情報は含まれないため、復元後は
ANALYZE実行を推奨。(PostgreSQL)
参考
- PostgreSQL 公式ドキュメント:
pg_dump/ バックアップと復元(SQL Dump) /pg_restore/pg_dumpall(PostgreSQL) - Debian manpages:
pg_dump(1)(Debian Manpages)

コメント