2009-08-06 52 views

Respuesta

487

No es necesario para crear un archivo intermedio. Usted puede 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 base de datos grande o una conexión lenta, puede ser más rápido descargar un archivo y transferir el archivo comprimido.

Como Kornel dicho que no hay necesidad de volcar a un archivo intermedio, si usted quiere trabajar comprimido puede utilizar un túnel comprimido

pg_dump -C dbname | bzip2 | ssh [email protected] "bunzip2 | psql dbname" 

o

pg_dump -C dbname | ssh -C [email protected] "psql dbname" 

pero esta solución también requiere para obtener una sesión en ambos extremos.

+22

No hay necesidad de archivos intermedios - puede usar un túnel comprimido SSH o simplemente un tubo: pg_dump | bzip2 | ssh "bunzip2 | pg_restore" – Kornel

+2

Si usa bzip2, ¡apague la compresión ssh para acelerar la transferencia! – lzap

+0

El comando ssh ya tiene la compresión deshabilitada de manera predeterminada. En el ejemplo cuando uso compresión ssh, no estoy usando bzip2 y cuando uso bzip2 no estoy usando compresión ssh. – Ferran

97
pg_dump the_db_name > the_backup.sql 

luego copiar la copia de seguridad para el servidor de desarrollo, con una restauración:

psql the_new_dev_db < the_backup.sql 
+2

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 disparador ? –

+9

@rmbarnes: Si hay problemas, tienen que ser reparados. Sin un conocimiento detallado de lo que hizo este "Alguien", nadie puede confirmar ni desestimar este reclamo. –

+2

Usa el indicador --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. – unmounted

33

Uso pg_dump, y más tarde psql o pg_restore - dependiendo de si se elige o -fp opciones -Fc a 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 
2

I luchado mucho y, finalmente, el método que me permitió hacer que funcione con los carriles 4 fue:

en su antiguo servidor

sudo su - postgres 
pg_dump -c --inserts old_db_name > dump.sql 

tuve que usar el usuario postgres Linux para crear El vertedero. 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 otro modo no funcionaría para mí :(

a continuación, 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é el "gato" para imprimir el contenido y "nano" para recrearlo copiando el contenido.

Además, el ROL que estaba usando en las dos bases de datos era diferente, así que tuve que buscar-reemplazar a todo el propietario nombre en el volcado.

13

pg_basebackup parece ser th Es una mejor forma de hacerlo ahora, especialmente para grandes bases de datos.

+7

¿Podría proporcionar más detalles en su respuesta, como un ejemplo? – Magnilex

+4

Esto solo funciona cuando ambas máquinas tienen las mismas versiones de PG. –

+0

Es poco probable 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 uno de mis compañeros de equipo cuando estaba tratando de enviar un problema de que algunos códigos no funcionan con PG 9.6 mientras que nosotros usamos 9.5 en producción en ese momento. La copia de seguridad de base es mucho más rápida. Entonces pg_upgrade es el camino a seguir si es necesario. – Zorg

3

Ejecute este comando con el nombre de la base de datos, desea realizar una copia de seguridad, para realizar el volcado de 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 en la máquina remota donde desea copiar la base de datos.

eg. scp mydbnamedump.sql [email protected]:~/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 
16

Si usted está buscando para migrar entre versiones (por ejemplo informado postgres y ha 9.1 que se ejecuta en localhost: 5432 y 9.3 que se ejecuta en localhost: 5434) puede ejecutar:

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

Mira la migration docs.

+0

Me han preguntado varias veces (myuser91/postgres) -password, ¿hay alguna manera de que solo tenga que ingresar la contraseña una vez? –

+0

@MartinWeber Cree un archivo pgpass según este documento https://www.postgresql.org/docs/9.4/static/libpq-pgpass.html –

1

Déjame compartir un script de shell de Linux para copiar los datos de tu tabla de un servidor a otro servidor de PostgreSQL.

Reference taken from this 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" 

sólo estoy transfiriendo los datos; por favor, cree una tabla en blanco en su destino/segundo servidor de base de datos.

Este es un script de utilidad. Además, puede modificar la secuencia de comandos para uso genérico algo así como agregar parámetros para nombre_host, nombre_base_datos, nombre_tabla y otros

Cuestiones relacionadas