

PostgreSQL 11のpg_dump/pg_restoreはcustom形式が楽
この記事は、構成と文章の整理にAIを使っています。
あくまで読みやすくするための補助で、内容そのものをAIにすべて任せて書いているわけではありませんが、ところどころ相談しながら整えています。
ダンプ
--format=custom でダンプする。
pg_dump -U example_user -h example-host -d example_db --format=custom --file=db.dumpcustom形式は圧縮されるし、pg_restore で一部のテーブルだけ戻すみたいな選択リストアもできる。plain形式(SQLテキストそのまま)よりこっちの方が扱いやすい。
リストア
まずDBを作る。CREATE DATABASEできる権限のユーザーで接続する。
psql -U example_user -d postgres -h example-hostcreate database example_db_copy;拡張機能(PostGISなど)を使っているDBなら、リストア前に先に作っておく。
CREATE EXTENSION IF NOT EXISTS postgis;リストア用ユーザーがsuperuserじゃない場合、dumpの中に含まれる CREATE EXTENSION 文がそのままだとエラーになるらしい(未確認、次回試すときに要検証)。先に作っておけば、dump側の該当行はスキップされて通る。
その後、本体のリストア。
pg_restore -U example_user -h example-host -d example_db_copy db.dumpハマりそうな点
- dump元とrestore先でロール(オーナー)が違う場合、
--no-owner(-O)と--no-acl(-x)を付けないとOWNER TOやGRANTでエラーになる - custom形式は並列リストアに対応してるので、テーブル数が多いなら
-j 4とかで速くなる - パスワード入力を省きたいなら
.pgpassかPGPASSWORD環境変数を使う create databaseする時、dump元と同じENCODING/LC_COLLATEを指定しないと文字化けやソート順の違いで問題になることがある。元DBがUTF8以外なら明記しておいた方がいい