Wie kann ich die pg_dump-Erweiterung überspringen lassen?

15

Dies ist auf 9.3, aber ich kann mich an ähnliche Ereignisse seit 7.x erinnern. Also erstelle ich eine Datenbank und installiere die plpgsql-Erweiterung darin. Später erstelle ich einen pg_dump und bevor ich ihn in die Datenbank zurückspeichere, stelle ich sicher, dass er auch die Erweiterung plpgsql hat. Wenn Sie dies wiederherstellen, geschieht Folgendes:

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

Ich erstelle eine Reihe von Skripten und es ist ziemlich wichtig für mich, dass pg_restore 0 zurückgibt. Die Tatsache, dass ich dies einfach ignorieren kann, ist also nicht gut. Was mich verwundert, ist, dass ich als postgres-Master-Benutzer eine Erweiterung für IIRC erstellen muss, sodass ich keine Ahnung habe, warum all das EXTENSION-Zeug in meinem Dump landet. Immerhin bin ich kein Besitzer der Sprache / Erweiterung?

Wie auch immer, ich wäre dankbar für jeden Vorschlag, wie ich das loswerden könnte. Bitte beachten Sie, dass mir bekannt ist, wie die Schalter -l / -L funktionieren. Dies scheint jedoch viel zu aufwendig zu sein, um nur einen einfachen Erweiterungskommentar zu korrigieren.

Jacek Prucia
quelle
3
FWIW, dies wurde im letzten Jahr gemeldet und als Bug # 8695 diskutiert .
Daniel Vérité

Antworten:

8

Für alle, die nach einer Problemumgehung suchen, hat das Beschränken pg_restoreauf ein bestimmtes Schema mir geholfen, diesen Fehler zu umgehen. Siehe /programming//a/11776053/11819

nfelger
quelle
Ich hatte immer noch Probleme mit Erweiterungen, als ich die -nFlagge benutzte
Ligemer
5

Du kannst tun

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

Es ist das, was ich zum Importieren von Google Cloud SQL mit Postgres verwende.

Bearbeiten: Das Caret 'Zeilenanfang' wurde hinzugefügt, um Zeilen, die diesen wörtlichen Text enthalten, nicht auszuschließen.

Rene
quelle
2
Dadurch werden möglicherweise Datensätze entfernt, die diesen Text enthalten. Es ist jedoch unwahrscheinlich, dass ein beschädigtes Schema mit fehlenden Einschränkungen vorliegt (da diese am Ende des Snapshots hinzugefügt werden). Ich würde ein "-" voranstellen, anstatt es zu entfernen, und auch den DROP-Fall in Betracht ziehen 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

Verwenden Sie das -LFlag mit pg_restore, nachdem Sie einen Speicherauszug in einem benutzerdefinierten Dateiformat erstellt haben.

-L --use-list =list-file
list-file

Stellen Sie nur die Archivelemente wieder her, die in aufgeführt sind list-file, und stellen Sie sie in der Reihenfolge wieder her, in der sie in der Datei angezeigt werden. Beachten Sie, dass die wiederhergestellten Elemente weiter eingeschränkt werden , wenn Filteroptionen wie -noder -tverwendet -Lwerden.

list-filewird normalerweise durch Bearbeiten der Ausgabe einer vorherigen -lOperation erstellt. Zeilen können verschoben oder entfernt werden und können auch auskommentiert werden, indem ein Semikolon ( ;) am Zeilenanfang platziert wird. [...]

Referenz: pg_restore (PostgreSQL-Dokumentation 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

Hier können Sie sehen, dass das Gegenteil wahr ist:

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
--
Ligemer
quelle
Willkommen bei DBA.SE. Wir bedanken uns für Ihren Beitrag. Die ursprüngliche Frage betraf PostgreSQL Version 9.3. Ihre ursprüngliche Antwort bezog sich jedoch auf die Version 9.5. Ausführung. Ich habe Ihre Antwort leicht geändert, um dies widerzuspiegeln. Teile der Ausgabe können jedoch versionsspezifisch sein und in Version 9.3 abweichen.
John aka hot2use
0

Um nur ein Schema ohne andere Objekte der Datenbank zu exportieren, können Sie den Namen des Schemas mit dem Parameter angeben --schema

pg_dump --schema=<schema_name> --schema-only <db_name> 
Mauricio Sánchez
quelle