MySQLで--secure-file-privに取り組むにはどうすればよいですか?


357

MySQLを学習して、LOAD DATA句を使用してみました。以下のように使用した場合:

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

次のエラーが発生しました:

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

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

同じエラーメッセージ別の質問を確認しましたが、解決策が見つかりません。

MySQL 5.6を使用しています


csvファイルのパスを共有
Zafar Malik

1
もちろん、mysqldump --tabmysqlから独自のデータを取得するのが難しくないかのように、を使用しようとすると、このエラーが発生します。
William Entriken 2017年

1
vhuの回答に加えて、wolfsshieldの回答を以下で検索してください。'/'に切り替えて機能させる必要があります(私はwin10を使用しています)
Rsc Rsc

4
LOCALを使用します。 LOAD DATA LOCAL INFILE ...
mpoletto

回答:


473

意図したとおりに機能しています。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を確認します。

4
W2012サーバーでMySQL 5.6を実行している場合、my.iniはデフォルトで「C:\ ProgramData \ MySQL \ MySQL Server 5.6」から見つかります。あなたはまた、(例えば--defaults-ファイル= "C:\はProgramData \のMySQL \ MySQLサーバ5.6 \ my.iniファイルを)サービスの起動パラメータを確認したいことがあり、彼らはまた、リストアップするよう--secure-file-priv。自分自身を
vhu

2
@ Mohitbhasi、my-default.iniは「C:\ Program Files \ MySQL \ MySQL Server 5.6」フォルダーにあります。vhuが参照していた場所は「C:\ ProgramData \ MySQL \ MySQL Server 5.6」です。気づかなかった場合のために。
NurShomik

67
値:NULL。FML。
William Entriken 2017年

11
注「OUTFILEに...選択」を使用する場合は、フルパスを指定する必要があり、完全なパスは、の結果と一致しなければならないことSHOW VARIABLES LIKE "secure_file_priv";
TheSatinKnightを

9
「パラメータをチェックする」と「my.iniをチェックする」はあまり良い答えではありません
Roland Seuhs

234

同じ問題がありました。LOCALコマンドのオプションを使用してようやく解決しました

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

詳細については、http://dev.mysql.com/doc/refman/5.7/en/load-data.htmlをご覧ください。

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


2
これは私にとってはうまくいき、他ではうまくいきませんでした。私が試した:1.でtxtファイルをアップロードするC:\ProgramData\MySQL\MySQL Server 5.7\Uploads、2. mysqlを無効にsecure_file_privmy.iniて再起動する3.これは!ありがとう:)
Kamal Nayan

10
MariaDBに対して次のエラーメッセージが表示されました:「ERROR 1148(42000):The used command is not allowed with this MariaDB version」。正確なバージョン:「mysql Ver 15.1 Distrib 10.1.22-MariaDB、for Linux(x86_64)using readline 5.2」
jciloa

11
mysqlバージョン5.7.19で「使用されたコマンドはこのMySQLバージョンでは許可されていません」というメッセージが表示されました。
アリソンS

2
@AlisonS --local-infile実行時にフラグを追加してみてくださいmysqlstackoverflow.com/questions/10762239/...
Illya Moskvin

1
The used command is not allowed with this MySQL versionMySQLの8.0から
bitfishxyz

117

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

[mysqld]
secure-file-priv = ""

1
これも私にとってはうまくいきました。UbuntuとMySQLの同じバージョン
Rodney

1
+1うまくいきました。sudoのサービスMySQLの再起動:Ubuntuを使用している場合は、再起動のMySQLサービスを忘れないでください
エミリアーノSangoi

1
これは、必要に応じてステートメントごとに選択した場所を指す必要がある場合に機能します。これは、説明したとおり、Windows Server上のMySQL 5.7で動作します。あなたは、単にのような行をコメントアウトした場合# secure-file-priv = ~、それはまだのように値を示すことからエラーを持っているNULLこの方法は、あなたは、サーバー上になどをエクスポートすることができますどのディレクトリピックアップしたい問題を解決し、それをやって
ビットコイン殺人マニアック

1
Windows上のMySQL 5.7で私のために働いたが、他のソリューションはそうしなかった。
CGritton 2018

注意:Dockerでこれを行う場合は、Dockerコンテナを再起動する必要があります。
user1717828

38

私はDebianでMySQL5.7.11に取り組んでいます。ディレクトリを表示するために機能したコマンドは次のとおりです。

mysql> SELECT @@global.secure_file_priv;

SHOW VARIABLES LIKE "secure_file_priv";私が得るERROR 1146 (42S02): Table 'performance_schema.session_variables' doesn't existも、他の状況でスローされ、私は最終的に対処する必要があろう。SELECT @@global.secure_file_priv;コマンドはしかし期待される結果を生成します。
Majid Fouladpour 2017年

1
これは私にとってうまくいきました-Ubuntu Mysql 5.7.21:出力ファイルをディレクトリ/var/lib/mysql-files/output.txtに変更しました
Shanemeister

2
それをどのように編集しますか?私は/etc/mysql/my.cnfで編集し、それを試してみましたが、効果がないようだ-それはNULLのまま
Slavik

24

これは、Windows 7で私が無効にするために機能したものですsecure-file-privvhuの回答のオプション#2 )。

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

16
MySQL Server 5.7.16以降では、行をコメント化しても機能しません。これにより、デフォルトに戻り、インポートおよびエクスポート操作が無効になります。任意のディレクトリからこれらの操作を許可する場合は、空の文字列に設定する必要があります。
dbc 2016年

1
ラムナス、5.7.xバージョンの@dbc詳細で回答を編集してください。ありがとう。
ラファエルゴメスサンフランシスコ

空の文字列を追加するとうまくいきます。答えを変更して、secure-file-priv = ""などの空の文字列を追加してください
Rajesh Goel

Windowsの場合は必ずスラッシュを使用してください
Oliver Oliver

22

ファイルがマシンに対してローカルである場合は、コマンドでLOCALを使用します

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

14

@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

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


あなたの答えは私にとってうまくいきました、多くのことを感謝します
benaou mouad '25

はいはいはい...なぜこれまでのところこの答えですか?私は長い間苦労して、それを手に入れました。私はこれを答えとして追加するために戻ってきましたが、あまりにも遠いので、時間を無駄にする前に表示されませんでした。
Rsc Rsc

すべての英雄はマントを着用していません。
JRK

8

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

最後に、dbcが提案したように、「secure-file-priv」を空の文字列と等しくすることができました。したがって、上記の回答を試しても誰かが行き詰まっている場合、うまくいけばこれが役立つでしょう。


8

私のために働いたもの:

  1. で指定したフォルダ内にファイルを置きますsecure-file-priv

そのタイプを見つけるには:

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


  1. あなたが持っているかどうかを確認してくださいlocal_infile = 1

次のように入力します。

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

あなたが取得する場合:

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

次に、1つの入力に設定します。

mysql>グローバルlocal_infile = 1を設定します。


  1. ファイルの完全パスを指定します。私の場合:

mysql>ファイル「C:/ ProgramData / MySQL / MySQL Server 8.0 / Uploads / file.txt」のデータをテーブルテストにロードします。


6

この投稿の時点で、このスレッドは522k回閲覧されています。正直なところ、MySQLはいつ私たちを保護するための無理なママになりましたかか?セキュリティに対する時間のかかる試み-これは本当に私たちを束縛するためだけに役立ちます!

多くの検索と試行の結果、すべてが失敗しました。
私の解決策:

  1. 古いボックスのPhpMyAdminインポートを介して.csvファイルをインポートします(コマンドラインで大きい場合)
  2. .sqlファイルを生成する
  3. .sqlファイルをダウンロードする
  4. MySQLワークベンチ経由で.sqlファイルをインポートする

3

私はこれに関してあらゆる種類の問題を抱えていました。私は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

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

それは私のために働いた。幸運を!


はい、 "/ var / lib / mysql-files / filename.csv"を使用してファイルパスを指定するとうまくいきました。
Anidhya Bhatnagar

3

mysql 8.0バージョンの場合、これを行うことができます。

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

Mac High Sierraではうまくいきました


3

nodeJSを実行していて、データが次の形式の場合、NodeJSインポートスクリプトを作成しました(二重引用符+カンマと\ n改行)

INSERT INTO <your_table> VALUEs( **CSV LINE **)

これはhttp:// localhost:5000 / importで実行するように構成されています。

私は行く行ずつ、クエリ文字列を作成します

"city","city_ascii","lat","lng","country","iso2","iso3","id"
"Tokyo","Tokyo","35.6850","139.7514","Japan","JP","JPN","1392685764",
...

server.js

const express = require('express'),
   cors = require('cors'),
   bodyParser = require('body-parser'),
   cookieParser = require('cookie-parser'),
   session = require('express-session'),
   app = express(),
   port = process.env.PORT || 5000,
   pj = require('./config/config.json'),
   path = require('path');

app.use(bodyParser.json());
app.use(cookieParser());
app.use(cors());


app.use(
   bodyParser.urlencoded({
      extended: false,
   })
);

var Import = require('./routes/ImportRoutes.js');

app.use('/import', Import);
if (process.env.NODE_ENV === 'production') {
   // set static folder
   app.use(express.static('client/build'));

   app.get('*', (req, res) => {
      res.sendFile(path.resolve(__dirname, 'client', 'build', 'index.html'));
   });
}

app.listen(port, function () {
   console.log('Server is running on port: ' + port);
});

ImportRoutes.js

const express = require('express'),
   cors = require('cors'),
   fs = require('fs-extra'),
   byline = require('byline'),
   db = require('../database/db'),
   importcsv = express.Router();

importcsv.use(cors());

importcsv.get('/csv', (req, res) => {

   function processFile() {
      return new Promise((resolve) => {
         let first = true;
         var sql, sqls;
         var stream = byline(
            fs.createReadStream('../PATH/TO/YOUR!!!csv', {
               encoding: 'utf8',
            })
         );

         stream
            .on('data', function (line, err) {
               if (line !== undefined) {
                  sql = 'INSERT INTO <your_table> VALUES (' + line.toString() + ');';
                  if (first) console.log(sql);
                  first = false;
                  db.sequelize.query(sql);
               }
            })
            .on('finish', () => {
               resolve(sqls);
            });
      });
   }

   async function startStream() {
      console.log('started stream');
      const sqls = await processFile();
      res.end();
      console.log('ALL DONE');
   }

   startStream();
});

module.exports = importcsv;

db.jsは設定ファイルです

const Sequelize = require('sequelize');
const db = {};
const sequelize = new Sequelize(
   config.global.db,
   config.global.user,
   config.global.password,
   {
      host: config.global.host,
      dialect: 'mysql',
      logging: console.log,
      freezeTableName: true,

      pool: {
         max: 5,
         min: 0,
         acquire: 30000,
         idle: 10000,
      },
   }
);

db.sequelize = sequelize;
db.Sequelize = Sequelize;

module.exports = db;

免責事項: これは完全な解決策ではありません。私は、タイムラインの下にあり、インポートするデータが多く、このとんでもない問題に遭遇している開発者にのみ投稿します。私はこれで多くの時間を失いました、そして私は同じ失われた時間を別の開発者を惜しまないことを望みます。


1

Windows 10でこの問題が発生しました。「MySQLの--secure-file-priv」これを解決するために、次のことを行いました。

  1. Windows検索(左下)で「powershell」と入力しました。
  2. powershellを右クリックして、管理者として実行しました。
  3. サーバーのbinファイルに移動します。(C:\ Program Files \ MySQL \ MySQL Server 5.6 \ bin);
  4. タイプされた./mysqld
  5. 「Enter」を押す

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


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 |       |
+------------------+-------+

0

macOSカタリナで、私はこの手順に従って設定しました secure_file_priv

1.MySQLサービスを停止する

 sudo /usr/local/mysql/support-files/mysql.server stop

2. --secure_file_privシステム変数を割り当ててMYSQLを再起動します。

sudo /usr/local/mysql/support-files/mysql.server start --secure-file-priv=YOUR_FILE_DIRECTORY

注:空の値を追加すると問題が修正され、MYSQLはデータをディレクトリ/ usr / local / mysql / data / YOUR_DB_TABLE / EXPORT_FILEにエクスポートします

sudo /usr/local/mysql/support-files/mysql.server start --secure-file-priv=

ありがとう


0

構成ファイルを変更せずに。

  1. secure_file_priv@vhu:によって投稿されたコマンドを使用することの価値を探しますSHOW VARIABLES LIKE "secure_file_priv"
  2. 次のようなクエリの完全パスを定義します。 select * from table into outfile 'secure_file_priv_PATH/OUTPUT-FILE' ... rest of your query

これは、ubuntu 18.04 LTS mysql 5.7.29のmysql-shellで機能しました

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.