「pg_dump: エラー: 問い合わせが失敗しました」が出てエラーになる

プログラミング

PostgreSQLのデータベースをバックアップするため、「pg_dump」を実行したところ

pg_dump: エラー: 問い合わせが失敗しました: ERROR:  permission denied for table schema_migrations
pg_dump: エラー: 問い合わせ: LOCK TABLE public.schema_migrations IN ACCESS SHARE MODE

こんなエラーが出ました。

前提

railsアプリをPostgreSQLを用いて開発しています。
完全初心者です。
本番稼働後のデータのバックアップを取得しようと「pg_dump」を実行しました。

経緯

自動バックアップまでは遠い道のりですので、まずは手動でバックアップを取得することに。
いろんなサイトをめぐり巡って「pg_dump」にたどり着きました。

/usr/pgsql-12/bin/pg_dump database名 > /var/XXX/pgdump/pgdumpYYYYMMDD.sql

「/usr/pgsql-12/bin/」この部分はPostgreSQLがインストールされている場所になります。
「database名」はデータベースの名前、「/var/XXX/pgdump/pgdumpYYYYMMDD.sql」はバックアップのファイル名とファイルパスです。

これを実行すると、

pg_dump: エラー: 問い合わせが失敗しました: ERROR:  permission denied for table schema_migrations
pg_dump: エラー: 問い合わせ: LOCK TABLE public.schema_migrations IN ACCESS SHARE MODE

こんな感じのエラーになります。

権限がないんだな、ってことはわかりますね。でもどうすればいいのかは教えてくれません。
実行するユーザーを「psotgres」に変えても「root」に変えても同じエラーではじかれます。

原因

どうやらPostgreSQLのデータベースには「所有者」というものがあり、その「所有者」の権限で実行しないとダメらしいのです。

データベースの所有者を調べるには、まずターミナルを起動します。

psql -d postgres

次にデータベースの一覧を表示します。

\l

作成したデータベースが一覧で表示されます。そこに「所有者」欄がありますのでそこのユーザー名で実行する必要があるそうです。

対策

「pg_dump」のコマンドにユーザー名のオプションを指定して実行します。

/usr/pgsql-12/bin/pg_dump database名 -u ユーザー名> /var/XXX/pgdump/pgdumpYYYYMMDD.sql

データベース名の後ろに、「-u ユーザー名」をつけます。このユーザー名は先ほど調べた「所有者」名です。

無事バックアップが取得できました。

まとめ

データベースを作成する際に、ちょっと変わったユーザー名で作成してしまっていたようです。通常は「postgres」で作成するのでしょうか。そうすると、ユーザー名のオプションを指定しなくてもいいようです。あんまりこのエラーでハマった人は見かけませんね。

今回の原因は、思いつきで別名でデータベースを作成したことにあるのかもしれません。

コメント