仅使用带有压缩参数的pg_dump可能会损坏备份



我用这个命令备份200GB的数据库(postgres 9.1,win7 x64):

pg_dump -Z 1 db_name>备份

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

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

pg_restore -Ft

[tar 存档器] 在 ▼ 中找到损坏的 tar 标头(预期13500752,COM放 78268) 文件位置 512

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

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

您在"备份"中作为输出的内容只是压缩的普通 SQL。您可以通过提示来检查它:

gzip -l backup

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

zcat backup > backup.sql
psql -f backup.sql
不可能

像"弗兰克·海肯斯"提议的那样用 postgres 9.1 中的pg_dump -Fc进行转储,因为转储格式在主要版本之间不兼容,例如 9.0 -> 9.1 -> 9.2而"pg_restore"会在 9.2 上给你一个错误

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

pg_dump手册 ( pg_dump --帮助 )

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

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

注意:纯文本格式无法使用pg_restore工具恢复。请改用 psql <转储.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

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

这是一个

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

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

fixgz.exe bad.gz fixed.gz

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

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

如果您已以 ASCII 模式传输文件,但不再具有 访问原件,您可以尝试程序 fixgz 删除 传输插入的额外 CR(回车)字节。一扇窗户 9x/NT/2000/ME/XP 二进制文件在这里。但绝对没有保证 这实际上将修复您的文件。结论:永不转移 ASCII 模式下的二进制文件。

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

最新更新