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

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


我遇到以下错误:


MySQL服务器正在- -secure-file-priv选项,因此它无法执行该语句


我该如何解决此错误?

我已经检查了同一错误消息中的另一个问题,但仍然找不到解决方案。

我正在使用MySQL 5.6

评论

CSV文件的共享路径

当然,尝试使用mysqldump --tab时会出现此错误,好像很难从mysql中获取自己的数据一样。

除了vhu的答案外,请在下面搜索wolfsshield的答案。您需要切换到“ /”以使其正常运行(我正在使用win10)

使用本地。加载数据本地文件...

#1 楼

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

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

有两个选择:


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


评论


默认情况下,在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本身。

–vhu
2015年9月23日在10:59

@ Mohitbhasi,my-default.ini应该位于“ C:\ Program Files \ MySQL \ MySQL Server 5.6”文件夹中。 vhu所指的位置是“ C:\ ProgramData \ MySQL \ MySQL Server 5.6”。以防万一您没有注意到。

–NurShomik
16年1月16日在7:20

值:NULL。 FML。

–威廉迷住了
17年9月9日在16:20

注意,如果使用“ select .. into outfile”,则必须指定完整路径,并且完整路径必须与SHOW VARIABLES LIKE“ secure_file_priv”的结果相匹配;

–TheSatinKnight
18年2月17日在17:49

“检查参数”和“检查my.ini”不是一个很好的答案

–罗兰·苏伊斯(Roland Seuhs)
18年3月21日在16:09

#2 楼

我使用以下命令中的LOCAL选项解决了该问题:
LOAD DATA LOCAL INFILE "text.txt" INTO TABLE mytable;

您可以在此处找到更多信息。

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


评论


这对我和其他人都起作用。我尝试过:1.将我的txt文件上传到C:\ ProgramData \ MySQL \ MySQL Server 5.7 \ Uploads,2.禁用my.ini中的secure_file_priv并重新启动mysql 3.这个!谢谢 :)

–卡马尔·纳扬
16年11月23日在14:58

我收到了针对MariaDB的错误消息:“错误1148(42000):此MariaDB版本不允许使用的命令”。确切的版本:“使用readline 5.2的mysql Ver 15.1 Distrib 10.1.22-MariaDB,用于Linux(x86_64)”

– jciloa
17年7月18日在11:56

对于5.7.19版的MySQL,我收到了“此MySQL版本不允许使用的命令”的信息。

–艾莉森S
17-10-5在21:14

@AlisonS尝试在运行mysql时添加--local-infile标志。 stackoverflow.com/questions/10762239/…

–伊利亚·莫斯科维
18年5月30日在14:36



MySQL 8.0的此MySQL版本不允许使用命令

–bitfishxyz
19年3月3日在8:02

#3 楼

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

[mysqld]
secure-file-priv = ""


评论


这也为我工作。相同版本的Ubuntu和MySQL

–罗德尼
16年11月13日在14:24

+1为我工作。如果您使用的是Ubuntu,请不要忘记重启mysql服务:sudo service mysql restart

–埃米利亚诺·桑戈伊(Emiliano Sangoi)
17年7月20日在4:07

如果需要它指向您在适用的情况下根据每个语句选择的位置,则此方法有效。正如您所解释的,它可以在Windows Server上与MySQL 5.7一起使用。如果您只是将#secure-file-priv =〜这样的行注释掉,那么它仍然会出现错误,因为该值显示为NULL,这样做可以解决当您选择要导出到服务器上的目录时的问题,等等

–比特币惨案狂
18 Mar 5 '18 at 19:06

在Windows上使用MySQL 5.7为我工作,而其他解决方案则没有。

–CGritton
18/12/3在21:47

注意:如果在Docker中执行此操作,则必须重新启动Docker容器。

–user1717828
19年2月15日在14:13

#4 楼

我正在Debian上使用MySQL5.7.11,对我来说查看目录的命令是:

mysql> SELECT @@global.secure_file_priv;


评论


与显示变量类似“ secure_file_priv”;我收到错误1146(42S02):表'performance_schema.session_variables'不存在,在其他情况下也会抛出该表,最终我将不得不处理。 SELECT @@ global.secure_file_priv;命令虽然产生了预期的结果。

–马吉德·弗拉德普尔
17年4月4日在16:28

这对我有用-Ubuntu Mysql 5.7.21:将输出文件更改为目录/var/lib/mysql-files/output.txt

– Shanemeister
18年4月26日在17:42

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

–斯拉维克
19年3月14日在7:32

#5 楼

这是在Windows 7中禁用secure-file-priv(从vhu的答案中选择的选项2)对我来说起作用的方法:


进入services.msc停止MySQL服务器服务。
转到C:\ProgramData\MySQL\MySQL Server 5.6 (在我的情况下,ProgramData是一个隐藏的文件夹)。
在记事本中打开my.ini文件。
搜索“ secure-file-priv”。
在命令行中添加“#”以注释掉该行行的开始。对于MySQL Server 5.7.16及更高版本,注释将不起作用。您必须将其设置为像这样的空字符串-secure-file-priv=""

保存文件。
通过进入services.msc来启动MySQL服务器服务。


评论


从MySQL Server 5.7.16开始,注释掉该行将不起作用,因为它将恢复为默认设置,即禁用导入和导出操作。现在,如果要允许从任何目录进行这些操作,则需要将其设置为空字符串。

–dbc
16-10-25在14:24

Ramnath,请使用5.7.x版本的@dbc详细信息编辑答案。谢谢。

–拉斐尔·戈麦斯·弗朗西斯科
17年9月20日在20:25

添加一个空字符串对我有用;请更改答案以添加一个空字符串,例如secure-file-priv =“”

–拉杰什·戈尔(Rajesh Goel)
18年6月26日在23:35

对于Windows,请确保使用正斜杠

–奥利弗·奥利弗(Oliver Oliver)
19年3月31日23:16



#6 楼

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

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


#7 楼

@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

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

评论


是是是...为什么下面的答案如此之远。我挣扎了很长时间,然后才明白了。我回来添加这个作为答案,但它是如此之遥,以至于我在浪费时间之前没有看到它。

– Rsc Rsc
19-10-21在21:54

不是所有的英雄穿着斗篷。

– JRK
2月12日8:37

太好了,这是MySql 8.0上的确切问题

–Himanshu Patel
7月25日10:08

#8 楼

在撰写本文时,该线程已被查看570k次。老实说,MySQL什么时候成为我们过度保护的不合理妈妈?多么费时的安全尝试-确实只能束缚我们!
经过多次搜索和多次尝试,一切都失败了。
我的解决方案:
对我有用的是:

通过PhpMyAdmin导入.csv文件在较旧的盒子上(如果在cmd行较大).sql文件。
下载.sql文件。
通过MySQL Workbench导入.sql文件。


#9 楼

对我有用的东西:


将文件放入secure-file-priv中指定的文件夹内。
要找到该类型:
mysql> show variables like "secure_file_priv";  



检查是否具有local_infile = 1
进行以下键入:
mysql> show variables like "local_infile";

如果得到:
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| local_infile  | OFF   |
+---------------+-------+

然后将其设置为一种键入:
mysql> set global local_infile = 1;



指定文件的完整路径。就我而言:
mysql> load data infile "C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/file.txt" into table test;




#10 楼

我对“ secure-file-priv”有同样的问题。 .ini文件中的注释无效,并且在“ secure-file-priv”指定的目录中移动文件也无效。

最后,按照dbc的建议,使'secure-file-priv'等于一个空字符串是可行的。因此,如果任何人在尝试完上述答案后仍陷于困境,希望这样做会有所帮助。

#11 楼

对于mysql 8.0版本,您可以执行以下操作:
mysql.server stop
mysql.server start --secure-file-priv=''

它在Mac High Sierra上对我有用。

#12 楼

如果您正在运行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",
...


服务器。 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;



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

#13 楼

我对此有各种各样的问题。我正在更改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=$?


#14 楼

如果您在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';


对我有用。祝你好运!

评论


是的,将输出文件路径放在“ /var/lib/mysql-files/filename.csv”对我有用。

– Anidhya Bhatnagar
3月31日16:06

#15 楼

这对我有用(存在另一个问题,即在语句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

#16 楼

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


#17 楼

我在Windows 10上遇到了这个问题。“ --secure-file-priv在MySQL中”为了解决这个问题,我做了以下工作。


在Windows搜索中(左下),我键入“ powershell”。
右键单击Powershell并以管理员身份运行。
导航到服务器bin文件。 (C:\ Program Files \ MySQL \ MySQL Server 5.6 \ bin);
键入./mysqld
单击“输入”

服务器按预期方式启动。

#18 楼

在macOS Catalina,我按照以下步骤设置了secure_file_priv

1.停止MySQL服务

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


2.重新启动MYSQL分配--secure_file_priv系统变量

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=


感谢

#19 楼

无需更改任何配置文件。.


使用@vhu发布的命令secure_file_priv查找SHOW VARIABLES LIKE "secure_file_priv"的值。
定义查询的完整路径,例如: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起作用

#20 楼

在Linux中,您必须在
/etc/mysql/my.cnf

中编辑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您的主机和配置安全文件专用参数类似于上面的方法,此外,您必须将数据装入mysql容器并为安全文件专用参数设置该路径,然后重新启动服务,最后,您可以加载数据。
您可以使用以下命令检查您的配置:
SHOW VARIABLES LIKE "secure_file_priv";


#21 楼

对于运行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)中再次打开即可。

#22 楼

我在命令中添加了LOCAL,但这又带来了另一个问题:
Loading local data is disabled - this must be enabled on both the client and server sides

为了解决这个问题,我在这里简单地遵循了三个步骤