pg_dump – PostgreSQLデータベースを論理バックアップする

パッケージ管理・ソフトウェア フル/増分バックアップ

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
  • plainpsql で復元、custom/directory/tarpg_restore を使用します。並列ダンプ(-j)は directory 形式のみ対応です。(PostgreSQL)

主なオプション一覧

オプション説明使用例
`-F {pcd
-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-insertsCOPY ではなく INSERT で出力(互換性重視・遅い)。pg_dump --inserts mydb > dump.sql (PostgreSQL)
--rows-per-insert N1 回の 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 [levelmethod[: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/tarpg_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

(PostgreSQL)

関連コマンド

  • pg_restorecustom/directory/tar 形式のアーカイブを復元。並列復元(-j)対応。(PostgreSQL)
  • pg_dumpall:クラスタ内すべてのDBとグローバルオブジェクトをまとめて出力。(PostgreSQL)
  • psqlplain 形式の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)

参考

Bash玄

はじめまして!Bash玄です。

エンジニアとしてシステム運用に携わる中で、手作業の多さに限界を感じ、Bashスクリプトを活用して業務を効率化したのがきっかけで、この道に入りました。「手作業は負け」「スクリプトはシンプルに」をモットーに、誰でも実践できるBashスクリプトの書き方を発信しています。

このサイトでは、Bashの基礎から実践的なスクリプト作成まで、初心者でもわかりやすく解説しています。少しでも「Bashって便利だな」と思ってもらえたら嬉しいです!

# 好きなこと
- シンプルなコードを書くこと
- コマンドラインを快適にカスタマイズすること
- 自動化で時間を生み出すこと

# このサイトを読んでほしい人
- Bashに興味があるけど、何から始めればいいかわからない人
- 定型業務を自動化したい人
- 効率よくターミナルを使いこなしたい人

Bashの世界に一歩踏み出して、一緒に「Bash道」を極めていきましょう!

Bash玄をフォローする

コメント