如何在postgresql中复制数据库?

Kar*_*esh 29 postgresql

我需要将现有数据库(包括其架构和结构)复制到另一个新数据库。我在 shell 命令环境中需要这个,而不是在 pgadmin 中。请帮助我。

nohup pg_dump exampledb > example-01.sql
createdb -O postgres exampledbclone_01
Run Code Online (Sandbox Code Playgroud)

我的用户是“postgres”

nohup psql exampledbclone_01 < example-01.sql
Run Code Online (Sandbox Code Playgroud)
$ pg_dump mydb > db.sql
$ psql -d newdb -f db.sql
Run Code Online (Sandbox Code Playgroud)

Cra*_*ger 56

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

CREATE DATABASE my_new_database TEMPLATE my_old_database;
Run Code Online (Sandbox Code Playgroud)

或从外壳

createdb -T my_old_database my_new_database;
Run Code Online (Sandbox Code Playgroud)

否则,您将需要使用pg_dump,createdbpg_restore,例如

pg_dump -Fc -f olddb.pgdump -d olddb &&\
createdb newdb &&\
pg_restore -d newdb olddb.pgdump
Run Code Online (Sandbox Code Playgroud)

如果您正在使用,nohup因此在您丢失 ssh 会话时命令不会终止,请考虑screen改用。

  • 太棒了`创建数据库 my_new_database 模板 my_old_database;` (2认同)

小智 5

Postgres 允许在创建新数据库时使用服务器上的任何现有数据库作为模板。我不确定 pgAdmin 是否在创建数据库对话框中为您提供了选项,但如果没有,您应该能够在查询窗口中执行以下操作:

CREATE DATABASE newdb WITH TEMPLATE originaldb OWNER dbuser;
Run Code Online (Sandbox Code Playgroud)

不过,您可能会得到:

错误:其他用户正在访问源数据库“originaldb”

要断开所有其他用户与数据库的连接,您可以使用以下查询:

SELECT pg_terminate_backend(pg_stat_activity.pid) FROM pg_stat_activity 
WHERE pg_stat_activity.datname = 'originaldb' AND pid <> pg_backend_pid();
Run Code Online (Sandbox Code Playgroud)