ローカルUbuntuサーバーにpostgres 9.1.6をインストールしました。現在、Herokuのデータベースからデータベースダンプを復元しようとしています。ローカルデータベースは次のように設定されています。
Sudo -u postgres psql -c "create user app_user with password 'pass';"
Sudo -u postgres psql -c "create database app_production owner app_user;"
ダンプを復元しようとすると、次のコマンドを使用します。
pg_restore --verbose --schema=public --no-acl --no-owner --jobs=8 --exit-on-error --username=app_user --dbname=app_production /tmp/app_production.dump
\l
を使用してpsqlで所有権を確認すると、次のようになります。
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
------------------+-----------+----------+-------------+-------------+-----------------------
app_production | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 |
postgres | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 |
template0 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
template1 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
ご覧のとおり、app_productionデータベースの所有権はapp_userからpostgresに変わりました。 app_productionデータベースの所有者がまだapp_userであると予想していましたが、何が問題ですか?
ところで、奇妙なエラーが発生したため、--schema=public
が追加されました。
「クエリを実行できませんでした:エラー:拡張機能plpgsqlの所有者である必要があります」
もう1つは、ダンプの所有者が、データベースがherokuで持っていたユーザーであることです。これは、'jebf473b73bv73v749b7'
のようなものです。
Plpgsql拡張機能を作成する場合は、スーパーユーザーである必要があります。私の推奨は、app_userを一時的にスーパーユーザーにしてから、これを元に戻すことです。スーパーユーザーもすべての所有者として扱われます。
ALTER USER app_user WITH SUPERUSER;
復元を実行し、完了したら
ALTER USER app_user WITH NOSUPERUSER;
これにより、他の権限の問題は回避されますが、必要な権限がそのまま残ります。