569 votes

Copie de la base de données PostgreSQL sur un autre serveur

Je cherche à copier une base de données PostgreSQL de production sur un serveur de développement. Quel est le moyen le plus rapide et le plus simple d'y parvenir ?

786voto

Ferran Points 3353

Vous n'avez pas besoin de créer un fichier intermédiaire. Vous pouvez faire

pg_dump -C -h localhost -U localuser dbname | psql -h remotehost -U remoteuser dbname

ou

pg_dump -C -h remotehost -U remoteuser dbname | psql -h localhost -U localuser dbname

en utilisant psql ou pg_dump pour se connecter à un hôte distant.

Avec une grande base de données ou une connexion lente, le vidage d'un fichier et le transfert du fichier compressé peuvent être plus rapides.

Comme Kornel l'a dit, il n'est pas nécessaire d'effectuer un dumping vers un fichier intermédiaire. Si vous voulez travailler en mode compressé, vous pouvez utiliser un tunnel compressé.

pg_dump -C dbname | bzip2 | ssh  remoteuser@remotehost "bunzip2 | psql dbname"

ou

pg_dump -C dbname | ssh -C remoteuser@remotehost "psql dbname"

mais cette solution nécessite également d'obtenir une session aux deux extrémités.

Note : pg_dump sert à sauvegarder et psql est pour la restauration. Ainsi, le La première commande dans cette réponse est pour copier de local à distant et la seconde est de distant à local. . Plus -> https://www.postgresql.org/docs/9.6/app-pgdump.html

32 votes

Il n'y a pas besoin de fichiers intermédiaires - vous pouvez utiliser le tunnel SSH compressé ou simplement le pipe : pg_dump | bzip2 | ssh "bunzip2 | pg_restore"

4 votes

Si vous utilisez bzip2, désactivez la compression ssh pour accélérer le transfert !

1 votes

La compression est déjà désactivée par défaut dans la commande ssh. Dans l'exemple, lorsque j'utilise la compression ssh, je n'utilise pas bzip2 et lorsque j'utilise bzip2, je n'utilise pas la compression ssh.

157voto

unmounted Points 10968
pg_dump the_db_name > the_backup.sql

Ensuite, copiez la sauvegarde sur votre serveur de développement, restaurez avec :

psql the_new_dev_db < the_backup.sql

4 votes

Quelqu'un m'a dit que cela pouvait être problématique - des problèmes de permissions provoquant la mort du dump ou de la restauration lorsqu'il atteint un déclencheur ?

25 votes

@rmbarnes : S'il y a des problèmes, ils doivent être résolus. Sans connaissance détaillée de ce que ce "Quelqu'un" a fait, personne ne peut confirmer ou infirmer cette affirmation.

5 votes

Utilisez l'option --no-owner avec pg_dump. Cela permet de contourner le problème et la première édition de ce post l'utilisait -- mais j'ai ensuite pensé que vous auriez besoin d'une fidélité plus précise à la base de données originale.

40voto

Utilisez pg_dump et plus tard psql ou pg_restore - selon que vous choisissez les options -Fp ou -Fc de pg_dump.

Exemple d'utilisation :

ssh production
pg_dump -C -Fp -f dump.sql -U postgres some_database_name
scp dump.sql development:
rm dump.sql
ssh development
psql -U postgres -f dump.sql

24voto

Eric H. Points 1203

Si vous cherchez à migrer d'une version à l'autre (par exemple, vous avez mis à jour postgres et vous avez la 9.1 qui tourne sur localhost:5432 et la 9.3 sur localhost:5434), vous pouvez exécuter :

pg_dumpall -p 5432 -U myuser91 | psql -U myuser94 -d postgres -p 5434

Consultez le documents sur la migration .

23voto

pg_basebackup semble être la meilleure façon de procéder maintenant, surtout pour les grandes bases de données.

Vous pouvez copier une base de données à partir d'un serveur dont la version majeure est identique ou antérieure. Ou bien plus précisément :

pg_basebackup fonctionne avec des serveurs de la même version majeure ou d'une version antérieure, jusqu'à la 9.1. Cependant, le mode streaming de WAL ( -X stream ) ne fonctionne qu'avec la version 9.3 ou ultérieure du serveur, et le mode de formatage tar ( --format=tar ) de la version actuelle ne fonctionne qu'avec la version 9.5 ou ultérieure du serveur.

Pour cela, vous avez besoin du serveur source :

  1. listen_addresses = '*' pour pouvoir se connecter depuis le serveur cible. Assurez-vous que le port 5432 est ouvert à cet effet.
  2. Au moins une connexion de réplication disponible : max_wal_senders = 1 ( -X fetch ), 2 pour -X stream (la valeur par défaut dans le cas de PostgreSQL 12), ou plus.
  3. wal_level = replica ou plus pour pouvoir définir max_wal_senders > 0 .
  4. host replication postgres DST_IP/32 trust sur pg_hba.conf . Cela permet d'accéder à la pg à toute personne du DST_IP machine. Vous pourriez vouloir recourir à une option plus sûre.

Les changements 1, 2, 3 nécessitent un redémarrage du serveur, le changement 4 nécessite un rechargement.

Sur le serveur cible :

# systemctl stop postgresql@VERSION-NAME
postgres$ pg_basebackup -h SRC_IP -U postgres -D VERSION/NAME --progress
# systemctl start postgresql@VERSION-NAME

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