web-dev-qa-db-ja.com

PostgreSQLデータベースを復元する際の権限の問題を解決する方法

次のコマンドを使用して、Postgresデータベースのクリーンで所有者なしのバックアップをダンプしました

pg_dump sample_database -O -c -U

後で、データベースを復元するときに

psql -d sample_database -U app_name

ただし、データの復元を妨げるいくつかのエラーが発生しました。

ERROR:  must be owner of extension plpgsql
ERROR:  must be owner of schema public
ERROR:  schema "public" already exists
ERROR:  must be owner of schema public
CREATE EXTENSION
ERROR:  must be owner of extension plpgsql

プレーンテキストのSQL pg_dumpが生成し、SQLが含まれていることがわかりました

CREATE SCHEMA public;
COMMENT ON SCHEMA public IS 'standard public schema';
CREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog;
COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language';

原因は、ユーザーapp_namepublicスキーマとplpgsqlを変更する権限がないためだと思います。

この問題を解決するにはどうすればよいですか?

86
steveyang

この問題を解決するには、適切な所有権権限を割り当てる必要があります。特定のユーザーのすべての権限関連の問題を解決する必要がありますが、コメントで述べられているように、これは本番環境では使用しないでください。

root@server:/var/log/postgresql# Sudo -u postgres psql
psql (8.4.4)
Type "help" for help.

postgres=# \du
               List of roles
    Role name    | Attributes  | Member of
-----------------+-------------+-----------
 <user-name>    | Superuser   | {}
                 : Create DB
 postgres       | Superuser   | {}
                 : Create role
                 : Create DB

postgres=# alter role <user-name> superuser;
ALTER ROLE
postgres=#

そのため、スーパーユーザーアカウントSudo -u postgres psqlでデータベースに接続し、ALTER ROLE <user-name> Superuser;ステートメントを実行します。

心に留めておいてくださいこれはマルチサイトホスティングサーバーでの最良の解決策ではないので、代わりに個々の役割の割り当てを見てください: https:/ /www.postgresql.org/docs/current/static/sql-set-role.html および https://www.postgresql.org/docs/current/static/sql-alterrole.html

62

これを取得している場合、AWS RDSユーザーは、スーパーユーザーではなく、awsのドキュメントによると、ユーザーになることができないためです。これらのエラーを無視する必要があることがわかりました。

47
Jim Zucker

Google Cloud Platformを使用しているユーザーの場合、エラーが発生するとインポートプロセスが停止します。個人的には、発行したpg_dumpコマンドに応じて2つの異なるエラーが発生しました。

1- The input is a PostgreSQL custom-format dump. Use the pg_restore command-line client to restore this dump to a database.

非プレーンテキスト形式でDBをダンプしようとしたときに発生します。つまり、コマンドに-Fpまたは--format = plainパラメーターがない場合。ただし、コマンドに追加すると、次のエラーが発生する場合があります。

2- SET SET SET SET SET SET CREATE EXTENSION ERROR: must be owner of extension plpgsql

これは、 GCP docs で提供されているコマンド、この現在のスレッドからのヒント、またはGoogle Postgresチームからのアドバイスに従って here を使用して修正できなかった許可の問題です。次のコマンドを発行することをお勧めします:

pg_dump -Fp --no-acl --no-owner -U myusername myDBName > mydump.sql

私の場合、トリックを行ったのは、ダンプファイルを手動で編集し、plpgsqlに関連するすべてのコマンドをコメントアウトすることだけでした。

これがGCP依存の魂に役立つことを願っています。

更新:

特に、一部のダンプは巨大になる可能性があるため、拡張子をコメント化してファイルをダンプする方が簡単です:pg_dump ... | grep -v -E '(CREATE\ EXTENSION|COMMENT\ ON)' > mydump.sql

Plpgsqlに絞り込むことができます:pg_dump ... | grep -v -E '(CREATE\ EXTENSION\ IF\ NOT\ EXISTS\ plpgsql|COMMENT\ ON\ EXTENSION\ plpgsql)' > mydump.sql

19
Stanislasdrg

この場合、エラーメッセージはおそらく無視しても問題ありません。パブリックスキーマにコメントを追加せず、plpgsql(既にインストールされているはずです)をインストールしても、実際の問題は発生しません。

ただし、完全な再インストールを行う場合は、適切な権限を持つユーザーが必要です。もちろん、アプリケーションが日常的に実行されるユーザーであってはなりません。

12
Richard Huxton

短い答え:無視してください。

このモジュールは、SQL言語を処理するPostgresの一部です。エラーは、「heroku pg:pull」などのリモートデータベースのコピーの一部として頻繁に表示されます。 SQLプロセッサは上書きされず、警告が表示されます。

11
Charles Merriam

-Lから取得したファイルを指定して、pg_restoreでpg_dump -Fcフラグを使用してみてください

-L list-file --use-list = list-file

List-fileにリストされているアーカイブ要素のみを復元し、ファイルに現れる順序で復元します。 -nまたは-tなどのフィルタリングスイッチを-Lとともに使用すると、復元されるアイテムがさらに制限されることに注意してください。

list-fileは通常、前の-l操作の出力を編集することにより作成されます。行は移動または削除できます。また、行の先頭にセミコロン(;)を配置してコメント化することもできます。例については、以下を参照してください。

https://www.postgresql.org/docs/9.5/app-pgrestore.html

pg_dump -Fc -f pg.dump db_name
pg_restore -l pg.dump | grep -v 'COMMENT - EXTENSION' > pg_restore.list
pg_restore -L pg_restore.list pg.dump

ここでは、コメントのみを出力することで、Inverseがtrueであることがわかります。

pg_dump -Fc -f pg.dump db_name
pg_restore -l pg.dump | grep 'COMMENT - EXTENSION' > pg_restore_inverse.list
pg_restore -L pg_restore_inverse.list pg.dump
--
-- PostgreSQL database dump
--

-- Dumped from database version 9.4.15
-- Dumped by pg_dump version 9.5.14

SET statement_timeout = 0;
SET lock_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SELECT pg_catalog.set_config('search_path', '', false);
SET check_function_bodies = false;
SET client_min_messages = warning;
SET row_security = off;

--
-- Name: EXTENSION plpgsql; Type: COMMENT; Schema: -; Owner: 
--

COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language';


--
-- PostgreSQL database dump complete
--
4
Ligemer

復元を行う前に、postgres(admin)ユーザーを使用してスキーマをダンプし、スキーマを再作成して使用する特権を付与します。 1つのコマンドで:

Sudo -u postgres psql -c "DROP SCHEMA public CASCADE;
create SCHEMA public;
grant usage on schema public to public;
grant create on schema public to public;" myDBName
2
Pascal_dher

私にとっては、pgAdminでデータベースを設定していましたが、データベースの作成時に所有者を設定するだけでは十分ではなかったようです。 'public' schemaに移動し、そこにownerを設定する必要がありました(元々は 'postgres'でした)。

1
Peter L