我该如何处理MySQL中的--secure-file-priv?

Moh*_*asi 309 mysql database

我正在学习MySQL并尝试使用一个LOAD DATA子句.当我使用它如下:

LOAD DATA INFILE "text.txt" INTO table mytable;
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

MySQL服务器使用--secure-file-priv选项运行,因此无法执行此语句

我该如何处理这个错误?

我已经检查了同一错误消息的另一个问题,但仍无法找到解决方案.

我正在使用MySQL 5.6

vhu*_*vhu 410

它按预期工作.您的MySQL服务器已经使用--secure-file-priv选项启动,它基本上限制了您可以使用哪些目录加载文件LOAD DATA INFILE.

您可以使用SHOW VARIABLES LIKE "secure_file_priv";查看已配置的目录.

您有两种选择:

  1. 将文件移动到指定的目录secure-file-priv.
  2. 禁用secure-file-priv.必须从启动时删除,不能动态修改.为此,请检查MySQL启动参数(取决于平台)和my.ini.

  • 值:NULL.FML. (47认同)
  • 请注意,如果使用"select .. into outfile",则必须指定完整路径,并且完整路径必须与`SHOW VARIABLES LIKE"secure_file_priv"的结果匹配;; (7认同)
  • "检查参数"和"检查my.ini"不是一个很好的答案 (6认同)
  • 默认情况下,在W2012服务器上运行MySQL 5.6时,可以从"C:\ ProgramData\MySQL\MySQL Server 5.6"找到my.ini.您可能还想检查服务启动参数(例如--defaults-file ="C:\ ProgramData\MySQL\MySQL Server 5.6\my.ini),因为它们也可能列出`--secure-file-priv`本身. (3认同)
  • [如何禁用 my.ini 中的 secure-file-priv](https://superuser.com/questions/1088512/how-to-disable-secure-file-priv-mysql-ubuntu) (3认同)
  • @ Mohitbhasi,my-default.ini应该位于“ C:\ Program Files \ MySQL \ MySQL Server 5.6”文件夹中。vhu所指的位置是“ C:\ ProgramData \ MySQL \ MySQL Server 5.6”。以防万一您没有注意到。 (2认同)
  • 我正在使用一个 `LOAD DATA INFILE 'full_path\myfile.txt' ...` 查询,它仍然给出相同的错误,即使 `full_path\ ` *exactly* 匹配作为 `secure_file_priv` 值的字符串。问题仍然存在:**“我该如何解决这个错误?”** 下面的第二个答案(由 Staza 提供)回答了这个问题。 (2认同)
  • 我知道这可能在某个地方得到了回答,但亲爱的上帝,我必须寻找如何处理“MySql v8”。我必须手动找到我的 my.ini 文件并添加 secure-file-priv = ""`,否则无论我在 GUI 中输入什么内容,我都会不断收到相同的错误。 (2认同)

Sta*_*aza 213

我遇到过同样的问题.我终于使用LOCAL命令中的选项解决了问题

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

您可以在http://dev.mysql.com/doc/refman/5.7/en/load-data.html找到更多信息.

如果指定了LOCAL,则客户端主机上的客户端程序将读取该文件并将其发送到服务器.该文件可以作为完整路径名提供,以指定其确切位置.如果以相对路径名的形式给出,则相对于启动客户端程序的目录解释名称.

  • 对于mysql版本5.7.19,我得到了"这个MySQL版本不允许使用的命令". (10认同)
  • 我收到了MariaDB的错误消息:"ERROR 1148(42000):此MariaDB版本不允许使用该命令".确切版本:"mysql Ver 15.1 Distrib 10.1.22-MariaDB,for Linux(x86_64)using readline 5.2" (8认同)
  • MySQL 8.0 中的“此 MySQL 版本不允许使用的命令” (4认同)
  • @AlisonS 尝试在运行 `mysql` 时添加 `--local-infile` 标志。/sf/ask/753356761/ (3认同)
  • 这对我和其他人都有用.我试过:1.将我的txt文件上传到`C:\ ProgramData\MySQL\MySQL Server 5.7\Uploads`,2.在`my.ini`中禁用`secure_file_priv`并重启mysql 3.这一个!谢谢 :) (2认同)

Mus*_*afa 103

在Ubuntu 14和Mysql 5.5.53上,默认情况下启用此设置.要禁用它,您需要添加secure-file-priv = ""到mysqld配置组下的my.cnf文件.例如:-

[mysqld]
secure-file-priv = ""
Run Code Online (Sandbox Code Playgroud)

  • +1 为我工作。如果您使用的是 Ubuntu,请不要忘记重新启动 mysql 服务: sudo service mysql restart (2认同)
  • 注意:如果在 Docker 中执行此操作,则必须重新启动 Docker 容器。 (2认同)

Car*_*Med 33

我正在使用Debian上的MySQL5.7.11,这个命令对我有用,看看目录是:

mysql> SELECT @@ global.secure_file_priv;

  • 那你怎么编辑呢?我试图在/etc/mysql/my.cnf中对其进行编辑,但似乎没有效果-保持NULL (2认同)

gar*_*ert 20

如果文件是您的计算机的本地文件,请在命令中使用LOCAL

LOAD DATA LOCAL INFILE "text.txt" INTO table mytable;
Run Code Online (Sandbox Code Playgroud)


Ram*_*ath 18

以下是在Windows 7中禁用的功能secure-file-priv(vhu的答案中的选项#2 ):

  1. 进入,停止MySQL服务器服务services.msc.
  2. 转到C:\ProgramData\MySQL\MySQL Server 5.6(ProgramData在我的案例中是一个隐藏的文件夹).
  3. my.ini在记事本中打开该文件.
  4. 搜索'secure-file-priv'.
  5. 通过在行的开头添加"#"来注释掉行.
  6. 保存文件.
  7. 通过进入启动MySQL服务器服务secure-file-priv="".

对于MySQL Server 5.7.16及更高版本,请参阅下面的dbc评论.

  • 从MySQL Server 5.7.16开始,注释掉该行将不起作用,因为它将恢复为默认值,从而禁用导入和导出操作.如果要允许来自任何目录的这些操作,现在需要将其设置为空字符串. (14认同)
  • 对于 Windows 确保使用正斜杠 (3认同)

Nel*_*les 17

在发布此帖子时,该线程已被查看 57 万次。老实说,MySQL 什么时候成为我们过度保护不合理的妈妈了?多么耗时的安全尝试 - 这实际上只会束缚我们!

经过多次搜索和多次尝试,一切都失败了。我的解决方案:

对我有用的是:

  1. .csv在旧的机器上通过 PhpMyAdmin 导入导入文件(如果在 cmd 行做大的话)
  2. 生成.sql文件。
  3. 下载.sql文件。
  4. .sql通过 MySQL Workbench导入文件。


小智 12

@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

然后,当我用它运行它时,它就起作用了。唯一的区别是斜线的方向。

  • 是的,是的,为什么这个答案这么低。我挣扎了很长时间然后得到了。我回来添加这个作为答案,但它太低了,我在浪费时间之前没有看到它。 (3认同)
  • 不是所有的英雄穿着斗篷。 (3认同)
  • 太棒了,这正是 MySql 8.0 上的问题 (2认同)

Rsc*_*Rsc 8

我在'secure-file-priv'中遇到了同样的问题.在.ini文件中注释不起作用,也没有在'secure-file-priv'指定的目录中移动文件.

最后,正如dbc建议的那样,使'secure-file-priv'等于空字符串.因此,如果有人在尝试上面的答案后被卡住了,希望这样做会有所帮助.


小智 8

对于 mysql 8.0 版本,您可以这样做:

mysql.server stop
mysql.server start --secure-file-priv=''
Run Code Online (Sandbox Code Playgroud)

它在 Mac High Sierra 上对我有用。


not*_*off 5

我遇到了各种各样的问题。我正在更改 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=$?
Run Code Online (Sandbox Code Playgroud)

$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=$?
Run Code Online (Sandbox Code Playgroud)


Vin*_*uza 5

对我有用的东西:

  1. 将文件放入中指定的文件夹中secure-file-priv

要找到该类型:

mysql>显示类似“ secure_file_priv”的变量;


  1. 检查你是否有local_infile = 1

输入以下内容:

mysql>显示类似“ local_infile”的变量;

如果你得到:

+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| local_infile  | OFF   |
+---------------+-------+
Run Code Online (Sandbox Code Playgroud)

然后将其设置为一种输入:

mysql>设置全局local_infile = 1;


  1. 指定文件的完整路径。就我而言:

mysql>将文件“ C:/ ProgramData / MySQL / MySQL Server 8.0 / Uploads / file.txt”中的数据加载到表测试中;


Kev*_*son 5

如果您在 Ubuntu 上运行,您可能还需要配置 Apparmor 以允许 MySQL 写入您的文件夹,例如,这是我的配置:

将此行添加到文件 /etc/apparmor.d/usr.sbin.mysqld :

/var/lib/mysql-files/* rw
Run Code Online (Sandbox Code Playgroud)

然后将这 2 行配置添加到 /etc/mysql/my.cnf 部分:

[client]
loose-local-infile = 1

[mysqld]
secure-file-priv = ""
Run Code Online (Sandbox Code Playgroud)

这是我的 SQL:

select id from blahs into outfile '/var/lib/mysql-files/blahs';
Run Code Online (Sandbox Code Playgroud)

它对我有用。祝你好运!


Nel*_*les 5

如果您正在运行 NodeJS 并且数据采用以下形式(双引号 + 逗号和 \n 新行),我创建了一个 NodeJS 导入脚本

INSERT INTO <your_table> VALUEs( **CSV LINE **)
Run Code Online (Sandbox Code Playgroud)

该配置被配置为在http://localhost:5000/import上运行。

我逐行创建查询字符串

"city","city_ascii","lat","lng","country","iso2","iso3","id"
"Tokyo","Tokyo","35.6850","139.7514","Japan","JP","JPN","1392685764",
...
Run Code Online (Sandbox Code Playgroud)

服务器.js

INSERT INTO <your_table> VALUEs( **CSV LINE **)
Run Code Online (Sandbox Code Playgroud)

导入路由.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;
Run Code Online (Sandbox Code Playgroud)

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;

Run Code Online (Sandbox Code Playgroud)

免责声明: 这不是一个完美的解决方案 - 我只是将其发布给那些在时间线下并且有大量数据要导入并且遇到这个荒谬问题的开发人员。我在这方面浪费了很多时间,我希望其他开发人员也能节省同样的时间。


归档时间:

查看次数:

471993 次

最近记录:

6 年 前