我正在尝试在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.以前有人遇到过这个问题吗?
答案 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 来备份整个节点。