Estou procurando copiar um banco de dados PostgreSQL de produção para um servidor de desenvolvimento. Qual é a maneira mais rápida e fácil de fazer isso?
Estou procurando copiar um banco de dados PostgreSQL de produção para um servidor de desenvolvimento. Qual é a maneira mais rápida e fácil de fazer isso?
Respostas:
Você não precisa criar um arquivo intermediário. Você pode fazer
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
usando psql
ou pg_dump
para conectar-se a um host remoto.
Com um grande banco de dados ou uma conexão lenta, despejar um arquivo e transferir o arquivo compactado pode ser mais rápido.
Como Kornel disse que não há necessidade de despejar em um arquivo intermediário, se você quiser trabalhar compactado, poderá usar um túnel compactado
pg_dump -C dbname | bzip2 | ssh remoteuser@remotehost "bunzip2 | psql dbname"
ou
pg_dump -C dbname | ssh -C remoteuser@remotehost "psql dbname"
mas essa solução também requer uma sessão nos dois extremos.
Nota: pg_dump
é para fazer backup e psql
para restaurar. Portanto, o primeiro comando nesta resposta é copiar do local para o remoto e o segundo é do remoto para o local . Mais -> 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
Em seguida, copie o backup para o servidor de desenvolvimento, restaure com:
psql the_new_dev_db < the_backup.sql
Use pg_dump e, posteriormente, psql ou pg_restore - dependendo se você escolhe as opções -Fp ou -Fc para pg_dump.
Exemplo 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
Se você deseja migrar entre versões (por exemplo, atualizou o postgres e possui 9.1 em execução no localhost: 5432 e 9.3 em execução no localhost: 5434), é possível executar:
pg_dumpall -p 5432 -U myuser91 | psql -U myuser94 -d postgres -p 5434
Confira os documentos de migração .
pg_basebackup
parece ser a melhor maneira de fazer isso agora, especialmente para grandes bancos de dados.
Você pode copiar um banco de dados de um servidor com a mesma versão principal ou mais antiga. Ou, mais precisamente :
pg_basebackup
funciona com servidores da mesma ou de uma versão principal mais antiga, até a 9.1. No entanto, o modo de streaming WAL (-X stream
) funciona apenas com a versão 9.3 do servidor e posterior, e o modo de formato tar (--format=tar
) da versão atual funciona apenas com a versão 9.5 ou posterior do servidor.
Para isso, você precisa no servidor de origem:
listen_addresses = '*'
para se conectar a partir do servidor de destino. Verifique se a porta 5432 está aberta para esse assunto.max_wal_senders = 1
( -X fetch
), 2
para -X stream
(o padrão no caso do PostgreSQL 12) ou mais.wal_level = replica
ou superior para poder definir max_wal_senders > 0
.host replication postgres DST_IP/32 trust
no pg_hba.conf
. Isso concede acesso ao pg
cluster a qualquer pessoa da DST_IP
máquina. Você pode querer recorrer a uma opção mais segura.As alterações 1, 2, 3 requerem reinicialização do servidor, a alteração 4 requer recarga.
No 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
Execute este comando com o nome do banco de dados, que você deseja fazer backup, para obter o despejo de banco de dados.
pg_dump -U {user-name} {source_db} -f {dumpfilename.sql}
eg. pg_dump -U postgres mydbname -f mydbnamedump.sql
Agora scp este arquivo de despejo para a máquina remota onde você deseja copiar o banco de dados.
eg. scp mydbnamedump.sql user01@remotemachineip:~/some/folder/
Na máquina remota, execute o seguinte comando na pasta ~ / some / para restaurar o banco de dados.
psql -U {user-name} -d {desintation_db}-f {dumpfilename.sql}
eg. psql -U postgres -d mynewdb -f mydbnamedump.sql
Eu lutei bastante e, eventualmente, o método que me permitiu fazê-lo funcionar com o Rails 4 foi:
no seu servidor antigo
sudo su - postgres
pg_dump -c --inserts old_db_name > dump.sql
Eu tive que usar o usuário do postgres linux para criar o despejo. Também tive que usar -c para forçar a criação do banco de dados no novo servidor. --inserts diz para ele usar a sintaxe INSERT () que, de outra forma, não funcionaria para mim :(
então, no novo servidor, simpy:
sudo su - postgres
psql new_database_name < dump.sql
para transferir o arquivo dump.sql entre o servidor, simplesmente usei o "gato" para imprimir o conteúdo e depois o "nano" para recriá-lo copiando o conteúdo.
Além disso, o ROLE que eu estava usando no banco de dados dois era diferente, então tive que encontrar e substituir todo o nome do proprietário no despejo.
Despejar seu banco de dados: pg_dump database_name_name > backup.sql
Importe seu banco de dados de volta: psql db_name < backup.sql
Deixe-me compartilhar um script de shell do Linux para copiar os dados da tabela de um servidor para outro servidor PostgreSQL.
Referência retirada deste blog:
Script Linux Bash Shell para migração de dados 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"
Estou apenas migrando os dados; crie uma tabela em branco no seu servidor de destino / segundo banco de dados.
Este é um script utilitário. Além disso, você pode modificar o script para uso genérico, como adicionar parâmetros para host_name, database_name, table_name e outros
A resposta aceita está correta, mas se você quiser evitar digitar a senha interativamente, pode usar o seguinte:
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}}