Как исключить функции PL/pgSQL при экспорте?

Я использую следующую команду для сброса некоторых структур из базы данных сервера, чтобы иметь возможность создать образец данных на моем локальном жестком диске.

pg_dump -h myserver.com -U product_user -s -f ./data/base.structure.postgresql.sql -F p -v -T public.* -T first_product.* -T second_product.* -T another_product.locales mydatabase

Мне нужно исключить некоторые схемы, иначе это закончится разрешениями или другими ошибками. Даже если я исключаю общедоступную схему, она выводит все функции в этой схеме, например:

REVOKE ALL ON FUNCTION gin_extract_trgm(text, internal) FROM PUBLIC;
psql:./data/base.structure.postgresql.sql:8482: ERROR:  function gin_extract_trgm(text, internal) does not exist

Я знаю, что это происходит из-за полнотекстового или подобия плагина в PostgreSQL, но я не использую его и не нуждаюсь в нем на своей машине, поэтому я хотел бы исключить эти функции.

Как я мог это сделать?


person Radek Simko    schedule 15.03.2012    source источник


Ответы (3)


Мне нужно исключить некоторые схемы

В pg_dump есть переключатель для исключения схем:

pg_dump -N schema ...

Я цитирую руководство по pg_dump:

-N схема
--exclude-schema=схема

Не сбрасывайте никакие схемы, соответствующие шаблону схемы. Шаблон интерпретируется по тем же правилам, что и для -n. -N можно указать несколько раз, чтобы исключить схемы, соответствующие любому из нескольких шаблонов.
...


В PostgreSQL 9.1 или более поздней версии у вас есть новые возможности для перемещения расширений в отдельную схему — даже предустановленные модули старого стиля. Вы можете зарегистрировать старый объект с вашим (новым стилем) расширением, а затем использовать новые инструменты. Под fulltext и similarity вы, вероятно, имеете в виду fuzzystrmatch и tsearch2. Пример:

Зарегистрируйте существующие объекты старого стиля для расширения fuzzystrmatch:

CREATE EXTENSION fuzzystrmatch SCHEMA public FROM unpackaged;

Удалить расширение:

DROP EXTENSION fuzzystrmatch;

Установите его в другую схему:

CREATE EXTENSION fuzzystrmatch SCHEMA my_schema;

Конечно, вы не можете удалить расширение, если объекты из него используются.
Кроме того, если вы устанавливаете в другую схему, вам необходимо квалифицировать ее используемые функции или добавить схему в search_path.

person Erwin Brandstetter    schedule 15.03.2012

Есть способ сделать это. Скажем, ваша резервная копия называется backup.dump. Что вам нужно сделать, это:

$ pg_restore -l -f out.txt backup.dump

Это создаст файл out.txt, содержащий список объектов, находящихся в дампе. Вам нужно отредактировать файл и удалить элементы, которые вы не хотите восстанавливать. Затем вы делаете это:

$ pg_restore -L out.txt -h your.host.name -U username ....  backup.dump

Это будет использовать файл out.txt (который вы редактировали) для выбора вещей, которые будут восстановлены. Очень удобно, особенно если дамп большой и вы не можете сделать дамп базы данных повторно.

person Bartosz Radaczyński    schedule 25.06.2015

В дополнение к ответу Бартоша выше, вы можете использовать следующую команду sed для удаления, например. определенную ФУНКЦИЮ из списка перед восстановлением:

sed -r -i -e '/FUNCTION public plpgsql_call_handler\(\) postgres/d' /var/backup/${DBNAME}.list 
person Laur3ns    schedule 18.06.2020