2012-01-09 32 views
4

LOAD DATA LOCAL INFILEクエリを発行して、レール3.1.1のmysql2 gem(0.3.11)を使用してCSVデータをテーブルにロードしようとしています:LOAD DATA LOCAL INFILEによってmysql2 gemで不正なパケットエラーが発生する

class Foo < ActiveRecord::Base 
    def self.load_csv 
    query = "LOAD DATA LOCAL INFILE 'test/foo.csv' REPLACE INTO TABLE foos LINES TERMINATED BY '\n' (title)" 
    ActiveRecord::Base.connection.execute(query) 
    end 
end 

(これはthis github issueのエラーを再現するためのサンプルアプリケーションです)。これは、次のエラーでOS X(ライオン)にを失敗し続ける:

Mysql2::Error: Malformed packet: LOAD DATA LOCAL INFILE 'test/foo.csv' REPLACE INTO TABLE foos LINES TERMINATED BY ' 
' (title) 

ローカルINFILEがサーバ上で有効になっている:

mysql> show variables where variable_name like '%local%'; 
+---------------+-------+ 
| Variable_name | Value | 
+---------------+-------+ 
| local_infile | ON | 
+---------------+-------+ 

とapplication.rbでこのディレクティブを介してクライアントに:

Mysql2::Client.default_query_options[:connect_flags] |= Mysql2::Client::LOCAL_FILES 

同じLOAD文がMySQLクライアントから正常に動作します。 DB接続方法をソケットからTCP/IPに変更しても違いはありません。 MySQLは自作を介してインストールされたバージョンは、私がLinuxで同じコードを実行し、このエラーを取得しない

mysql Ver 14.14 Distrib 5.5.15, for osx10.7 (i386) using readline 5.1 

です。 LOCAL修飾子を省略した場合でも動作しますが、ファイルは実際に本番環境ではローカルで、データベースサーバーはリモートであるため、これはオプションではありません。それはthis質問のようなファイルのアクセス許可とは関係ありません。

これは私をナットにしています。どんな洞察力も大変ありがとうございます。

+0

どのようにあなたがライオンにMySQLをインストールしたのですか?自作を通して? – Romain

+0

はい - 編集した質問に応じて – Thilo

+0

brew install mysqlを実行するときに明示的に '--enable-local-infile'を渡しましたか?そうでない場合は、問題が継続するかどうか試してみることができますか? – Romain

答えて

0

これは、mysql2 gemを再インストールするだけで簡単に解決できます。ソースからコンパイルされたMySQLバージョンでインストールしたのち、後でbrewを使ってインストールしたMySQLに切り替えたと思うので、gemで使用されるクライアントコードに互換性がありません。それはコマンドラインクライアントからはうまくいったが、gemを使っていないときはなぜそうなるのかを説明している。

gem uninstall mysql2 
gem install mysql2 

いやはや...

問題はmysql2のVのために固定されなければならない
+0

私はhomebrewを介してインストールされたMySQLのバージョン '5.5.19 Source distribution'を持っています。私はこの執筆時点で最新のmysql2 gemにアップグレードしました。バージョンは '0.3.11'です。上記で指定した接続オプションを使用していますが、クライアントでスクリプトを使用してデータを読み込もうとしたときに 'Malformed packet(Mysql2 :: Error)'エラーが発生します。私はエラーなしでmysqlクライアントで同じコマンドを直接実行できます。助言がありますか? –

+0

Mysql '5.1.41 Source distribution'がインストールされた別のOS Xで動作し、Mysql' 5.1.41-3ubuntu12.10(Ubuntu) 'がインストールされたUbuntuボックスで動作します。だから、私は "Malformed packet"エラーを理解できないので、回避策としてMySQLのバージョンをロールバックすることがあります。 –

+0

実際にあなたの特定の状況に役立たないので答えを下げない理由はありません:)あなたのロールバックはうまくいっています。 – Thilo

4

> 0.3.12b4

それはトリック

をなかったLOCAL_FILEフラグを使用しますが、オプションに :local_infile => trueを追加する私のために動作しませんでした
1.9.3p194 :011 > a = Mysql2::Client.new(:username=>'root', :host=>'localhost', :password=>'', :database=>'bhl_indexer', :local_infile => true) 

https://github.com/brianmario/mysql2/issues/293

+0

私のために: 'Mysql2 :: Client.default_query_options [:connect_flags] | = Mysql2 :: Client :: LOCAL_FILES'が原因で 'Malformed packet error'が発生しました。しかし、追加:local_infile接続オプションが機能しました。 MySQL v.5.5.40、mysql2 gem v.0.3.16。 – Grimmo