Compression
損壞的gz文件
我在 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
此時文件被打亂。看起來是文本編碼的問題,有沒有辦法恢復文件中的數據?
該文件以純 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 文件)並且每個塊具有相同的不同標頭。