我有一个 gz 文件中的 MySQL 数据库备份。当尝试解压缩它时,我得到以下信息:
gzip: db_stepup.sql.gz: not in gzip format
我读到有时只需删除 gz 扩展名即可。所以我这样做了,我可以看到该文件了。
(352, 'bs', 'lv', 'Bosnian'),
(353, 'bs', 'lt', 'Bosnian'),
(354, 'bs', 'mk', 'Bosnian'),
(355, 'bs', 'mt', 'Bosnian')\8B\00\00\00\00\00\00}\9Dۓו\EE\DF\CF_\C1 \DBx"<\95\F7\CC8O3c\CF\D8\C7c\8F\E3\D8s&Γ]MWW\95*\B3\AA\AB2\AB\DDO@\83\84A\B2el\A1;\81$\8B\ABԒ<\B4\F4
\AD' \CEI6\D2\FFp2\F7\DA{\FB\B2 <nk\F4\ADܙ\F5[;\F7\FAv\DE\F6\F7\FF \C7\F7\A2$\FD\FE\BEX\A9\FF\A1\FD[ͺ\BF\FF2\AB\A7\E3\FE\F4\FE\F1\FB\9D\9AA\9D\FAj\AE\D5\E9\C0W\A8\A5V\EB\FD#\92\D3\E4o\E34\D0\EAz\DFWC\A8\A2\E9\95\D9\AF\B4\F2\FE\C9XDh\FEi\BD-\EC^i\9B\98ɀ\D8XY\F8\89\98/\FD\00\B5\85Am\FF\E7\DBR\B7\85\D8z\EF\F7{7\BE<\B8\F7\D9\DE\CE\DE\C7\ED\FF~\D2\FD\AFĺ\F4w\88\B5\9F\9E빯\82a\BD\F0U0\AC7\90\9EI_\CA \D8\F8
此时文件已被打乱。看起来像是文本编码的问题,有没有办法恢复文件中的数据?
答案1
该文件以纯 ASCII 开头,因此未压缩。
$ hexdump -C db_stepup.sql.gz | less
00000000 2d 2d 20 70 68 70 4d 79 41 64 6d 69 6e 20 53 51 |-- phpMyAdmin SQ|
00000010 4c 20 44 75 6d 70 0a 2d 2d 20 76 65 72 73 69 6f |L Dump.-- versio|
00000020 6e 20 34 2e 31 2e 31 34 2e 38 0a 2d 2d 20 68 74 |n 4.1.14.8.-- ht|
[...]
这种情况会持续一段时间,直到中间的某个地方变成二进制。
00012390 27 2c 20 27 6d 74 27 2c 20 27 42 6f 73 6e 69 61 |', 'mt', 'Bosnia|
000123a0 6e 27 29 1f 8b 08 00 00 00 00 00 00 03 7d 9d db |n')..........}..|
000123b0 93 14 d7 95 ee df cf 5f c1 db 78 22 3c 11 95 f7 |......._..x"<...|
它以 ... 开头1f 8b 08
(由于某种原因在您发布的输出中没有显示),它可能是一个有效的 gzip 标头。出发点是000123a3
这样的,所以让我们把它分开......
$ dd if=db_stepup.sql.gz bs=$((0x000123a3)) skip=1 | gunzip | less
,
(356, 'bs', 'mo', 'Bosnian'),
(357, 'bs', 'mn', 'Bosnian'),
(358, 'bs', 'ne', 'Bosnian'),
[...]
嘿,这似乎是它停止的数据。由于某些奇怪的原因,phpMyAdmin 似乎决定在输出中间使用 gzip...
将其重新缝合在一起:
$ dd if=db_stepup.sql.gz bs=$((0x000123a3)) count=1 > db_stepup.stitch.sql
$ dd if=db_stepup.sql.gz bs=$((0x000123a3)) skip=1 | gunzip >> db_stepup.stitch.sql
如果您正在寻找一种自动查找此类偏移量的方法(也许您有更多这样的损坏文件),那么有一个很好的小工具,binwalk
它也可以在文件中间查找已知的文件头。
$ binwalk db_stepup.sql.gz
DECIMAL HEXADECIMAL DESCRIPTION
--------------------------------------------------------------------------------
74659 0x123A3 gzip compressed data, from Unix, NULL date: Thu Jan 1 00:00:00 1970
92556 0x1698C gzip compressed data, from Unix, NULL date: Thu Jan 1 00:00:00 1970
110522 0x1AFBA gzip compressed data, from Unix, NULL date: Thu Jan 1 00:00:00 1970
[...]
正如您所看到的,它具有相同的结果(0x123A3
偏移量)。它会找到多个文件,因为 gzip 以块/块的形式出现(您甚至可以连接多个 gzip 文件),并且每个块都有相同的不同标头。