WindowsでバイナリBLOBを含む大きなMySQLダンプファイルのインポート中にエラーが発生しました


9

ホスティング会社から入手したMySQLダンプファイルをWindows開発マシンにインポートしようとしていますが、問題が発生しています。

これをコマンドラインからインポートすると、非常に奇妙なエラーが発生します。

3118行目のエラー2005(HY000):不明なMySQLサーバーホスト '╖?*á±dÆ╦N╪Æ・h ^ ye "π╩i╪Z +-$▼₧╬Y.∞┌|↕╘l∞/ l ╞⌂î7æ▌X█XE.ºΓ[;╦ï♣éµ♂º╜┤║].♂┐φ9dë╟█'╕ÿG∟═0à¡úè♦╥↑ù♣♦\ '╔NÑ'(11004)

代替テキスト

バイナリデータが失われることを想定しているので、スクリーンショットを添付しています...

私は問題が何であるかは正確にはわかりませんが、2つの潜在的な問題は、ファイルのサイズ(2 Gb)であり、それはめちゃくちゃ大きくはありませんが、それほど小さくもありません。それらのJPG画像(これがファイルの大部分が2GBである理由です)。
また、ダンプはLinuxマシンで取得され、Windowsにインポートしていますが、それが問題に追加される可能性があるかどうかはわかりません(理解できないはずです)

さて、そのバイナリガベージが、ファイル内の画像が問題であると思う理由ですが、過去に同じホスティング会社から同様のダンプをインポートできたため、何が問題なのかわかりません。

また、このファイル(特に3118行目)を調べようとするのは、そのサイズを考えると不可能です(grepやsedなどのLinuxコマンドラインツールではあまり便利ではありません)。

ファイル破損している可能性がありますが、確認方法は正確にはわかりません。ダウンロードしたのは.gzファイルで、WinRarで "テスト"したところ、問題ないように見えます(gzになんらかのCRCがあると仮定しています)。あなたがそれをテストするより良い方法を考えることができるなら、私はそれを試してみたいと思います。

何が起こっているのか/このエラーを乗り越える方法はありますか?

特にデータに執着しているわけではありません。これは単にdevのコピーとして必要なので、いくつかのレコードを失う必要がある場合でも、スキーマが完全に健全である限り、問題はありません。

ありがとう!
ダニエル

回答:


14

このため、私は常にを使用していますmysqldump --hex-blob

このスイッチを使用してblobをエンコードしているデータベースを再ダンプすると、機能します。

sqlyogやmysql管理者などのWindows mysqlクライアントIDEを使用してインポートを試みることができます。それは私のために一度働いた。


私はそれをホスティングの人に尋ねてみます、それがそれがうまくいくかどうか見てみましょう。ただし、これには数日かかる場合があります。-(-混乱しているのは、過去に他のバイナリダンプをインポートできたことです。それが何であるかについて考えていますか?
Daniel Magliola

コマンドラインからではなく、mysql管理者からインポートしてみてください
Paul

Linuxでインポートでき、-hex-blobでエクスポートした後にWindowsでインポートできる場合は、一時的にLinuxにインポートし、そこから--hex-blobでエクスポートできます。それについてヘルプ(別名:Linuxボックス)が必要な場合はお知らせください。
プペノ2011年

特別なエクスポートを必要としないソリューションについては、以下の@BobCの回答を参照してください。
T.ブライアンジョーンズ

7

必ずしも--hex-blobオプションを使用する必要はありません。私はこの問題を自分で解決しましたが、問題は--max_allowed_pa​​cketを、ロードする最大のデータBLOBに対応するのに十分な大きさに設定する必要があることでした。復元コマンドは次のようになります。

mysql -u user -h hostname --max_allowed_packet=32M dbname < dumpfile.sql

--hex-blobオプションを使用すると、バックアップのサイズが2倍以上に大幅に増加します。注:上記のコマンドで復元したのと同じデータを復元するには、my.ini(cnf)に--max_allowed_pa​​cket = 64Mを設定し、サーバーを再起動してコマンドラインで64Mに設定し、 --hex-blobオプション。


これはうまく機能し、おそらく受け入れられる答えになるはずです。
T.ブライアンジョーンズ

2

ファイルサイズが大きいため、依然として問題が発生する可能性があるため、max-allowed-packetを高い値(mysqlコマンドのパラメーター)に設定してください。


1

今日はこの問題がありました。しかし、私の問題は、バックアップが壊れていることに気付いたときにデータベースが既に削除されていることでした。だから、--hex-blob私には違います!それを修正できるように、「バイナリ文字列」を16進表記に変換する小さなスクリプトをPHPで作成しました"_binary '!@{#!@{#'"

SQLの解析にREGEXを使用していますが、これは完全に安全ではありませんが、私にとってはうまくいきました。

<?php
function convertEncoding($str)
{
    $r = '';
    for ($i = 0; $i < mb_strlen($str); $i++) {
        $r .= sprintf('%02X', mb_ord(mb_substr($str, $i, 1, 'UTF-8'), 'UTF-8'));
    }

    return '0x' . $r;
}


$str = file_get_contents('data.sql');

$newStr = preg_replace_callback('/_binary \'(.+?)\'(,|\))/im', function ($str) {
    $s = convertEncoding(stripcslashes($str[1]));
    echo 'Translated: ' . $str[1] . ' => ' . $s . PHP_EOL;
    echo 'Ending char was: ' . $str[2] . PHP_EOL;
    return $s . $str[2];
}, $str);

file_put_contents('fixed.sql', $newStr) ;

私はそれが誰かが私が得た頭痛を救うことを願っています!


0

バイナリデータを含むLinuxサーバーからダンプファイルを復元すると、同様の問題が発生します。エラーは次のようなものですERROR 1064 (42000) at line 551: You have an error in your SQL syntax;

このダンプファイルはLinuxサーバーに正常にインポートできますが、Windowsにはインポートできません。

私は--hex-blobオプションで試しました、--max_allowed_packetそして.sqlファイルの代わりにパイプラインでデータを転送さえしましたが、運がありませんでした。

MySQL Workbenchを使用してこれを最終的に解決しました。生成されたコマンドは

Running: mysql.exe --defaults-file="c:\users\admini~1\appdata\local\temp\tmp1fzxkx.cnf"  --protocol=tcp --host=localhost --user=root --port=3306 --default-character-set=utf8 --comments --database=platform  < "E:\\direcotory\\dump.sql"

その後--default-character-set=utf8、コマンドラインから試してみましたが、うまくいきました。これが誰かを助けることを願っています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.