Subscribed unsubscribe Subscribe Subscribe

さくらインターネットでのLOAD DATA INFILEに延々ハマった話

結論から言うと、さくらインターネットMySQLを管理する際、ユーザーに「クライアント ホストからデータファイルを読み込む権限がない」というのが直接の原因だった。


始まりは3日前。最初はLOCALすらつけないで頑張ってた。

LOAD DATA INFILE
    'http://xx...xx/File.csv'
    INTO TABLE tb1 FIELDS TERMINATED BY ',' ;

で、http通信は使えないのでエラーが返ってくる。

#1045 - Access denied for user 'xxxx'@'%' (using password: YES)


「http通信は使えない」ということに最初気づけず、さくらインターネットに何か問題があるかと思ってしまった。
で、さくらに「LOAD DATA INFILEを使った時だけエラーが返ってくるんですが、何がマズいんですかね?」的なメールをその日にした。

そして丸3日経った今日さくらから返ってきた*1メールが以下。

さくらのレンタルサーバはウェブサーバとデータベースサーバは別のサーバと
なりますため、上記にてデータを読み込むことは出来ません。

なおお知らせ頂きましたエラーメッセージは
ユーザ名とパスワードが一致しないため接続が拒否された際に表示されるものとなりますため、
恐らくLOAD DATA INFILE とは関連はないかと思われます。

申し訳ございませんが、
データベースの運営方法に関しましては弊社ではサポートを行うことは出来ません。
専門書籍や解説ウェブページ等を参照頂き設定、運営下さいますようお願いいたします。


…え、「ユーザ名とパスワードが一致しないため」って、MySQLにアクセスは出来たしLOAD DATA INFILE以外の操作は普通にできるし、原因として有り得ないだろ……と落胆していたところに、shakさんからリプライをもらう。

hiatli@Cside_ LOCAL入れてる?link


ここにして初めてLOCALを入れる。

LOAD DATA LOCAL INFILE
    '/home/xx...xx/File.csv'
    INTO TABLE tb1 FIELDS TERMINATED BY ',' ;

返ってきたのは以下のエラー。

#2027 - Malformed packet


Access deniedよりは遥かにマシなエラーが返ってきたから解決に近づいたとはいえ、何故Malformed packetなのだろう……。
…と頭を抱えているところに、とはえさんからリプライをもらう。

tohae@Cside_ phpmyadmin上ではなく、コマンドラインからやってみては? --enable-local-infileを追加したらできるらしいよ。http://tool.x0.com/archives/544link


さっそくsshから --enable-local-infile をオプションに追加して入ってみる。

mysql --enable-local-infile --host=mysqlxxx.db.sakura.ne.jp --user=USERNAME --password=PASSWORD
LOAD DATA LOCAL INFILE
    '/home/xx...xx/File.csv'
    INTO TABLE tb1 FIELDS TERMINATED BY ',' ;

Query OK, xxx rows affected, xxxxx warnings (0.06 sec)
Records: xxxxxxx  Deleted: 0  Skipped: xxxxxx  Warnings: xxxxxx

で、できた!!!!!1


hiatli@Cside_ お疲れ様!権限が無かったのね。phpmysql_connect()だったら$client_flagsにCLIENT_LOCAL_FILES指定したら権限取れるはず。link

本当shakさんととはえさんに感謝です。
な、長かった…!

*1:その間、サポートの電話も営業開始時間からずっと回線が混み合っててつながらなかったという大混雑っぷり。