Как заставить pg_dump пропустить расширение?


16

Это на 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, поэтому я понятия не имею, почему весь этот материал EXTENSION попадает в мой дамп. Ведь я не владелец языка / расширения?

В любом случае, я был бы благодарен за любое предложение, как избавиться от этого. Обратите внимание, что я знаю, как работают ключи -l / -L. Однако, это кажется слишком большим усилием, чтобы исправить только один простой комментарий расширения.


3
FWIW, об этом сообщалось в прошлом году и обсуждалось как ошибка # 8695 .
Даниэль Верите

Ответы:


8

Для тех, кто ищет обходной путь, ограничение pg_restoreконкретной схемы помогло мне обойти эту ошибку. См. Https://stackoverflow.com/a/11776053/11819


У меня все еще были проблемы с расширениями, когда я использовал -nфлаг
Ligemer

5

Ты можешь сделать

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

это то, что я использую для импорта в Google Cloud SQL с Postgres.

edit: добавлена ​​каретка 'начало строки', чтобы не исключать строки, содержащие этот текст.


2
это может привести к удалению записи, содержащей этот текст, что вряд ли произойдет, но у вас будет поврежденная схема с отсутствующими ограничениями (так как они добавляются в конце моментального снимка). Я бы поставил префикс "-" вместо удаления, а также рассматривал дело о DROP pg_dump | sed 's/DROP EXTENSION/-- DROP EXTENSION/g' | sed 's/CREATE EXTENSION/-- CREATE EXTENSION/g' | sed 's/COMMENT ON EXTENSION/-- COMMENT ON EXTENSION/g'
Элвис

2

Используйте -Lфлаг с pg_restore после получения дампа в пользовательском формате файла.

-L --use-list =list-file
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

Здесь вы можете увидеть обратное верно:

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
--

Добро пожаловать в DBA.SE. Мы ценим ваш вклад. Оригинальный вопрос о PostgreSQL версии 9.3., Но ваш первоначальный ответ был на 9.5. версия. Я немного изменил ваш ответ, чтобы отразить это. Однако части выходных данных могут зависеть от версии и могут отличаться в версии 9.3.
Джон aka hot2use

0

Чтобы экспортировать только схему без каких-либо других объектов базы данных, вы можете указать имя схемы, используя параметр --schema

pg_dump --schema=<schema_name> --schema-only <db_name> 
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.