433 votes

Copier une table d'une base de données à une autre dans Postgres

J'essaie de copier une table entière d'une base de données à une autre dans Postgres. Avez-vous des suggestions ?

10 votes

Si vous êtes d'accord pour installer DBeaver, il a un moyen très simple de transférer entre deux bases de données auxquelles vous êtes connecté. Il suffit de cliquer avec le bouton droit de la souris sur la table source et de sélectionner Exporter les données, cibler une ou plusieurs tables de la base de données et définir la cible comme base de données de destination.

1 votes

@rovyko J'essaie de faire la même chose dans DBeaver mais en utilisant du sql dynamique. Faites-moi savoir si vous savez comment faire.

483voto

thomax Points 1895

Extraire la table et l'acheminer directement vers la base de données cible :

pg_dump -t table_to_copy source_db | psql target_db

9 votes

Comment cela fonctionnera-t-il pour les liens vers des bases de données distantes ? Par exemple, j'ai besoin de faire un dumping à partir d'un autre endroit.

29 votes

@curlyreggie Je n'ai pas essayé, mais je ne vois pas pourquoi cela ne fonctionnerait pas. Essayez d'ajouter les spécificités de l'utilisateur et du serveur à la commande, comme ceci pg_dump -U remote_user -h remote_server -t table_to_copy source_db | psql target_db

5 votes

Vous pouvez essayer ceci : "pg_dump -U remote_user -h remote_server -t table_to_copy source_db | psql target_db -U remote_user -h remote_server "

165voto

a2ron44 Points 177

Vous pouvez également utiliser la fonctionnalité de sauvegarde dans pgAdmin II. Il suffit de suivre les étapes suivantes :

  • Dans pgAdmin, cliquez avec le bouton droit de la souris sur la table que vous souhaitez déplacer, puis sélectionnez "Sauvegarde".
  • Choisissez le répertoire pour le fichier de sortie et définissez le format à "plain".
  • Cliquez sur l'onglet "Dump Options #1", cochez "Only data" ou "only Schema" (en fonction de ce que vous faites)
  • Sous la section Requêtes, cliquez sur "Utiliser les insertions de colonnes" et "Commandes d'insertion de l'utilisateur".
  • Cliquez sur le bouton "Backup". Cela donne un fichier de sauvegarde.
  • Ouvrez ce nouveau fichier en utilisant le bloc-notes. Vous verrez les scripts d'insertion nécessaires pour la table/donnée. Copiez et collez-les dans la page sql de la nouvelle base de données dans pgAdmin. Exécuter comme pgScript - Requête->Exécuter comme pgScript F6

Fonctionne bien et peut faire plusieurs tables à la fois.

4 votes

Il s'agit d'une bonne solution basée sur une interface graphique pour déplacer des données entre des bases de données. Merci !

3 votes

Vous pouvez sélectionner plusieurs tableaux sous l'onglet Objects section. Sous OSX, cliquez sur le bouton SQL ou obtenez le bouton SQL Editor via le Tools pour coller le SQL copié depuis le fichier de sauvegarde.

0 votes

Fonctionne, merci. Mais c'est très lent sur les grandes tables. Y a-t-il une meilleure façon de faire pour accélérer le processus ? (comme ignorer les clés étrangères ou autre chose ?)

124voto

tinychen Points 636

Utiliser dblink serait plus pratique !

truncate table tableA;

insert into tableA
select *
from dblink('dbname=postgres hostaddr=xxx.xxx.xxx.xxx dbname=mydb user=postgres',
            'select a,b from tableA')
       as t1(a text,b text);

15 votes

Pourquoi deux dbname en deux fois ? lequel est source et cible ?

2 votes

La table A que nous insérons est la destination, et la table A dans le dbLink est la source.

3 votes

Si je veux utiliser dblink bun je ne connais pas la structure de la table de la source ?

48voto

Alexey Sviridov Points 1381

En utilisant psql, sur un hôte linux qui a une connectivité avec les deux serveurs.

( PGPASSWORD=password1 
  psql -U user1 -h host1 database1 \
  -c "copy (select field1,field2 from table1) to stdout with csv" ) \
| 
( PGPASSWORD=password2 
  psql -U user2 -h host2 database2 \ 
   -c "copy table2 (field1, field2) from stdin csv" )

2 votes

Pas besoin d'exportation, PGPASSWORD=password1 psql -U ... alors vous n'avez même pas besoin de sous-coquilles explicites ! D'habitude, vous devez d'abord faire deux ou trois choses pour vous installer, donc les sous-shells peuvent être nécessaires de toute façon. De plus, les mots de passe ne seront pas exportés dans les processus suivants. Merci !

1 votes

@LimitedAtonement En fait, vous avez raison, l'exportation et les sous-shells ne sont pas nécessaires. C'est juste une partie d'un script plus compliqué, et même moi je n'ai pas essayé sans export et subshells, donc, je l'ai fourni tel quel seulement pour être honnête et fournir une solution qui fonctionne.

3 votes

La table doit exister dans la BD de destination. Pour la créer, essayez pg_dump -t '<table_name>' --schema-only

15voto

Pablo Santa Cruz Points 73944

Utilisez pg_dump pour vider les données de la table, puis restaurez-les avec psql.

2 votes

Ensuite, utilisez un autre rôle de base de données pour vous connecter, un rôle qui a suffisamment de permissions. postgresql.org/docs/8.4/static/app-pgdump.html

0 votes

Qu'est-ce que je fais mal ? pg_dump -t "tablename" dbName --role "postgres" > db.sql "postgres" serait l'utilisateur auquel j'essaie de donner le rôle. Cela me donne toujours "Access is denied".

0 votes

Avez-vous les droits d'écriture sur le fichier db.sql ?

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