2012-11-30 13 views
6

非常に大きなMySQLデータベース(1.6GB - 主にBLOB)をエクスポートして新しいサーバにインポートしようとしています。私はほとんどの問題を解決し、最終的に間違いなくインポートを完了しました。 MySQL Query Browserの使用私はテーブルのクエリをBLOBのイメージで実行し、ディスクに保存しました(クエリブラウザの保存アイコンを使用して)。ファイルを開こうとしたときに、「無効なイメージ形式」エラーが発生しました。ええとああ。DBデータと異なるBLOBデータをエクスポートしました

クエリブラウザを使用して、ソースデータベースと最近インポートされた新しいデータベースの値を調べました。値は異なっていると私は思う。それは単に問題や何かをエンコードすることができます。ここで私が見たものである。

ソース(有効なデータ)サーバー:

FF D8 FF E0 00 10 4A 46 49 46 00 01 01 01 00 60 
00 60 00 00 FF DB 00 43 00 08 06 06 07 06 05 08 
and so on... 

新サーバー:余分の3つのバイトがあること、それが私の初心者の目に表示されます。この例では

C3 BF C3 98 C3 BF C3 A0 00 10 4A 46 49 46 00 01 
01 01 00 60 00 60 00 00 C3 BF C3 9B 00 43 00 08 
and so on... 

「新しい」サーバー上のデータの前にあるデータ。

次に、010 editorを使用してSQLダンプファイルをチェックアウトしました。私はこの特定の例の行を見つけました。ここに私が見るものがあります:

FF D8 FF E0 5C 30 10 4A 46 49 46 5C 30 01 01 01 
5C 30 60 5C 30 60 5C 30 5C 30 FF DB 5C 30 43 5C 
30 08 06 06 07 06 05 08 and so on... 

私は私の頭の上です。私はパターンを参照して、私はヘックスペア5C 30が00と同じように見えることに気づきますが、なぜ私は理解できません。この時点で、私は拭き取られようとしているソースサーバを持っていて、恐れている新しいサーバが破損しています。私はこれがMySQLでグローバル変数を設定することで解決できる何らかのエンコードの問題だと思っていますが、私は本当に分かりません。

ソース(稼動中の)サーバーと新しい(破損した)サーバーからファイルを保存すると、破損したファイルのファイルサイズは約40%大きくなります。

私は両方のサーバー上の文字セット変数を確認:

SHOW VARIABLES LIKE '%char%' 

ソースサーバ:

character_set_client  utf8 
character_set_connection utf8 
character_set_database latin1 
character_set_filesystem binary 
character_set_results  utf8 
character_set_server  latin1 
character_set_system  utf8 

新しいサーバー:

character_set_client  utf8 
character_set_connection utf8 
character_set_database latin1 
character_set_filesystem binary 
character_set_results  utf8 
character_set_server  latin1 
character_set_system  utf8 

を彼らは同じです。

+1

FYI 1.6 Gbがデータベース用語でちょうど赤ちゃんです! – briantyler

+0

16進数の文字列 '5C 30'は' \ 0'なので、エディタで何か変わった振る舞いをしたり、SQLダンプの内容が何とか操作/壊れてしまったりします。 – cmbuckley

答えて

6

新しいデータベースの破損したデータは、ソースデータをISO-8859-1からUTF-8に変換した結果になります(たとえば、U + 00FF - は前者がFF、後者がC3 BF)。

BLOBには文字セットがないため、文字エンコーディングはサーバー変数によって制御されません。私はmysqldumpがあなたのBLOBデータをUTF-8でエンコードされたファイル(which is the default)で出力していると考えています。そして、何らかの方法で、サーバ設定とオプションの組み合わせをmysqldumpに渡してエンコードしています。

最善の解決策は、BLOBフィールドをエクスポートするときのようなものになると思われる、--hex-blobオプションを使用することがあります

INSERT INTO `table` VALUES (0xFFD8FFE0...); 
関連する問題