pg_restore 在 zlib 压缩转储上失败

pg_restore 在 zlib 压缩转储上失败

使用以下命令创建了 postgresql(Windows 版本 9.3 或 9.4)数据库的转储:

C:\>pg_dump -U user -Z 6 database > db.dump

使用 psql 或 pg_restore 恢复失败:

C:\>psql.exe -U postgres db < db.dump  
ERROR: invalid byte sequence for encoding "UTF8": 0x8b

C:\>pg_restore.exe -U postgres -d db < db.dump  
pg_restore: [archiver] input file does not appear to be a valid archive

C:\>pg_restore.exe -U postgres -d db --format=c db.dump
pg_restore: [archiver] did not find magic string in file header

尝试验证文件:

user:~$ file db.dump
db.dump: gzip compressed data, from NTFS filesystem (NT)

user:~$ zcat db.dump
gzip: db.dump: invalid compressed data--format violated

那么我该如何恢复这个压缩转储?

答案1

您创建的文件是经过 gzip 压缩的纯文本文件。要恢复该文件,请使用类似以下命令

zcat db.dump | psql ...

如果您想要非纯文本转储,则应-Fc在运行时使用该选项pg_dump

答案2

简短的回答:fixgz在压缩转储上运行。

fixgz.exe bad.gz fixed.gz

长答案:因此,如果您使用pg_dump--compresss-Z指定自定义格式选项(-Fc),您实际得到的是 ASCII 模式而不是二进制模式的压缩文件。

引自gzip 主页

99.9% 的问题压缩 是由于文件传输是在 ASCII 模式而不是 BINARY 模式下进行的。特别是,众所周知,gopher 会将二进制文件视为 ASCII 来破坏它们。确保您的本地文件副本具有确切地与原始字节大小相同。

如果你已经以 ASCII 模式传输了一个文件,并且无法再访问原始文件,你可以尝试该程序fixgz 删除传输过程中插入的额外 CR(回车符)字节。Windows 9x/NT/2000/ME/XP 二进制文件是这里。但绝对不能保证这确实能修复您的文件。结论:切勿以 ASCII 模式传输二进制文件。

[请注意“这里“链接直接链接至可下载的 ZIP 文件,该文件包含(.c)源代码、(.exe)可执行文件以及README.]

相关内容