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