私はMySQLを学んでいて、LOAD DATA
節を使ってみました。私が以下のようにそれを使ったとき:
LOAD DATA INFILE "text.txt" INTO table mytable;
次のようなエラーが出ました。
MySQLサーバーは--secure-file-privオプションで実行されているため、このステートメントを実行できません
このエラーにどう対処すればよいですか。
同じエラーメッセージに関する別の質問 を確認しましたが、それでも解決策が見つかりません。
MySQL 5.6を使用しています
意図したとおりに機能しています。 MySQLサーバは --secure-file-priv オプションで起動されています。これは基本的にどのディレクトリからLOAD DATA INFILE
を使用してファイルをロードできるかを制限します。
設定されたディレクトリを見るためにSHOW VARIABLES LIKE "secure_file_priv";
を使うことができます。
2つの選択肢があります。
secure-file-priv
で指定されたディレクトリに移動します。secure-file-priv
を無効にします。これは起動時から削除する必要があり、動的に変更することはできません。これを行うには、MySQLの起動パラメータ(プラットフォームによって異なります)およびmy.iniを確認してください。私は同じ問題を抱えていました。コマンドでLOCAL
オプションを使用してようやく解決しました
LOAD DATA LOCAL INFILE "text.txt" INTO TABLE mytable;
あなたはここでより多くの情報を見つけることができます http://dev.mysql.com/doc/refman/5.7/en/load-data.html
LOCALが指定されている場合、ファイルはクライアントホスト上のクライアントプログラムによって読み取られ、サーバーに送信されます。ファイルは、正確な場所を指定するためのフルパス名として指定できます。相対パス名として指定された場合、名前はクライアントプログラムが起動されたディレクトリからの相対パスとして解釈されます。
Ubuntu 14とMysql 5.5.53では、この設定はデフォルトで有効になっているようです。これを無効にするには、mysqld設定グループの下のmy.cnfファイルにsecure-file-priv = ""
を追加する必要があります。例えば:-
[mysqld]
secure-file-priv = ""
私はDebian上でMySQL5.7.11に取り組んでいます。ディレクトリを確認するために使用したコマンドは次のとおりです。
mysql> SELECT @@ global.secure_file_priv;
ファイルがあなたのマシンにローカルであるなら、あなたのコマンドで _ local _ を使用してください。
LOAD DATA LOCAL INFILE "text.txt" INTO table mytable;
これがsecure-file-priv
を無効にするために私がWindows 7で働いていたものです( vhu's answer からのOption#2):
services.msc
に入ってMySQLサーバーサービスを停止します。C:\ProgramData\MySQL\MySQL Server 5.6
に行きます(私の場合はProgramData
は隠しフォルダーでした)。my.ini
ファイルを開きます。secure-file-priv=""
services.msc
に入ってMySQLサーバーサービスを開始します。私は「secure-file-priv」と同じ問題を抱えていました。 .iniファイル内のコメントは機能せず、 'secure-file-priv'で指定されたディレクトリにファイルを移動することもできませんでした。
最後に、dbcが示唆しているように、 'secure-file-priv'を空の文字列と同じにすることでうまくいきました。したがって、誰かが上記の答えを試した後に動けなくなった場合、うまくいけばこれを行うのが役に立つでしょう。
私のために働いたこと:
secure-file-priv
で指定されたフォルダの中に置きます。その種類を見つけるには:
mysql> "secure_file_priv"のような変数を表示する。
local_infile = 1
があるか確認してください。次のように入力してください。
mysql> "local_infile"のような変数を表示する。
あなたが取得する場合:
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| local_infile | OFF |
+---------------+-------+
それからそれを1つのタイプに設定します。
mysql> set global local_infile = 1;
mysql>データinfile "C:/ ProgramData/MySQL/MySQL Server 8.0/Uploads/file.txt"をテーブルtestにロードします。
これにはいろいろな問題がありました。私はmy.cnfと、この問題の他のバージョンが見せようとしていたいろいろな種類の変わったことを変更していました。
私にとってうまくいったこと:
私が得ていたエラー
The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
/usr/local/mysql/support-files/mysql.serverを開き、次の行を変更することで修正できました。
$bindir/mysqld_safe --datadir="$datadir" --pid-file="$mysqld_pid_file_path" -- $other_args >/dev/null &
wait_for_pid created "$!" "$mysqld_pid_file_path"; return_value=$?
に
$bindir/mysqld_safe --datadir="$datadir" --pid-file="$mysqld_pid_file_path" --secure-file-priv="" $other_args >/dev/null &
wait_for_pid created "$!" "$mysqld_pid_file_path"; return_value=$?
@vhu
私はSHOW VARIABLES LIKE "secure_file_priv";
をしました、そしてそれはC:\ProgramData\MySQL\MySQL Server 8.0\Uploads\
を返しました、それでそれを差し込んだとき、それはまだうまくいきませんでした。
My.iniファイルに直接アクセスしたところ、パスの形式が少し違うことがわかりました。C:/ProgramData/MySQL/MySQL Server 8.0/Uploads
それからそれを実行したとき、それはうまくいった。唯一の違いはスラッシュの方向です。
私はwindows 10でこの問題を抱えていました。
サーバーは期待どおりに起動しました。
Ubuntuで実行している場合は、MySQLがフォルダーに書き込むことができるようにApparmorを構成する必要があります。ここに私の設定があります:
この行をファイル/etc/apparmor.d/usr.sbin.mysqldに追加します。
/var/lib/mysql-files/* rw
次に、これらの2つの構成行を/etc/mysql/my.cnfセクションに追加します。
[client]
loose-local-infile = 1
[mysqld]
secure-file-priv = ""
これが私のSQLです。
select id from blahs into outfile '/var/lib/mysql-files/blahs';
それは私のために働いた。がんばろう!
MySQLはこのシステム変数を使用してファイルをインポートできる場所を制御します。
mysql> SHOW VARIABLES LIKE "secure_file_priv";
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| secure_file_priv | NULL |
+------------------+-------+
だから問題はsecure_file_priv
のようなシステム変数を変更する方法です。
mysqld
Sudo mysqld_safe --secure_file_priv=""
今、あなたはこのように見えるかもしれません:
mysql> SHOW VARIABLES LIKE "secure_file_priv";
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| secure_file_priv | |
+------------------+-------+
Mysql 8.0バージョンでは、これを行うことができます。
Mac High Sierraで動作しました