Como duplicar o banco de dados no postgresql?

17

Preciso duplicar o banco de dados existente, incluindo seu esquema e estrutura para outro novo banco de dados. Eu preciso disso no ambiente de comando do shell e não no pgadmin. Por favor, me ajude.

nohup pg_dump exampledb > example-01.sql
createdb -O postgres exampledbclone_01

meu usuário é "postgres"

nohup psql exampledbclone_01 < example-01.sql
$ pg_dump mydb > db.sql
$ psql -d newdb -f db.sql
Karunya Suresh
fonte

Respostas:

33

Se você deseja duplicá-lo na mesma instalação do PostgreSQL e não possui usuários conectados ativamente, existe um atalho útil:

CREATE DATABASE my_new_database TEMPLATE my_old_database;

ou a partir da casca

createdb -T my_old_database my_new_database;

Caso contrário, você vai precisar usar pg_dump, createdbe pg_restore, por exemplo,

pg_dump -Fc -f olddb.pgdump -d olddb &&\
createdb newdb &&\
pg_restore -d newdb olddb.pgdump

Se você estiver usando nohuppara que o comando não morra se você perder sua sessão ssh, considere usar screen.

Craig Ringer
fonte
1
ImpressionanteCREATE DATABASE my_new_database TEMPLATE my_old_database;
anjaneyulubatta505
1
Brilhante! Não apenas copia a estrutura, mas também dados!
Foton
@Foton Sim, embora você possa usar pg_dumpe pg_restorese quiser ser mais seletivo e despejar (digamos) apenas a estrutura.
Craig Ringer
0

O Postgres permite o uso de qualquer banco de dados existente no servidor como modelo ao criar um novo banco de dados. Não tenho certeza se o pgAdmin oferece a opção na caixa de diálogo criar banco de dados, mas você poderá executar o seguinte em uma janela de consulta, se isso não acontecer:

CREATE DATABASE newdb WITH TEMPLATE originaldb OWNER dbuser;

Ainda assim, você pode obter:

ERRO: o banco de dados de origem "originaldb" está sendo acessado por outros usuários

Para desconectar todos os outros usuários do banco de dados, você pode usar esta consulta:

SELECT pg_terminate_backend(pg_stat_activity.pid) FROM pg_stat_activity 
WHERE pg_stat_activity.datname = 'originaldb' AND pid <> pg_backend_pid();
user200679
fonte