Je cherche à copier une base de données PostgreSQL de production sur un serveur de développement. Quelle est la manière la plus rapide et la plus simple de procéder?
Je cherche à copier une base de données PostgreSQL de production sur un serveur de développement. Quelle est la manière la plus rapide et la plus simple de procéder?
Réponses:
Vous n'avez pas besoin de créer un fichier intermédiaire. Tu peux 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 vous 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 de vider dans un fichier intermédiaire, si vous voulez travailler 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.
Remarque: pg_dump
sert à la sauvegarde et psql
à la restauration. Ainsi, la première commande de cette réponse consiste à copier du local vers le distant et la seconde de la distance vers le local . Plus -> https://www.postgresql.org/docs/9.6/app-pgdump.html
ssh remoteuser@remotehost "pg_dump -C dbname | bzip2" | bunzip2 | psql dbname
?
pg_dump the_db_name > the_backup.sql
Copiez ensuite la sauvegarde sur votre serveur de développement, restaurez avec:
psql the_new_dev_db < the_backup.sql
Utilisez pg_dump et plus tard psql ou pg_restore - selon que vous choisissez les options -Fp ou -Fc pour 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
Si vous cherchez à migrer entre les versions (par exemple, vous avez mis à jour postgres et que 9.1 s'exécute sur localhost: 5432 et 9.3 s'exécute sur localhost: 5434), vous pouvez exécuter:
pg_dumpall -p 5432 -U myuser91 | psql -U myuser94 -d postgres -p 5434
Consultez les documents de migration .
pg_basebackup
semble être la meilleure façon de le faire maintenant, en particulier pour les grandes bases de données.
Vous pouvez copier une base de données à partir d'un serveur avec la même version principale ou une version plus ancienne. Ou plus précisément :
pg_basebackup
fonctionne avec des serveurs de la même version ou d'une version majeure antérieure, jusqu'à 9.1. Cependant, le mode de streaming WAL (-X stream
) ne fonctionne qu'avec la version 9.3 et ultérieure du serveur et le mode de format 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 sur le serveur source:
listen_addresses = '*'
pour pouvoir se connecter depuis le serveur cible. Assurez-vous que le port 5432 est ouvert d'ailleurs.max_wal_senders = 1
( -X fetch
), 2
pour -X stream
(la valeur par défaut dans le cas de PostgreSQL 12), ou plus.wal_level = replica
ou supérieur pour pouvoir régler max_wal_senders > 0
.host replication postgres DST_IP/32 trust
dans pg_hba.conf
. Cela accorde l'accès au pg
cluster à toute personne de la DST_IP
machine. Vous voudrez peut-être recourir à une option plus sécurisée.Les modifications 1, 2, 3 nécessitent un redémarrage du serveur, la modification 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
Exécutez cette commande avec le nom de la base de données, que vous souhaitez sauvegarder, pour effectuer un vidage de la base de données.
pg_dump -U {user-name} {source_db} -f {dumpfilename.sql}
eg. pg_dump -U postgres mydbname -f mydbnamedump.sql
Scp maintenant ce fichier de vidage sur la machine distante où vous souhaitez copier la base de données.
eg. scp mydbnamedump.sql user01@remotemachineip:~/some/folder/
Sur une machine distante, exécutez la commande suivante dans le dossier ~ / certains / pour restaurer la base de données.
psql -U {user-name} -d {desintation_db}-f {dumpfilename.sql}
eg. psql -U postgres -d mynewdb -f mydbnamedump.sql
J'ai eu beaucoup de mal et finalement la méthode qui m'a permis de le faire fonctionner avec Rails 4 était:
sur votre ancien serveur
sudo su - postgres
pg_dump -c --inserts old_db_name > dump.sql
J'ai dû utiliser l'utilisateur linux postgres pour créer le vidage. J'ai également dû utiliser -c pour forcer la création de la base de données sur le nouveau serveur. --inserts lui dit d'utiliser la syntaxe INSERT () qui autrement ne fonctionnerait pas pour moi :(
puis, sur le nouveau serveur, simpy:
sudo su - postgres
psql new_database_name < dump.sql
pour transférer le fichier dump.sql entre les serveurs, j'ai simplement utilisé le "chat" pour imprimer le contenu et que "nano" pour le recréer en copypastant le contenu.
De plus, le RÔLE que j'utilisais sur les deux bases de données était différent, donc j'ai dû trouver-remplacer tout le nom du propriétaire dans le vidage.
Videz votre base de données: pg_dump database_name_name > backup.sql
Réimportez votre base de données: psql db_name < backup.sql
Permettez-moi de partager un script shell Linux pour copier vos données de table d'un serveur vers un autre serveur PostgreSQL.
Script Bash Shell Linux pour la migration des données entre les serveurs PostgreSQL:
#!/bin/bash
psql \
-X \
-U user_name \
-h host_name1 \
-d database_name \
-c "\\copy tbl_Students to stdout" \
| \
psql \
-X \
-U user_name \
-h host_name2 \
-d database_name \
-c "\\copy tbl_Students from stdin"
Je ne fais que migrer les données; veuillez créer un tableau vierge sur votre serveur de base de données de destination / deuxième.
Il s'agit d'un script utilitaire. De plus, vous pouvez modifier le script pour une utilisation générique comme en ajoutant des paramètres pour host_name, database_name, table_name et autres
La réponse acceptée est correcte, mais si vous souhaitez éviter de saisir le mot de passe de manière interactive, vous pouvez utiliser ceci:
PGPASSWORD={{export_db_password}} pg_dump --create -h {{export_db_host}} -U {{export_db_user}} {{export_db_name}} | PGPASSWORD={{import_db_password}} psql -h {{import_db_host}} -U {{import_db_user}} {{import_db_name}}