MySQLでファイル出力する際のエラー「ERROR 1227 (42000): Access denied; you need (at least one of) the FILE privilege(s) for this operation」の対処方法

目次

スポンサードリンク

MySQLでは、SQL実行時に SELECT … INTO OUTFILE 構文を使用すると結果をファイルに保存することができます。 また、FIELDS TERMINATED BY で各フィールドの区切り文字を指定できます。以下の構文は実行したSQLの結果を CSV形式でファイル保存します。

SELECT * FROM TABLE_NAME INTO OUTFILE /tmp/out.csv FIELDS TERMINATED BY ',';

発生するエラーと対処方法

私の手元でSQLを実行すると下記エラーとなりファイルを出力できませんでした。MySQLにログインしていたユーザーにFILE権限がないようだったので、他のユーザーで実行することにしました。

mysql> select * from TABLE_NAME INTO OUTFILE '/tmp/out.csv' FIELDS TERMINATED BY ',';
ERROR 1227 (42000): Access denied; you need (at least one of) the FILE privilege(s) for this operation

FILE権限を持つ rootユーザーで実行してみたら、今度は以下のエラーがでました。

mysql> select * from TABLE_NAME order INTO OUTFILE 'out.csv' FIELDS TERMINATED BY ',';
ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement

MySQLのサーバー変数 secure-file-priv が関係しているようです。

MySQLのサーバー変数 secure-file-priv

secure-file-priv は、データのインポートおよびエクスポート操作の影響を制限するための変数です。 secure-file-priv の値は、以下SQLで確認することができます。私の環境では、/var/lib/mysql-files/ となっていました。

mysql>  SHOW VARIABLES LIKE "secure_file_priv";
+------------------+-----------------------+
| Variable_name    | Value                 |
+------------------+-----------------------+
| secure_file_priv | /var/lib/mysql-files/ |
+------------------+-----------------------+
1 row in set (0.11 sec)

CSVファイルの出力先を、/var/lib/mysql-files/ 配下に変更してSQLを実行したところ、問題なくCSVファイルにSQL実行結果を出力することができました。

mysql> select * from TABLE_NAME INTO OUTFILE '/var/lib/mysql-files/out.csv' FIELDS TERMINATED BY ',';
Query OK, 10 rows affected (0.01 sec)


関連記事
MySQLでSQL結果をCSV出力する際に、ダブルクォーテーションでデータを囲む方法

関連リンク
https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_secure_file_priv


SQLパズル 第2版: プログラミングが変わる書き方/考え方
SQLに関する実践的な問題75問について解説した書籍。SQLで解決するものからテーブル設計自体を見直す解決方法など実践的なノウハウが学べる良書です。