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

5
我正在尝试在PostgreSQL中恢复集群备份。 我使用了pg_dumpall命令生成了一个包含SQL查询的纯文本文件。 然而,在我尝试还原它时,出现了以下错误:

pg_restore:[archiver]输入文件似乎不是有效的归档

当我尝试还原数据库备份(使用pg_dump生成)时,我也收到了同样的错误,但我已经解决了那个问题。 在那种情况下,pg_restore无法识别包含SQL查询的纯文本,因此我更改了命令。请注意保留HTML标记。
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个回答

8
请参考pg_dumpall文档末尾的示例:

要备份所有数据库:

$ pg_dumpall > db.out

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

$ psql -f db.out postgres

(连接到哪个数据库并不重要,因为由pg_dumpall创建的脚本文件将包含创建和连接保存的数据库所需的适当命令。)

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

pg_restore不能使用纯SQL文件作为输入。它的主要/最初目的是以非文本格式(如pg_dump -Fc)作为输入,并将相应的SQL文件作为输出,或者使用并行路径(-j)直接还原到数据库中。

当输入已经是一个SQL脚本时,使用psql而不是pg_restore没有意义,所以大概这就是为什么作者没有费心支持将SQL脚本作为pg_restore的输入的原因。


谢谢,现在我正在使用psql,但是遇到了一些问题。我将编辑我的问题以展示我使用psql时发生的情况。 - forvas

0

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


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