将PostgreSQL数据库从一个服务器复制到另一个服务器

6
我有一个postgres数据库,其中包含多个模式和每个模式中的多个表,并且这些表之间具有许多外键关系。我想做的就是将所有内容从一个服务器复制到另一个服务器,从而创建第一个服务器的副本。此时,我不介意在执行此操作时完全使任一或两个服务器停机。
我无法找到一种直接将第一个数据库中的所有内容复制到第二个数据库中的方法。我尝试使用pg_dump和pg_restore,但还原违反了很多外键约束,因此没有正确还原。我已经阅读过可以进行仅数据还原的方法,该方法将消除所有数据,禁用在加载数据时的约束,然后在数据加载完成时重新启用约束,但这假设源数据库和目标数据库具有相同的表结构,而它们并没有。如果有一种只转储模式和数据的方法,我认为这将起作用,但我也没有找到这样做的方法。

你可能想使用二进制转储。如果这仍然无法正常工作(它应该可以),您可以使用“热备”模式复制数据文件。请参阅《PostgreSQL管理员指南》的第24.2和25节。 - BadZen
你尝试将约束条件设置为可延迟模式以避免外键约束冲突了吗? - yurib
@BadZen 顺便说一下,那不是“二进制转储”,那只是整个 PostgreSQL 安装的副本。(我会期望“二进制转储”仍然使用 pg_dump 进行,将二进制数据而非文本文件数据写入 COPY。我花了一些时间才明白你的意思)。此外,您并没有使用热备份,那是完全分开的。您需要 pg_basebackup -X stream,或者如果您想要更高级的方法,则需要 WAL 存档和 pg_start_backup()rsyncpg_stop_backup() - Craig Ringer
1
@zelinka 这个问题中明显缺少错误信息、您运行的确切命令、正在使用的PostgreSQL版本等重要信息。 - Craig Ringer
@CraigRinger - 抱歉,我应该表述得更清楚 - 我建议有两件事情。一是使用带有“自定义”格式(-c开关)的二进制pg_dump,另一种是基于文件的复制。顺便说一下,在后一种情况下,您不需要复制整个安装程序,只需复制数据文件的子集即可。我提供的引用中有详细信息。 - BadZen
@BadZen 如果你不使用基于basebackup的方法复制整个安装,则会得到一个无法使用的数据库。如果启用了WAL归档,那么你可以仅排除pg_xlog。就是这样。例如,你肯定不能只复制一个数据库。 - Craig Ringer
4个回答

14

如果你想将位于server1上的数据库mydb复制到server2上的mydb,并完全替换server2mydb的所有内容,可以使用以下命令进行转储:

pg_dump -Fc -f mydb.dump -h server1 mydb

然后使用以下命令进行还原:

dropdb -h server2 mydb
createdb -h server2 -T template0 mydb
pg_restore -d mydb -h server2 mydb.dump

这将会:
  • DROP 数据库 mydbserver2 上,完全永久地销毁 server2mydb 中的所有数据
  • 从一个完全空的模板中重新在 server2CREATE 数据库 mydb
  • 将在 server1 上的 mydb 的副本恢复到 server2

另一种选择是使用没有删除和创建的 pg_restore --clean。它将删除所有表,然后重新创建它们。我更喜欢删除整个数据库并获得一个干净的数据库。


1
我假设代码的第一行中的 server1 应该改为 server - Sean Coley

3

场景:从PC1复制Db1到PC2

在PC1上:

运行PgAdmin。

右键单击Db1>备份。

给出文件名并保存。

将保存的文件从PC复制到另一台PC。

在PC2上:

右键单击Database>创建>指定文件名“Db1”(与PC1中相同的名称)。

右键单击Db1>还原>选择复制的文件(如果文件未显示,点击显示所有文件)。

完成!


1
你可以进行“自定义”格式备份,然后在新位置的空白数据库上进行还原。这在过去对我很有效。但是,如果你进行纯文本备份,你将会得到你一直遇到的错误。

我使用pgAdmin UI来完成这些任务。 - Peter pete
pgAdmin的备份/恢复界面很糟糕(至少在去年某个时候是这样),考虑手动完成这些操作。 - BadZen

1

这也可以工作

pg_dump -Fd -f dump -h 服务器IP -U smartcare

pg_restore -d smartcare -h localhost -U postgres dump

备份和恢复数据库


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接