BETA

Docker MySQL でLOAD_FILE()を使うとNULLになる問題の解決方法。

投稿日:2019-06-16
最終更新:2019-06-16

DockerでMySQL containerを立ち上げて LOAD_FILE() でINSERTしようとしたら、全てNULLになる問題に遭遇しました。

mysql> select hex(LOAD_FILE('/tmp/test.txt'));  
+---------------------------------+  
| hex(LOAD_FILE('/tmp/test.txt')) |  
+---------------------------------+  
| NULL                            |  
+---------------------------------+  
1 row in set (0.00 sec)  

MySQL version

mysql> SELECT @@version;  
+-----------+  
| @@version |  
+-----------+  
| 8.0.16    |  
+-----------+  
1 row in set (0.00 sec)  

Fileの権限などはOKでした。
MySQLは、secure_file_priv が設定されている場合、そのDirectoryにしかImport/Exportが出来ないようになります。
なので、確認してみます。

mysql> SHOW VARIABLES LIKE 'secure_file_priv';  
+------------------+-------+  
| Variable_name    | Value |  
+------------------+-------+  
| secure_file_priv | NULL  |  
+------------------+-------+  
1 row in set (0.00 sec)  

うーん、Docker のMySQLのContainerのDefaultは NULLだ。
とりあえずググって色々出てきたのを一通り確認してもダメ。

mysql> SELECT 'aabb' INTO OUTFILE '/tmp/test.txt';  
ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement  

これが怪しい。
ということで、以下に変更して解決しました。

解決方法 / Solved it

% docker run --name mysql  -e MYSQL_ROOT_PASSWORD=mysql -d -p 3306:3306 mysql --secure-file-priv='/'  

docker run に --secure-file-priv='/' を追加。
It set secure_file_priv to other than NULL.

確認。

mysql> SHOW VARIABLES LIKE 'secure_file_priv';  
+------------------+-------+  
| Variable_name    | Value |  
+------------------+-------+  
| secure_file_priv | /     |  
+------------------+-------+  
1 row in set (0.00 sec)  

これで取得出来ました。

mysql> SELECT hex(LOAD_FILE('/tmp/test.txt'));  
+---------------------------------+  
| hex(LOAD_FILE('/tmp/test.txt')) |  
+---------------------------------+  
| 616162620A                      |  
+---------------------------------+  
1 row in set (0.00 sec)  

mysql>  

secure_file_priv = NULL はダメみたいですね。(通常、何かしら設定されているので気がつかなかった)
ということで、公式Docの説明を見るとしっかり nullが設定されているとimport もexportも無効になる と書いてありました。

If set to NULL, the server disables import and export operations.  

https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_secure_file_priv

これ、secure_file_priv = NULL だと 直感的にそのまま書いてあることを意味を捉えると
secure file privilege is null = 安全なファイル特権は無効 = import/exportが制限なし と逆の意味に捉える人が多い気がしますね。

ご注意ください。

技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
or 外部アカウントで 登録 / ログイン する
クランチについてもっと詳しく

この記事が掲載されているブログ

@k-oguma (ktykogm) の技術ブログ

よく一緒に読まれる記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう
目次をみる
技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
or 外部アカウントではじめる
10秒で技術ブログが作れます!