web-dev-qa-db-ja.com

pg_restoreを使用するときは、正しいユーザー名を確認してください

ローカル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'のようなものです。

3
Niels Kristian

Plpgsql拡張機能を作成する場合は、スーパーユーザーである必要があります。私の推奨は、app_userを一時的にスーパーユーザーにしてから、これを元に戻すことです。スーパーユーザーもすべての所有者として扱われます。

ALTER USER app_user WITH SUPERUSER;

復元を実行し、完了したら

ALTER USER app_user WITH NOSUPERUSER;

これにより、他の権限の問題は回避されますが、必要な権限がそのまま残ります。

0
Chris Travers