Error Code: 1290. The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
MySQLのテーブルにデータを入れようとすると Error Code: 1290
が発生する場合がある。
新しく用意されたDBに触る際によく起こるエラーなので、今回はこのエラーについて解説する。
Error Code: 1290 とは?
The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
直訳するなら以下のようになる。
MySQLサーバーは--secure-file-privのオプションで動いているのでこの命令は実行できません
つまり --secure-file-priv
が何かわかれば解決できる。
では--secure-file-privとは?
MySQLの公式サイトには以下のように書かれている。
このオプションは、LOAD_FILE() 関数と LOAD DATA および SELECT ... INTO OUTFILE ステートメントの効果を制限し、指定されたディレクトリ内のファイルにのみ作用します。
MySQL :: MySQL 5.6 リファレンスマニュアル :: 5.1.3 サーバーコマンドオプション
ファイルを扱うSQLを指定されたディレクトリ(フォルダ)の中でしか動かないようにする為の制限、ということになる。
エラーを回避するには
オプションによってSQLが制限されているのであれば、回避する方法は2つ。
- オプションの制限に従うようにSQLを実行する
- オプションをオフにする
[方法1] オプションの制限に従うようにSQLを実行する
オプションの制限に従うようにSQLを実行するには指定されたディレクトリを知る必要がある。
secure_file_priv
で指定されているディレクトリは以下のSQLで確認できる。
SELECT @@global.secure_file_priv;
しかしこの後、以下を試してみたがうまくデータを取り込めなかった。
- ディレクトリにcsvファイルを置いて
LOAD DATA INFILE
を実行 LOAD DATA INFILE
で指定するcsvファイルとしてディレクトリ付きのフルパス指定
従ってこの方法については実行方法を模索中である。
[方法2] オプションをオフにする
--secure-file-priv
のオプションを無効化してしまおうというもの。
こちらの手段は検索した際によく出てきた。
オプションの無効化方法は設定ファイルを書き換えて再起動となる。
設定ファイルの場所はMySQLのインストール場所によりけりだが、大体以下の通り。
Windows
C:\ProgramData\MySQL\(MySQLのバージョン)\my.ini
Linux(左から順に読み込んで最後の内容で上書きされる)
/etc/my.cnf /etc/mysql/my.cnf /usr/local/etc/my.cnf ~/.my.cnf
参考
* 【Windows】MySQL Server5.7 のmy.cnfファイルの場所 - Qiita
* my.cnfの場所を調べる - Qiita
ファイルが見つかれば中身を見て secure-file-priv
の値を空白 ""
で設定して再起動すれば終了。
secure-file-priv = ""
まとめ
Error Code: 1290
はMySQLにディレクトリの読み書きの制限がかかっているので発生する- 回避方法は
my.ini
またはmy.cnf
にsecure-file-priv = ""
を設定する