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

时间:2015-09-23 10:43:53

标签: mysql database

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

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

我收到以下错误:

  

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

如何解决此错误?

我已查看another question on the same error message,但仍无法找到解决方案。

我正在使用MySQL 5.6

23 个答案:

答案 0 :(得分:359)

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

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

您有两种选择:

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

答案 1 :(得分:188)

我有同样的问题。我终于使用命令

中的LOCAL选项解决了问题

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

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

  

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

答案 2 :(得分:94)

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

secure-file-priv = ""

答案 3 :(得分:29)

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

的MySQL> SELECT @@ global.secure_file_priv;

答案 4 :(得分:16)

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

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

答案 5 :(得分:14)

以下是Windows 7中禁用secure-file-privvhu's answer选项#2)的功能:

  1. 进入services.msc
  2. 停止MySQL服务器服务
  3. 转到C:\ProgramData\MySQL\MySQL Server 5.6ProgramData在我的案例中是一个隐藏文件夹。)
  4. 在记事本中打开my.ini文件。
  5. 搜索' secure-file-priv'。
  6. 通过添加'#'来评论该行。在线的开头。对于MySQL Server 5.7.16及更高版本,评论不起作用。你必须将它设置为像这样的空字符串 - secure-file-priv=""
  7. 保存文件。
  8. 进入services.msc
  9. 启动MySQL服务器服务

答案 6 :(得分:13)

在撰写本文时,该线程已被查看了570k次。老实说,MySQL什么时候成为我们过度保护的不合理妈妈?多么费时的安全尝试-确实只会束缚我们!

经过多次搜索和多次尝试后,所有操作均失败。 我的解决方案:

对我有用的是:

  1. 通过PhpMyAdmin导入将.csv文件导入较旧的框(如果在cmd行较大的话)
  2. 生成一个.sql文件。
  3. 下载.sql文件。
  4. 通过MySQL Workbench导入.sql文件。

答案 7 :(得分:7)

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

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

答案 8 :(得分:5)

对我有用的东西:

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

要找到该类型:

  

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


  1. 检查您是否有local_infile = 1

输入以下内容:

  

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

如果得到:

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

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

  

mysql>设置全局local_infile = 1;


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

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

答案 9 :(得分:4)

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

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;

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

答案 10 :(得分:4)

@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

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

答案 11 :(得分: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=$?

答案 12 :(得分:3)

这对我有用(还有另一个问题,即在语句LOAD DATE INFILE ...中无法与当前的MySQL版本一起使用LOCAL)

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

以上内容适用于我机器上的给定路径;您可能需要调整路径。

然后使用:

mysql -u root -p

重要的一点是,您应该在MySQL数据文件夹中包含CSV。在我的机器中,它位于:/usr/local/mysql-8.0.18-macos10.14-x86_64/data

如果需要,可以更改文件夹权限,以便在数据文件夹中添加CSV。

设置:
macOS Catalina版本10.15.5
MySQL版本8.0.18

答案 13 :(得分:2)

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

将此行添加到文件/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';

对我有用。祝你好运!

答案 14 :(得分: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 |       |
+------------------+-------+

答案 15 :(得分:1)

不更改任何配置文件。

  1. 使用@vhu发布的命令secure_file_priv查找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中为我工作了

答案 16 :(得分:1)

在macOS Catalina上,我按照此步骤设置了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=

谢谢

答案 17 :(得分:1)

对于mysql 8.0版本,您可以执行以下操作:

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

它在Mac High Sierra上对我有用

答案 18 :(得分: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. 点击“输入”
  6. 服务器按预期启动。

答案 19 :(得分:0)

我在命令中添加了LOCAL,但又出现了另一个问题:

Loading local data is disabled - this must be enabled on both the client and server sides

为解决这个问题,我仅按照here

中的三个步骤进行操作

答案 20 :(得分:0)

对于运行MySQL 5.6.23的MacOS Mojave,我在写入文件时遇到了这个问题,但在加载中却没有。 (在Mac OS的早期版本中看不到)。由于此问题的大多数答案都用于其他系统,所以我认为我会发布my.cnf文件来解决此问题(以及套接字问题),以防其他Mac用户得到帮助。这是 /etc/my.cnf

[client]
default-character-set=utf8

[mysqld]
character-set-server=utf8
secure-file-priv = ""
skip-external-locking

(国际化与问题无关。)

没有其他要求。只需关闭MySQL服务器,然后在“偏好设置”(我们所说的Mac)中再次打开即可。

答案 21 :(得分:0)

Linux 中,您必须在以下位置编辑my.cnf文件

/etc/mysql/my.cnf

并像这样更改26 line number参数:

secure-file-priv= <your data path directory like /home/user/data>

然后重新启动MySQL,然后重试。

docker 中 您必须在docker-compose中使用此命令将my.cnf文件与my.cnf文件装入容器中,或手动添加:

volumes:
  - ./persistent:/var/lib/mysql
  - ./conf/my.cnf:/etc/mysql/my.cnf
像上面的方法一样,在主机中

下一步更改/conf/my.cnf并配置 secure-file-priv参数,此外,您必须将数据装入mysql容器并设置该路径 secure-file-priv-param ,然后重新启动服务,最后可以加载数据。

您可以使用以下命令检查您的配置:

SHOW VARIABLES LIKE "secure_file_priv";

答案 22 :(得分:-1)

Detailed example on how to check secure_file_priv, grant user and select into outfile yippeecode.com