我在一台机器上使用了pg_dump并将结果文件复制到另一台机器上,尝试在其中进行还原。我相信架构是相同的。但是,我得到:
pg_restore: [archiver] input file does not appear to be a valid archive
我已经完成以下操作:
pg_dump -a -f db.txt dbname
和:
pg_restore -a -d dbname db.txt
可能是什么问题?
我在一台机器上使用了pg_dump并将结果文件复制到另一台机器上,尝试在其中进行还原。我相信架构是相同的。但是,我得到:
pg_restore: [archiver] input file does not appear to be a valid archive
我已经完成以下操作:
pg_dump -a -f db.txt dbname
和:
pg_restore -a -d dbname db.txt
可能是什么问题?
Answers:
您正在以纯SQL格式转储,该格式旨在提供给psql。pg_restore无法识别。
cat db.txt | psql dbname
应该做到的
psql dbname < db.txt
;)
pg_dump
默认情况下会创建重新创建数据所必需的sql命令。要恢复它,您只需要调用psql
(而不是pg_restore
)使用文件作为input即可。pg_restore
仅用于的二进制格式(非默认格式,不建议使用,通常不建议使用)pg_dump
。阅读文档。
更新:可以使用的pg_dump
二进制格式(-Fc
-Ft
)可以pg_restore
,并提供了一些额外的灵活性。但是它们的标准性较差(非SQL),较不易于从某些工具(例如php前端)导入或使用文本编辑器进行操作,而对其他版本甚至其他数据库的可移植性则稍差一些。对于备份,我会坚持使用默认的纯格式。对于其他情况,binary + pg_restore选项可以同等或更合适。
保留的要点是,在Postgresql中,在典型情况下,备份通常由pg_dump(普通)完成,并通过标准命令行客户端(psql)进行恢复。
尝试将--format=c
选项传递给pg_dump
。这将允许pg_restore
还原它。
pg_restore: [archiver] did not find magic string in file header
因此这不适用于简单的SQL转储
pg_dump --format=c ...> archivefile
,然后pg_restore
在上使用archivefile
,那么它(至少在我刚刚进行测试时)可以正常工作。也许您的文件以某种方式损坏了?还是您遇到了特定的错误?
这就是备份旧数据库并还原的方法
备份数据库
pg_dump --format=c olddb_name > db_dump_file.dump
恢复该备份
pg_restore -v -d newdb_name db_dump_file.dump
进一步了解pg_dump和pg_restore
对于Windows用户,请尝试
type db.txt | psql --username="YOURNAME" dbname
奇迹般有效
此错误消息也可能意味着备份文件实际上有问题(或您对此的假设)。
在一种情况下,我已经在Docker容器中挂载了一个备份文件并尝试还原,但是失败了does not appear to be a valid archive
。实际上,该文件为空,因为安装不正确。