pg_restoreでpg_catalogの権限がないと怒られた

f:id:tax1729:20181022233056j:plain

pg_restoreでpg_catalogの権限がねえよとエラーが出てハマったので、原因と解決方法を記事にしました。

やりたかったこと

既存DBのダンプファイルから新規DBにあるスキーマだけをリストアしたい。

状況

既存DBのダンプファイルを以下のコマンドでリストしました。

#pg_restore -U postgres -n [schema] -d [databese] -f [file]

これは、ダンプファイルの[schema]だけリストアしたいときに使うコマンドです。

その際に以下のようなエラーが出ました。

スキーマ pg_catalog への権限がありません

解決策

新規DBにリストアしたいスキーマを予め作成したらうまくいった。

原因

リストアする際に発行するSQLを見ると以下のようになっていました。

SET search_path = ([schema],pg_catalog)

リストアするスキーマとpg_catalogにsearch_pathが設定されていました。予めリストアするスキーマを作成していなかったので、pg_catalogにsearch_pathが設定されてしまいます。

そのため、pg_catalogスキーマにリストアを実行しようとしてしまうため、権限エラーとなります。

スキーマをリストアする際は必ずリストア先のDBにスキーマを作成しておくのを忘れないようにしようと心に誓いました。