pg_restore: [archiver] 在文件头中未找到魔术字符串。

我正在使用PostgreSQL 9.1,并且想要恢复由pg_dump生成的备份文件。
sudo pg_dump -h 127.0.0.1 -U postgres --clean --inserts -E UTF8 -f out.sql database_name
这个命令会生成一个有效的SQL文件,首先删除所有现有的数据库对象,然后生成所有的表、索引、序列等等,最后插入数据。 当我尝试使用生成的备份文件进行恢复时:(换行仅用于显示目的)
sudo pg_restore 
    -d database_name -h 127.0.0.1 -U postgres
    --format=c --clean --create out.sql

它失败并打印:

pg_restore: [archiver] did not find magic string in file header
那是什么原因呢?
4个回答

你正在使用 pg_restore --format=c ... 进行还原,但是 pg_dump 不是使用 --format=c,而是使用默认的 plain 格式进行备份。 从 pg_dump 的手册页面:
  -F format, --format=format
       Selects the format of the output.  format can be one of the
       following:

       p, plain
           Output a plain-text SQL script file (the default).

纯文本格式的转储应直接传递给 psql 命令行工具,pg_restore 不知道它是什么,这是出现错误消息的原因:在文件头中未找到魔术字符串

您可以在 shell 中使用 more out.sql 直接查看转储文件,并且您将看到可读的 SQL 命令。使用 psql -f out.sql [其他选项] 还原它。可能需要首先创建目标数据库,因为 pg_dump 调用中没有 --create 选项。

另一方面,您可以重新调用转储并在选项中添加 --format=c。那将成为相反的情况:pg_restore 必须用于解释自定义格式的转储文件。


1在我的情况下,我导入了错误的文件,它的名字很相似...希望这条评论能在某一天帮助到其他人。 - user1735921

如果你使用git-lfs,请确保拥有实际的文件,而不是指针!

可能的问题之一是您的数据文件被截断了。通过比较文件大小来检查是否下载了完整的文件。

在Windows上备份后立即尝试恢复时,我遇到了这个错误。结果发现问题是,我使用pg_dump ... > filename将文件写出,这显然会损坏输出。相反,我需要使用pg_dump ... -f filename来写出文件。一旦我用这种方式创建了备份文件,它就可以顺利恢复了。