Estoy buscando copiar una base de datos PostgreSQL de producción en un servidor de desarrollo. ¿Cuál es la forma más rápida y fácil de hacer esto?
Estoy buscando copiar una base de datos PostgreSQL de producción en un servidor de desarrollo. ¿Cuál es la forma más rápida y fácil de hacer esto?
Respuestas:
No necesita crear un archivo intermedio. Tu puedes hacer
pg_dump -C -h localhost -U localuser dbname | psql -h remotehost -U remoteuser dbname
o
pg_dump -C -h remotehost -U remoteuser dbname | psql -h localhost -U localuser dbname
usando psql
o pg_dump
para conectarse a un host remoto.
Con una gran base de datos o una conexión lenta, descargar un archivo y transferir el archivo comprimido puede ser más rápido.
Como dijo Kornel, no hay necesidad de volcar a un archivo intermedio, si desea trabajar comprimido puede usar un túnel comprimido
pg_dump -C dbname | bzip2 | ssh remoteuser@remotehost "bunzip2 | psql dbname"
o
pg_dump -C dbname | ssh -C remoteuser@remotehost "psql dbname"
pero esta solución también requiere obtener una sesión en ambos extremos.
Nota: pg_dump
es para realizar copias de seguridad y psql
para restaurar. Entonces, el primer comando en esta respuesta es copiar de local a remoto y el segundo es de remoto a local . Más -> 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
Luego copie la copia de seguridad en su servidor de desarrollo, restaure con:
psql the_new_dev_db < the_backup.sql
Use pg_dump , y luego psql o pg_restore , dependiendo de si elige las opciones -Fp o -Fc para pg_dump.
Ejemplo de uso:
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 está buscando migrar entre versiones (por ejemplo, actualizó postgres y tiene 9.1 ejecutándose en localhost: 5432 y 9.3 ejecutándose en localhost: 5434) puede ejecutar:
pg_dumpall -p 5432 -U myuser91 | psql -U myuser94 -d postgres -p 5434
Echa un vistazo a los documentos de migración .
pg_basebackup
Parece ser la mejor manera de hacerlo ahora, especialmente para grandes bases de datos.
Puede copiar una base de datos de un servidor con la misma versión principal o anterior. O más precisamente :
pg_basebackup
funciona con servidores de la misma versión principal o anterior, hasta la versión 9.1. Sin embargo, el modo de transmisión WAL (-X stream
) solo funciona con la versión del servidor 9.3 y posterior, y el modo de formato tar (--format=tar
) de la versión actual solo funciona con la versión del servidor 9.5 o posterior.
Para eso necesitas en el servidor de origen:
listen_addresses = '*'
para poder conectarse desde el servidor de destino. Asegúrese de que el puerto 5432 esté abierto para el caso.max_wal_senders = 1
( -X fetch
), 2
para -X stream
(el valor predeterminado en el caso de PostgreSQL 12), o más.wal_level = replica
o superior para poder configurar max_wal_senders > 0
.host replication postgres DST_IP/32 trust
en pg_hba.conf
. Esto otorga acceso al pg
clúster a cualquier persona desde la DST_IP
máquina. Es posible que desee recurrir a una opción más segura.Los cambios 1, 2, 3 requieren reinicio del servidor, el cambio 4 requiere recarga.
En el servidor de destino:
# systemctl stop postgresql@VERSION-NAME
postgres$ pg_basebackup -h SRC_IP -U postgres -D VERSION/NAME --progress
# systemctl start postgresql@VERSION-NAME
Ejecute este comando con el nombre de la base de datos, desea realizar una copia de seguridad, para volcar la base de datos.
pg_dump -U {user-name} {source_db} -f {dumpfilename.sql}
eg. pg_dump -U postgres mydbname -f mydbnamedump.sql
Ahora scp este archivo de volcado a la máquina remota donde desea copiar DB.
eg. scp mydbnamedump.sql user01@remotemachineip:~/some/folder/
En la máquina remota, ejecute el siguiente comando en la carpeta ~ / some / para restaurar la base de datos.
psql -U {user-name} -d {desintation_db}-f {dumpfilename.sql}
eg. psql -U postgres -d mynewdb -f mydbnamedump.sql
Luché bastante y, finalmente, el método que me permitió hacer que funcionara con Rails 4 fue:
en tu antiguo servidor
sudo su - postgres
pg_dump -c --inserts old_db_name > dump.sql
Tuve que usar el usuario de Linux postgres para crear el volcado. También tuve que usar -c para forzar la creación de la base de datos en el nuevo servidor. --inserts le dice que use la sintaxis INSERT () que de otra forma no funcionaría para mí :(
luego, en el nuevo servidor, simpy:
sudo su - postgres
psql new_database_name < dump.sql
para transferir el archivo dump.sql entre el servidor, simplemente utilicé "cat" para imprimir el contenido y luego "nano" para recrearlo copiando el contenido.
Además, el PAPEL que estaba usando en las dos bases de datos era diferente, así que tuve que buscar y reemplazar todo el nombre del propietario en el volcado.
Volcar su base de datos: pg_dump database_name_name > backup.sql
Importa tu base de datos de nuevo: psql db_name < backup.sql
Permítanme compartir un script de shell de Linux para copiar los datos de su tabla de un servidor a otro servidor PostgreSQL.
Referencia tomada de este blog:
Linux Bash Shell Script para la migración de datos entre servidores 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"
Solo estoy migrando los datos; cree una tabla en blanco en su servidor de base de datos de destino / segundo.
Este es un script de utilidad. Además, puede modificar el script para uso genérico, como agregar parámetros para host_name, database_name, table_name y otros
La respuesta aceptada es correcta, pero si desea evitar ingresar la contraseña de manera interactiva, puede usar esto:
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}}