Comment faire l'extension de saut pg_dump?

16

C'est sur 9.3 mais je me souviens que des choses similaires se sont produites depuis 7.x. Je crée donc une base de données et y installe l'extension plpgsql. Plus tard, je crée un pg_dump et avant de le restaurer dans la base de données, je m'assure qu'il a également l'extension plpgsql. Ensuite, lors de la restauration, cela se produit:

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

Je crée un tas de scripts et il est assez important pour moi que pg_restore renvoie 0, donc le fait que je puisse simplement ignorer cela ne fait aucun bien. Ce qui me laisse perplexe, c'est que l'IIRC a besoin de créer une extension en tant qu'utilisateur maître de postgres, donc je n'ai aucune idée de pourquoi toutes ces extensions se retrouvent dans mon vidage. Après tout, je ne suis pas propriétaire de la langue / extension?

Quoi qu'il en soit, je serais reconnaissant pour toute suggestion sur la façon de s'en débarrasser. Veuillez noter que je sais comment fonctionnent les commutateurs -l / -L. Cependant, cela semble être beaucoup trop d'efforts pour corriger un seul commentaire d'extension simple.

Jacek Prucia
la source
3
FWIW, cela a été signalé l'année dernière et discuté comme bug # 8695 .
Daniel Vérité

Réponses:

8

Pour tous ceux qui recherchent une solution de contournement, la limitation pg_restoreà un schéma spécifique m'a aidé à contourner ce bogue. Voir /programming//a/11776053/11819

nfelger
la source
J'ai toujours eu des problèmes d'extensions lorsque j'ai utilisé le -ndrapeau
Ligemer
5

Tu peux faire

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

c'est ce que j'utilise pour importer dans google cloud sql avec postgres.

edit: ajout du curseur de début de ligne pour ne pas exclure les lignes contenant ce texte littéral.

René
la source
2
cela pourrait supprimer un enregistrement contenant ce texte, il est peu probable que cela se produise, mais vous aurez un schéma corrompu avec des contraintes manquantes (car elles sont ajoutées à la fin de l'instantané). Je préfixerais un "-" au lieu de le supprimer, et en considérant également le cas 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

Utilisez l' -Lindicateur avec pg_restore après avoir effectué un vidage dans un format de fichier personnalisé.

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

Restaurez uniquement les éléments d'archive répertoriés dans list-fileet restaurez-les dans l'ordre dans lequel ils apparaissent dans le fichier. Notez que si des commutateurs de filtrage tels que -nou -tsont utilisés avec -L, ils restreindront davantage les éléments restaurés.

list-fileest normalement créé en modifiant la sortie d'une -lopération précédente . Les lignes peuvent être déplacées ou supprimées, et peuvent également être commentées en plaçant un point-virgule ( ;) au début de la ligne. [...]

Référence: pg_restore (documentation 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

Ici, vous pouvez voir que l' inverse est vrai:

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
la source
Bienvenue sur DBA.SE. Nous apprécions votre contribution. La question d'origine concerne la version 9.3 de PostgreSQL, mais votre réponse d'origine faisait référence au 9.5. version. J'ai légèrement modifié votre réponse pour refléter cela. Cependant, certaines parties de la sortie peuvent être spécifiques à la version et peuvent être différentes dans la version 9.3.
John aka hot2use
0

Afin d'exporter uniquement le schéma sans aucun autre objet de la base de données, vous pouvez spécifier le nom du schéma à l'aide du paramètre --schema

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