使用以下命令创建了 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
.]