Quantcast
Channel: 日々の覚書
Viewing all articles
Browse latest Browse all 581

MySQL 8.0でLOAD DATA LOCAL INFILEが "ERROR 1148 (42000): The used command is not allowed with this MySQL version"で失敗する時

$
0
0

TL;DR


吊るしのMySQL 8.0で mysqlコマンドラインクライアントから LOAD DATA LOCAL INFILEを実行すると転けます。
mysql80 125> LOAD DATA LOCAL INFILE '/tmp/aaa' INTO TABLE t1;
ERROR 1148 (42000): The used command is not allowed with this MySQL version
LODA DATA LOCAL INFILEを実行するには2つの条件が必要で、
  1. LOAD DATA LOCAL INFILEを実行するコネクションに CLIENT_LOCAL_FILESケーパビリティー(オプションだと思って)が設定されていること
  2. サーバー側で opt_local_infileが設定されていること
2.mysqldlocal_infileオプションなのでわかりやすい。単にデフォルトが5.7とそれ以前の “1” から8.0では “0” に変わったというだけ。
再起動しなくても SET GLOBALSET PERSISTで設定できる。
mysql80 125> SELECT @@local_infile;
+----------------+
| @@local_infile |
+----------------+
| 0 |
+----------------+
1 row in set (0.00 sec)

mysql80 125> SET PERSIST local_infile= 1;
Query OK, 0 rows affected (0.00 sec)

mysql80 125> SELECT @@local_infile;
+----------------+
| @@local_infile |
+----------------+
| 1 |
+----------------+
1 row in set (0.00 sec)
サーバー側( 2.)だけ満たされていても、コネクションに CLIENT_LOCAL_FILESケーパビリティー( 1.)はついてないのでやっぱり転ける。
同じエラーなので見分けにくい。
mysql80 125> LOAD DATA LOCAL INFILE '/tmp/aaa' INTO TABLE t1;
ERROR 1148 (42000): The used command is not allowed with this MySQL version
1.が満たされているかどうかをgdbを使わずに確かめる方法が見当たらなかったのだけれど、 mysqlコマンドラインクライアントであれば —local-infileオプションを有効にするとこのケーパビリティーのフラグが立つ。ただし接続しながら変えることはできないのでこっちは切断してから再接続する。
$ mysql80 --local-infile=1
mysql80> use d1
mysql80 132> LOAD DATA LOCAL INFILE '/tmp/md5' INTO TABLE t1;
サーバーサイドのlocal_infileとクライアントサイドのlocal_infileがそれぞれ別で、それぞれ暗黙のデフォルトが0になったから両方で指定しないといけないよ、というお話でした
ちなみにConnector/Cなら mysql_real_connectを呼ぶときに client_flagCLIENT_LOCAL_FILESを立てるか、 mysql_optionsMYSQL_OPT_LOCAL_INFILEを有効にしてやればおk。

Viewing all articles
Browse latest Browse all 581

Trending Articles