Як зробити розширення пропуску pg_dump?


16

Це на 9.3, але я пам'ятаю подібні речі, що відбуваються з 7.x. Тому я створюю базу даних і встановлюю в неї розширення plpgsql. Пізніше я створюю pg_dump і перед тим, як відновити його в databse, я переконуюсь, що він також має розширення 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. Однак, здається, це занадто багато зусиль, щоб виправити лише один простий коментар розширення.


3
FWIW, про це повідомляли минулого року та обговорювали як помилку №8695 .
Даніель Веріте

Відповіді:


8

Для тих, хто шукає pg_restoreобхід , обмеження певної схеми допомогло мені обійти цю помилку. Дивіться /programming//a/11776053/11819


У мене все ще виникли проблеми з розширеннями, коли я використовував -nпрапор
Ligemer

5

Ви можете зробити

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

це те, що я використовую для імпорту до google cloud sql з postgres.

редагувати: додано каре "початку рядка", щоб не виключати рядки, що містять цей буквальний текст.


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'
Elvis Ciotti

2

Використовуйте -Lпрапор з допомогою pg_restore після того, як виберіть дамп у власному форматі файлу.

-L 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.
Джон ака hot2use

0

Для експорту тільки схеми без будь-яких інших об'єктів бази даних можна вказати ім'я схеми за допомогою параметра --schema

pg_dump --schema=<schema_name> --schema-only <db_name> 
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.