LOAD DATA INFILEにはFILE権限

MySQLで、ファイルをロードしようとすると、以下のエラーでうまくいかない。


mysql> LOAD DATA INFILE 'F:/Data/Eclipse/workspaces/MyApp/030-01 DbTestCase/sql/
mysql/testdb/person-data.txt' INTO TABLE testdb.person FIELDS TERMINATED BY '\t'
ENCLOSED BY '\"' LINES TERMINATED BY '\r\n';
ERROR 1045 (28000): Access denied for user 'test'@'localhost' (using password: Y
ES)

おなじみの


grant all on testdb.* to test@localhost
でつくったtestユーザでは上記のエラーになってしまって、
rootだとうまくいくんだよな。

12.2.5. LOAD DATA INFILE 構文
http://dev.mysql.com/doc/refman/5.1/ja/load-data.html
を参照すると

安全上の理由で、サーバ上にあるテキスト ファイルを読み込む時、
ファイルはデータベース ディレクトリ上にあるか、
全てによって読み込み可能である必要があります。
また、 サーバ ファイル上で LOAD DATA INFILE を利用する時は、
FILE 権限が必要です。
詳しくは 項4.7.3. 「MySQL 提供の権限」 を参照してください。

なんて書いてある。

4.7.3. MySQL 提供の権限
http://dev.mysql.com/doc/refman/5.1/ja/privileges-provided.html

たしかに、FILE権限なるものがあるね。

12.5.1.3. GRANT 構文
http://dev.mysql.com/doc/refman/5.1/ja/grant.html

ここも読み直す。
余談だが、grant allって、ぜんぶの権限を与えるんじゃなくて、適当に権限をつけるものだったんだ。へえー。そりゃFILE権限もつかないわけだ。

FILE権限がつかなったのは、

権限はいくつかのレベルで供与する

であるため。


rootで、確認してみる。


mysql> use mysql;
Database changed
mysql> select host, user, file_priv from user;
+-----------+------+-----------+
| host | user | file_priv |
+-----------+------+-----------+
| localhost | root | Y |
| localhost | test | N |
+-----------+------+-----------+
2 rows in set (0.00 sec)

FILE権限を与える


mysql> grant file on *.* to test@localhost;
Query OK, 0 rows affected (0.00 sec)
mysql> select host, user, file_priv from user;
+-----------+------+-----------+
| host | user | file_priv |
+-----------+------+-----------+
| localhost | root | Y |
| localhost | test | Y |
+-----------+------+-----------+
2 rows in set (0.00 sec)

testユーザをいったんログアウトして、もういちどログイン


mysql> LOAD DATA INFILE 'F:/Data/Eclipse/workspaces/MyApp/030-01 DbTestCase/sql/
mysql/testdb/person-data.txt' INTO TABLE testdb.person FIELDS TERMINATED BY '\t'
ENCLOSED BY '\"' LINES TERMINATED BY '\r\n';
Query OK, 2 rows affected (0.00 sec)
Records: 2 Deleted: 0 Skipped: 0 Warnings: 0

できた!