Как продублировать базу данных в postgresql?

17

Мне нужно дублировать существующую базу данных, включая ее схему и структуру, в другую новую базу данных. Мне это нужно в командной оболочке, а не в pgadmin. Пожалуйста, помогите мне.

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

мой пользователь "postgres"

nohup psql exampledbclone_01 < example-01.sql
$ pg_dump mydb > db.sql
$ psql -d newdb -f db.sql
Каруня Суреш
источник

Ответы:

33

Если вы хотите продублировать его в одной и той же установке PostgreSQL, и у вас нет активно подключенных пользователей, есть удобный ярлык:

CREATE DATABASE my_new_database TEMPLATE my_old_database;

или из скорлупы

createdb -T my_old_database my_new_database;

В противном случае вам нужно будет использовать pg_dump, createdbи pg_restore, например,

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

Если вы используете, nohupчтобы команда не умерла, если вы потеряли сеанс ssh, рассмотрите возможность использования screenвместо этого.

Крейг Рингер
источник
1
ВеликолепноCREATE DATABASE my_new_database TEMPLATE my_old_database;
anjaneyulubatta505
1
Brilliant! Это не просто структура копирования, но и данные!
Фотон
@Foton Да, хотя вы можете использовать, pg_dumpи pg_restoreесли вы хотите быть более избирательным и сбросить (скажем) только структуру.
Крейг Рингер
0

Postgres позволяет использовать любую существующую базу данных на сервере в качестве шаблона при создании новой базы данных. Я не уверен, дает ли pgAdmin опцию в диалоговом окне создания базы данных, но вы должны иметь возможность выполнить следующее в окне запроса, если это не так:

CREATE DATABASE newdb WITH TEMPLATE originaldb OWNER dbuser;

Тем не менее, вы можете получить:

ОШИБКА: к исходной базе данных "originaldb" обращаются другие пользователи

Чтобы отключить всех других пользователей от базы данных, вы можете использовать этот запрос:

SELECT pg_terminate_backend(pg_stat_activity.pid) FROM pg_stat_activity 
WHERE pg_stat_activity.datname = 'originaldb' AND pid <> pg_backend_pid();
user200679
источник