web-dev-qa-db-ja.com

MySQLで--secure-file-privにどのように取り組むべきですか?

私はMySQLを学んでいて、LOAD DATA節を使ってみました。私が以下のようにそれを使ったとき:

LOAD DATA INFILE "text.txt" INTO table mytable;

次のようなエラーが出ました。

MySQLサーバーは--secure-file-privオプションで実行されているため、このステートメントを実行できません

このエラーにどう対処すればよいですか。

同じエラーメッセージに関する別の質問 を確認しましたが、それでも解決策が見つかりません。

MySQL 5.6を使用しています

264
Mohit Bhasi

意図したとおりに機能しています。 MySQLサーバは --secure-file-priv オプションで起動されています。これは基本的にどのディレクトリからLOAD DATA INFILEを使用してファイルをロードできるかを制限します。

設定されたディレクトリを見るためにSHOW VARIABLES LIKE "secure_file_priv";を使うことができます。

2つの選択肢があります。

  1. ファイルをsecure-file-privで指定されたディレクトリに移動します。
  2. secure-file-privを無効にします。これは起動時から削除する必要があり、動的に変更することはできません。これを行うには、MySQLの起動パラメータ(プラットフォームによって異なります)およびmy.iniを確認してください。
357
vhu

私は同じ問題を抱えていました。コマンドでLOCALオプションを使用してようやく解決しました

LOAD DATA LOCAL INFILE "text.txt" INTO TABLE mytable;

あなたはここでより多くの情報を見つけることができます http://dev.mysql.com/doc/refman/5.7/en/load-data.html

LOCALが指定されている場合、ファイルはクライアントホスト上のクライアントプログラムによって読み取られ、サーバーに送信されます。ファイルは、正確な場所を指定するためのフルパス名として指定できます。相対パス名として指定された場合、名前はクライアントプログラムが起動されたディレクトリからの相対パスとして解釈されます。

187
Staza

Ubuntu 14とMysql 5.5.53では、この設定はデフォルトで有効になっているようです。これを無効にするには、mysqld設定グループの下のmy.cnfファイルにsecure-file-priv = ""を追加する必要があります。例えば:-

[mysqld]
secure-file-priv = ""
94
Mustafa

私はDebian上でMySQL5.7.11に取り組んでいます。ディレクトリを確認するために使用したコマンドは次のとおりです。

mysql> SELECT @@ global.secure_file_priv;

29
Carlos Med

ファイルがあなたのマシンにローカルであるなら、あなたのコマンドで _ local _ を使用してください。

LOAD DATA LOCAL INFILE "text.txt" INTO table mytable;
16
garyrgilbert

これがsecure-file-privを無効にするために私がWindows 7で働いていたものです( vhu's answer からのOption#2):

  1. services.mscに入ってMySQLサーバーサービスを停止します。
  2. C:\ProgramData\MySQL\MySQL Server 5.6に行きます(私の場合はProgramDataは隠しフォルダーでした)。
  3. メモ帳でmy.iniファイルを開きます。
  4. 'secure-file-priv'を検索してください。
  5. 行頭に '#'を付けてコメントアウトしてください。 MySQL Server 5.7.16以降では、コメントは機能しません。このように空の文字列に設定する必要があります - secure-file-priv=""
  6. ファイルを保存してください。
  7. services.mscに入ってMySQLサーバーサービスを開始します。
14
Ramnath

私は「secure-file-priv」と同じ問題を抱えていました。 .iniファイル内のコメントは機能せず、 'secure-file-priv'で指定されたディレクトリにファイルを移動することもできませんでした。

最後に、dbcが示唆しているように、 'secure-file-priv'を空の文字列と同じにすることでうまくいきました。したがって、誰かが上記の答えを試した後に動けなくなった場合、うまくいけばこれを行うのが役に立つでしょう。

7
Rsc Rsc

私のために働いたこと:

  1. ファイルをsecure-file-privで指定されたフォルダの中に置きます。

その種類を見つけるには:

mysql> "secure_file_priv"のような変数を表示する。


  1. local_infile = 1があるか確認してください。

次のように入力してください。

mysql> "local_infile"のような変数を表示する。

あなたが取得する場合:

+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| local_infile  | OFF   |
+---------------+-------+

それからそれを1つのタイプに設定します。

mysql> set global local_infile = 1;


  1. ファイルのフルパスを指定してください。私の場合:

mysql>データinfile "C:/ ProgramData/MySQL/MySQL Server 8.0/Uploads/file.txt"をテーブルtestにロードします。

4
Vinícius Souza

これにはいろいろな問題がありました。私は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=$?
3
notthehoff

@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

それからそれを実行したとき、それはうまくいった。唯一の違いはスラッシュの方向です。

2
wolfsshield

私はwindows 10でこの問題を抱えていました。

  1. ウィンドウズ検索(左下)で「powershell」と入力しました。
  2. PowerShellを右クリックして管理者として実行しました。
  3. サーバーのbinファイルに移動しました。 (C:¥Program Files¥MySQL¥MySQL Server 5.6¥bin);
  4. ./mysqldと入力した
  5. エンターキーを押す

サーバーは期待どおりに起動しました。

1
Jason Allshorn

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';

それは私のために働いた。がんばろう!

1

MySQLはこのシステム変数を使用してファイルをインポートできる場所を制御します。

mysql> SHOW VARIABLES LIKE "secure_file_priv";
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| secure_file_priv | NULL  |
+------------------+-------+

だから問題はsecure_file_privのようなシステム変数を変更する方法です。

  1. シャットダウンmysqld
  2. Sudo mysqld_safe --secure_file_priv=""

今、あなたはこのように見えるかもしれません:

mysql> SHOW VARIABLES LIKE "secure_file_priv";
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| secure_file_priv |       |
+------------------+-------+
1
bitfishxyz

Mysql 8.0バージョンでは、これを行うことができます。

  1. mysql.server stop
  2. mysql.server start --secure-file-priv = ''

Mac High Sierraで動作しました

0
Ruslan Krupenko