114 votes

Création d'un vidage de base de données pour des tables et des entrées spécifiques Postgres

J'ai une base de données avec des centaines de tables, ce que je dois faire est d'exporter les tables spécifiées et les instructions d'insertion pour les données dans un fichier sql.

La seule déclaration qui, à ma connaissance, permet d'atteindre cet objectif est

pg_dump -D -a -t zones_seq interway > /tmp/zones_seq.sql

Dois-je exécuter cette instruction pour chaque table ou existe-t-il un moyen d'exécuter une instruction similaire pour exporter toutes les tables sélectionnées dans un grand fichier sql ? Le pg_dump ci-dessus n'exporte pas le schéma de la table mais seulement les insertions, j'ai besoin des deux.

Toute aide sera appréciée.

193voto

a_horse_with_no_name Points 100769

Dès le début de la manuel : " Plusieurs tables peuvent être sélectionnées en écrivant plusieurs interrupteurs -t "

Vous devez donc lister toutes vos tables

pg_dump --column-inserts -a -t zones_seq -t interway -t table_3 ... > /tmp/zones_seq.sql  

Notez que si vous avez plusieurs tables avec le même préfixe (ou suffixe), vous pouvez également utiliser des jokers pour les sélectionner avec la fonction -t paramètre :

" De plus, le paramètre table est interprété comme un motif selon les mêmes règles que celles utilisées par le paramètre psql \d commandes "

28 votes

Le commutateur -T est identique, mais il est utilisé pour exclure des tables. Cela peut être utile si vous avez besoin de toutes les tables sauf une ou deux, etc.

4 votes

En -D semble avoir disparu à partir de la version 9.1 de PG.

5 votes

En -D L'option était supprimé dans la version 8.4 . Vous devez utiliser --column-inserts maintenant à la place.

26voto

Jothikanth Points 351

Si ces tables spécifiques correspondent à une regex particulière, vous pouvez utiliser la regex dans l'option -t de pg_dump.

pg_dump -D -a -t zones_seq -t interway -t "<regex>" -f /tmp/zones_seq.sql <DBNAME>

Par exemple pour vider les tables qui commencent par "test", vous pouvez utiliser

pg_dump -D -a -t zones_seq -t interway -t "^test*" -f /tmp/zones_seq.sql <DBNAME>

3 votes

Si c'était une regex, ça ne devrait pas être ^test.* au lieu de ^test* ?

5 votes

Ce n'est pas une regex, elle utilise les "patterns" de postgres, donc elle devrait être en réalité "test*" : postgresql.org/docs/current/app-psql.html#APP-PSQL-PATTERNS

0 votes

L'utilisation de regex n'est pas triviale, car elle permet de générer expression régulière invalide : opérande quantificateur invalide erreur. Mais l'expression régulière est correcte... Seules les expressions régulières très simples sont valides

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X