5

我使用此命令备份 200GB 数据库(postgres 9.1,win7 x64):

pg_dump -Z 1 db_name > 备份

它创建了 16GB 的文件,我认为这很好,因为以前有效的备份(并且由扩展工具打包)具有相似的大小。现在,当我尝试使用 恢复到 PG9.2 时pg_restore,出现错误:

输入文件似乎不是有效的存档

pg_restore -Ft

[tar 归档器] 在 ▼ 中发现损坏的 tar 标头(预期为 13500752,com
放置 78268) 文件位置 512

Gzip 也显示它已损坏。当我在 Total Commander 中打开备份文件时,内部文件只有 1.8GB。当我在寻找解决方案时,应该使用-Cf参数来完成转储。

现在有什么格式的文件?它只是 tar 还是 gzip(winrar 显示 gzip)?有什么方法可以正确恢复它还是以某种方式损坏(转储时没有错误)?可能是由于 tar 或 gzip 的文件大小限制吗?

4

5 回答 5

6

您在“备份”中的输出只是压缩的普通 sql。您可以通过提示进行检查:

gzip -l backup

不幸的是 pg_retore 不提供恢复PLAIN SQL的可能性,所以你只需要解压缩文件并使用psql -f <FILE>命令:

zcat backup > backup.sql
psql -f backup.sql

无法pg_dump -Fc按照“Frank Heikens”的建议从 postgres 9.1 进行转储,因为转储格式在主要版本之间不兼容,例如 9.0 -> 9.1 -> 9.2 和“pg_restore”会在 9.2 上给你一个错误

于 2012-10-07T19:57:27.867 回答
0

您的转储是纯 SQL,它不是 tar 格式,就像您尝试在 pg_restore 中使用的那样。当您需要压缩格式并在 pg_restore 中使用此设置时,请使用 --format=custom 或 -Fc。检查手册

于 2012-10-07T11:31:12.410 回答
0

大多数情况下,此错误意味着您的还原操作使用了无效格式

来自 pg_dump 手册 pg_dump --help )

-F, --format=c|d|t|p         output file format (custom, directory, tar,  
                             plain text (default))

这意味着如果您使用 pg_dump 不带选项--format / -F创建转储,您的转储将以纯文本格式创建

注意:纯文本格式无法使用pg_restore工具恢复。请改用psql < dump.sql。

例子:

# plain text export/import
pg_dump -Fp -d postgres://<db_user>:<db_password>@<db_host>:<db_port>/<db_name> > dump.sql
psql -d postgres://<target_db_user>:<target_db_password>@<target_db_host>:<target_db_port>/<target_db_name> -f dump.sql

# custom format 
pg_dump -Fc -d postgres://<db_user>:<db_password>@<db_host>:<db_port>/<db_name> > dump.sql.custom
pg_restore -Ft postgres://<target_db_user>:<target_db_password>@<target_db_host>:<target_db_port>/<target_db_name> dump.sql.custom

# tar format 
pg_dump -Ft -d postgres://<db_user>:<db_password>@<db_host>:<db_port>/<db_name> > dump.sql.tar
pg_restore -Ft postgres://<target_db_user>:<target_db_password>@<target_db_host>:<target_db_port>/<target_db_name> dump.sql.tar

恢复格式与备份不匹配时,也会出现来自主题的错误。
例如,创建的转储将采用自定义格式,但用于恢复指定的tar

于 2019-01-30T08:41:46.763 回答
0

这是一个旧线程,尽管我遇到了完全相同的问题并设法使用 fixgz 修复了有些损坏的转储:

简短的回答:在压缩转储上运行 fixgz http://www.gzip.org/fixgz.zip 。

fixgz.exe bad.gz fixed.gz

长答案:因此,如果您将 pg_dump 与 --compresss 或 -Z 一起使用而没有指定自定义格式选项 (-Fc),那么您实际得到的是 ASCII 模式而不是 BINARY 模式的压缩文件。

引用自http://www.gzip.org/#faq1

如果您已经以 ASCII 模式传输文件并且您不再可以访问原始文件,您可以尝试使用程序 fixgz 删除传输插入的额外 CR(回车)字节。Windows 9x/NT/2000/ME/XP 二进制文件在这里。但是绝对不能保证这会真正修复您的文件。结论:永远不要以 ASCII 模式传输二进制文件。

于 2016-05-09T10:40:09.730 回答
0

我在使用 PGAdmin III 恢复时遇到了这个问题。PGAdmin 4 不会出现此问题。

于 2019-09-11T17:22:45.373 回答