web-dev-qa-db-ja.com

pg_dumpが拡張をスキップする方法は?

これは9.3ですが、7.x以降に起こったことを思い出すことができます。だから私はデータベースを作成し、それにplpgsql拡張機能をインストールします。後でpg_dumpを作成し、それをデータベースに復元する前に、plpgsql拡張があることを確認します。次に、これを復元するときに発生します:

pg_restore: creating EXTENSION plpgsql
pg_restore: creating COMMENT EXTENSION plpgsql
pg_restore: [archiver (db)] Error while PROCESSING TOC:
pg_restore: [archiver (db)] Error from TOC entry 2053; 0 0 COMMENT EXTENSION plpgsql
pg_restore: [archiver (db)] could not execute query: ERROR:  must be owner of extension plpgsql
Command was: COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language';

私はたくさんのスクリプトを作成していますが、pg_restoreが0を返すことは私にとって非常に重要です。そのため、これを無視できるだけでは何の効果もありません。私を困惑させるのは、IIRCでpostgresマスターユーザーとして拡張機能を作成する必要があるということです。そのため、このすべての拡張機能がダンプに含まれる理由がわかりません。結局のところ、私は言語/拡張機能の所有者ではないのですか?

とにかく、私はこれを取り除く方法についての提案に感謝します。 -l/-Lスイッチがどのように機能するかは知っています。ただし、これは、1つの単純な拡張機能コメントを修正するのに非常に多くの労力をかけているようです。

16
Jacek Prucia

回避策を探している人はpg_restore特定のスキーマを使用することで、このバグを回避できました。参照 https://stackoverflow.com/a/11776053/11819

8
nfelger

できるよ

pg_dump ... | grep -v -E '^(CREATE\ EXTENSION|COMMENT\ ON)' >out.sql

それは私がpostgresでグーグルクラウドSQLにインポートするために使用するものです。

編集:このリテラルテキストを含む行を除外しないように、「行の先頭」キャレットを追加しました。

5
Rene

カスタムファイル形式でダンプを取得した後、pg_restoreで-Lフラグを使用します。

-Llist-file
-use-list =list-file

list-fileにリストされているアーカイブ要素のみを復元し、ファイルに表示されている順序で復元します。 -n-tなどのフィルタースイッチを-Lと共に使用すると、復元されるアイテムがさらに制限されます。

list-fileは通常、前の-l操作の出力を編集することによって作成されます。行は移動または削除できます。また、行の先頭にセミコロン(;)を配置してコメント化することもできます。[...]

参照:pg_restore (PostgreSQLドキュメント9.3)

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

ここでは、Inverseがtrueであることがわかります。

pg_dump -Fc -f pg.dump db_name
pg_restore -l pg.dump | grep 'COMMENT - EXTENSION' | grep 'plpgsql' > pg_restore.list
pg_restore --use-list pg_restore.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
--
2
Ligemer

データベースの他のオブジェクトなしでスキーマのみをエクスポートするには、パラメーター--schemaを使用してスキーマの名前を指定できます。

pg_dump --schema=<schema_name> --schema-only <db_name> 
0