gzファイルが破損しています

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ɀ\D8XY\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ファイルをリンクすることもできます)、各チャンクには同じヘッダーがあるため、複数のファイルを見つけることができます。

関連情報