Copiando la base de datos PostgreSQL a otro servidor

492

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?

Robin Barnes
fuente

Respuestas:

668

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 psqlo pg_dumppara 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 psqlpara 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

Ferran
fuente
28
No hay necesidad de archivos intermedios; puede usar un túnel SSH comprimido o simplemente canalizar: pg_dump | bzip2 | ssh "bunzip2 | pg_restore"
Kornel
44
Si usa bzip2, desactive la compresión ssh para acelerar la transferencia.
lzap
8
¿Cómo puedo trabajar comprimido si extraigo datos de la producción al desarrollo? He configurado una conexión SSH desde el desarrollo hasta la producción. ¿Entonces sería ssh remoteuser@remotehost "pg_dump -C dbname | bzip2" | bunzip2 | psql dbname?
Jeromy French
2
Espero que pueda copiar una base de datos remota con nombre x a una base de datos local con nombre y, pero la solución de @ Ferran no funciona para esto ... Me parece que la solución de porneL solo deja los archivos bzip2 en el servidor, así que no es un proceso de un solo paso. Siendo este el caso, supongo que descartaré la base de datos y, usaré la parte "o" de la solución de Ferran que restaura x, luego cambiaré el nombre de la base de datos a y.
Darin Peterson
3
Esto es lo que hice: (1) pg_dump -C -h remotehost -U remoteuser x | psql -h localhost -U localuser (2) dropdb y (3) psql -U postgres -c 'ALTER DATABASE "x" RENAME TO "y"'
Darin Peterson
131
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
desmontado
fuente
3
Alguien me dijo que esto puede ser problemático: ¿problemas de permisos que causan que el volcado o la restauración mueran cuando golpea un gatillo?
Robin Barnes
17
@rmbarnes: si hay problemas, hay que solucionarlos. Sin un conocimiento detallado de lo que hizo este "Alguien", nadie puede confirmar ni desestimar este reclamo.
44
Use la bandera --no-owner con pg_dump. Esto omite el problema y la primera edición de esta publicación lo usó, pero luego pensé que podría necesitar una fidelidad más precisa a la base de datos original.
desmontado el
44
Para mí, el enfoque anterior funcionó de la siguiente manera: pg_dump -C -h host -U username db_name> / any_directory / dump_schema_and_data_file. Y para restaurar desde el archivo: psql -h host -U username db_name <dump_schema_and_data_file
Ali Raza Bhayani
Eso me ahorró MUCHA molestia. Utilicé Google Drive para mover el archivo entre máquinas. Como ya tenía la base de datos en la nueva máquina (pero en blanco), recibí MUCHOS errores de claves duplicadas. Sin embargo, es un entorno de desarrollo y no hicieron daño a nada.
Chris Mendla
37

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

fuente
22

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 .

Eric H.
fuente
Me piden la contraseña (myuser91 / postgres) varias veces, ¿hay alguna manera de que deba ingresar la contraseña solo una vez?
Martin Weber
@MartinWeber Cree un archivo pgpass según este documento postgresql.org/docs/9.4/static/libpq-pgpass.html
Scott Warren
¿Qué pasa si tienen los dos puertos?
ggnoredo
Si están en servidores diferentes, puede usar -h para especificar los hosts.
Haroldo_OK
16

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_basebackupfunciona 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:

  1. listen_addresses = '*'para poder conectarse desde el servidor de destino. Asegúrese de que el puerto 5432 esté abierto para el caso.
  2. Al menos 1 conexión de replicación disponible: max_wal_senders = 1( -X fetch), 2para -X stream(el valor predeterminado en el caso de PostgreSQL 12), o más.
  3. wal_level = replicao superior para poder configurar max_wal_senders > 0.
  4. host replication postgres DST_IP/32 trusten pg_hba.conf. Esto otorga acceso al pgclúster a cualquier persona desde la DST_IPmá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
Reshad user2701173
fuente
11
¿Podría proporcionar más detalles en su respuesta, como un ejemplo?
Magnilex
77
Sin embargo, esto solo funciona cuando ambas máquinas tienen las mismas versiones PG.
sm
Hay pocas posibilidades de que use una versión de base de datos diferente para el desarrollo y la producción. La última vez tuve una conversación desagradable con una de mis compañeras de equipo, ya que estaba tratando de enviar un problema de que algún código no funcionaba con PG 9.6 mientras que en ese momento habíamos usado 9.5 en producción. El respaldo base es mucho más rápido. Entonces pg_upgrade es el camino a seguir si es necesario.
Zorg
2
Lo más probable es que desee migrar a una versión más nueva y no desee detener PostgreSQL.
x-yuri
1
Lo más probable es que cada vez que actualice su base de datos, la actualice en desarrollo y puesta en escena antes de hacerlo en producción.
Andrew lorien
8

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
usuario01
fuente
7

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.

pastullo
fuente
6

Volcar su base de datos: pg_dump database_name_name > backup.sql


Importa tu base de datos de nuevo: psql db_name < backup.sql

MisterJoyson
fuente
5

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

Anvesh
fuente
5

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}}
zoran
fuente