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で解決するものからテーブル設計自体を見直す解決方法など実践的なノウハウが学べる良書です。
Search
Recent Posts
- Apacheの起動状態をチェックして停止してる場合にApacheを起動するシェルスクリプト
- Amazon LinuxのOSバージョンを調べる方法|/etc/redhat-release の代替ファイル
- MYSQLでダンプファイルを取得する際に発生したエラー「Couldn't execute 'SELECT BINLOG_GTID_POS('', '0')': You are not using binary logging (1381)」の原因と対処方法
- RHEL系Linuxでリポジトリを一覧表示するコマンド(dnf repolist)
- .php以外の拡張子でPHPを動作させようとして発生したエラー「Got error 'Access to the script '/var/www/html/php.html' has been denied (see security.limit_extensions)'」の原因と対処方法