如何在PostgreSQL中复制数据库?


17

我需要将现有数据库(包括其架构和结构)复制到另一个新数据库。我在shell命令环境而不是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

Answers:


36

如果您想在同一PostgreSQL安装中复制它,并且没有活跃的用户连接,则有一个方便的快捷方式:

CREATE DATABASE my_new_database TEMPLATE my_old_database;

或从外壳

createdb -T my_old_database my_new_database;

否则,你就需要使用pg_dumpcreatedb并且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
辉煌!它不仅是复制结构,而且还有数据!
福田

@Foton Yep,尽管可以使用,pg_dump并且pg_restore如果您想更具选择性并仅转储(说)结构。
Craig Ringer

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();
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.