web-dev-qa-db-ja.com

PLPGSQLに関するPostgreSQL 9.1 pg_restoreエラー

DjangoプロジェクトでPostgresを使用しています。現在、ユーザーがバックアップをクリックするとpg_dumpを実行し、復元バックアップをクリックするとpg_restoreを実行するデータベースバックアップ/復元システムを実装しています。

実際にpg_restoreを実行しようとするまではすべてうまくいき、その時点でこのエラーが発生します。

pg_restore:[archiver(db)] TOCエントリ3206からのエラー。 0 0コメント拡張plpgsql pg_restore:[アーカイバ(db)]クエリを実行できませんでした:エラー:拡張plpgsqlの所有者でなければなりませんコマンド:COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL手続き言語' ;

私はplpgsqlが何であるかなどを調べましたが、それについて理解しています。エラーについては、スクリプトを実行してデータベース自体を所有しているユーザーに「拡張機能の所有者」を手動で設定しようとしましたが、何も変わりませんでしたすべてのもののコメントを設定しようとするとエラーになる

これはすべてpg_dumpによって自動的に作成されるため、コメント行を削除することはできず、コメントを無効にするフラグもありません(私は認識している)ので、この問題を解決する方法については本当に立ち往生しています。

63
fury-s12

Pg_restoreが、所有していない余分なデータを復元しようとしているようです。 -n publicオプションをpg_restoreコマンドラインに追加してみてください。 pg_restoreにパブリックスキーマのコンテンツのみを復元するよう指示します。コマンドラインは次のようになります

pg_restore -U username -c -n public -d database_name
112
Roman Akinfold

このページで次の回避策を見つけました。

http://archives.postgresql.org/pgsql-general/2011-10/msg00826.php

アイデアは、pg_restore -lを使用してアーカイブの内容を一覧表示し、ユーザーが復元する権限を持っていない拡張機能をgrepで削除し、pg_restore -Lを使用して復元時にこの省略リストを使用することです。

例えば:

pg_restore -l ~/database.dump | grep -v "EXTENSION - plpgsql" > ~/restore_elements
pg_restore -L ~/restore_elements ~/database.dump
14
rantler

可能であれば、ダンプを作成する前に、復元に失敗したコメントを削除することをお勧めします。

あなたはそうすることができます:

COMMENT ON EXTENSION plpgsql IS null;

新しく作成されたすべてのデータベースに対してこれを行いたくない場合は、template1(CREATE DATABASE…はこのデータベースをコピーします。)

その後作成されたダンプは、エラーなしで復元されます。

4
Peter Gerber

別のユーザーによって作成されたDBにロードしていますか?可能であれば、DBとその既存のオブジェクトを作成したのと同じユーザーを使用して復元してみてください。

2
Edmund

このコマンドの後、私のために働く-

Deepak@deepak:~$ Sudo -i -u postgres
postgres@deepak:~$ psql 
psql (9.3.5)
Type "help" for help.

postgres=# GRANT ALL PRIVILEGES ON DATABASE database_name TO user;
postgres=# GRANT
2
Deepak Mahakale