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」で作成するのでしょうか。そうすると、ユーザー名のオプションを指定しなくてもいいようです。あんまりこのエラーでハマった人は見かけませんね。
今回の原因は、思いつきで別名でデータベースを作成したことにあるのかもしれません。
コメント