pg_dump和pg_restore:输入文件似乎不是有效的档案


66

我在一台机器上使用了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

可能是什么问题?


尝试将转储导入生成它的同一台计算机上。另外,检查Postgres版本。
Hank Gay

我不能尝试将其导入同一台计算机,因为它是生产计算机。任何想法,我还能做什么?
gruszczy

此解决方案也可能与某些人有关:stackoverflow.com/questions/42433414/…–
穆罕默德·汉南

Answers:



26

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)进行恢复。


2
[OT]我希望对定制输出格式的“不推荐”状态有所不同-句子“这是最灵活的格式,因为它允许重新排序加载数据和对象定义...”对我来说是相当认可。
Milen A. Radev 2010年

我同意,“不推荐”是一种夸大的说法。但是“最灵活”并不一定意味着“最推荐”。澄清。
leonbloy

13

尝试将--format=c选项传递给pg_dump。这将允许pg_restore还原它。


谁愿意对此进行修改,想解释为什么?接受的答案说明这将起作用:-)

@skrafi:您的意思是?
psmears '16

1
抱歉,复制粘贴的输出错误,正确的输出是正确的,pg_restore: [archiver] did not find magic string in file header因此这不适用于简单的SQL转储
skrafi

@skrafi:我不确定你的意思。如果您使用pg_dump --format=c ...> archivefile,然后pg_restore在上使用archivefile,那么它(至少在我刚刚进行测试时)可以正常工作。也许您的文件以某种方式损坏了?还是您遇到了特定的错误?
psmears '16

6

这就是备份旧数据库并还原的方法

备份数据库

pg_dump --format=c olddb_name > db_dump_file.dump

恢复该备份

pg_restore -v -d newdb_name db_dump_file.dump

进一步了解pg_dumppg_restore


5

对于Windows用户,请尝试

type db.txt | psql --username="YOURNAME" dbname

奇迹般有效


这救了我,谢谢!至少应接受Windows的答案。
Daniel Butler

2

您可以对MySQL的SOURCE命令做一些事情:

psql dbname

然后,在postgresql终端中:

\i filename


1

此错误消息也可能意味着备份文件实际上有问题(或您对此的假设)。

在一种情况下,我已经在Docker容器中挂载了一个备份文件并尝试还原,但是失败了does not appear to be a valid archive。实际上,该文件为空,因为安装不正确。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.