web-dev-qa-db-fra.com

Comment faire l'extension de saut pg_dump?

C'est sur 9.3 mais je me souviens des choses similaires se produisant 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 pourquoi toutes ces choses EXTENSION finissent 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.

16
Jacek Prucia

Pour tous ceux qui recherchent une solution de contournement, limitant pg_restore à un schéma spécifique m'a aidé à contourner ce bogue. Voir https://stackoverflow.com/a/11776053/11819

8
nfelger

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.

5
Rene

Utilisez le -L flag avec pg_restore après avoir effectué un vidage dans un format de fichier personnalisé.

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

Restaurez uniquement les éléments d'archive répertoriés dans list-file, et restaurez-les dans l'ordre dans lequel ils apparaissent dans le fichier. Notez que si le filtrage change comme -n ou -t sont utilisés avec -L, ils limiteront davantage les éléments restaurés.

list-file est normalement créé en éditant la sortie d'un précédent -l opération. Les lignes peuvent être déplacées ou supprimées et peuvent également être mises en commentaire 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
--
2
Ligemer

Pour exporter uniquement le schéma sans aucun autre objet de la base de données, vous pouvez spécifier le nom du schéma en utilisant le paramètre --schema

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