如何在PostgreSQL中恢复群集备份?

时间:2014-05-09 16:11:40

标签: postgresql dump pg-restore

我正在尝试在PostgreSQL中恢复群集备份。我使用了pg_dumpall,它生成了一个带有SQL查询的纯文本文件。但是,当我尝试恢复它时,我收到此错误:

  

pg_restore:[archiver]输入文件似乎没有效果   档案

当我尝试恢复数据库的备份(使用pg_dump生成)时,我也收到了同样的错误,但我解决了这个问题。在这种情况下,pg_restore无法识别带有SQL查询的纯文本,因此我更改了命令:

pg_dump db_name -Fc -U user -h host -p port > my_db_backup.dump

而是写了:

pg_dump db_name -Fp -U user -h host -p port > my_db_backup.dump

这样生成的文件不是纯文本,因此pg_restore与之相配。

现在,我正在尝试使用pg_dumpall进行相同的管理,但是那个没有-F参数。我的代码(在Python3中,但这个命令对任何语言都是一样的)是:

pg_dumpall -U user -h host -p port > my_cluster_backup.dump

知道如何管理这个吗?或者至少如何以任何方式恢复群集备份?提前谢谢!

修改

如果我使用 psql 恢复:

psql -U user -h host -p port -f my_cluster_backup.dump postgres'

它似乎工作,很多命令都显示在控制台中,但每个命令都会出现“已存在”错误。我无法理解,因为我有两个集群(端口5432和5433),我想它正试图在5432恢复,当我确定我连接到5433.以前有人遇到过这个问题吗?

2 个答案:

答案 0 :(得分:2)

请参阅pg_dumpall doc末尾的示例:

  

转储所有数据库:

     

$ pg_dumpall> db.out小

     

要从此文件重新加载数据库,您可以使用:

     

$ psql -f db.out postgres

     

(自从这里连接到哪个数据库并不重要   由pg_dumpall创建的脚本文件将包含相应的   用于创建和连接到已保存数据库的命令。)

此示例中的

db.out是一个SQL命令脚本,旨在直接提供给psql解释器。

pg_restore不能用纯SQL文件作为输入。它的主要/原始目的是以非文本格式(例如pg_dump -Fc)输入备份并生成相应的SQL文件作为输出,或使用并行路径直接恢复到数据库中({{1} })

当输入已经是一个SQL脚本时,使用-j而不是pg_restore真的没有意义,所以可能这就是作者没有做到的原因懒得支持SQL脚本作为psql的输入。

答案 1 :(得分:0)

现在,您可以使用 pg_basebackup 来备份整个节点。