LOAD DATA
子句。当我按如下所示使用它时:LOAD DATA INFILE "text.txt" INTO table mytable;
我遇到以下错误:
MySQL服务器正在- -secure-file-priv选项,因此它无法执行该语句
我该如何解决此错误?
我已经检查了同一错误消息中的另一个问题,但仍然找不到解决方案。
我正在使用MySQL 5.6
#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 楼
如果文件是计算机本地文件,请在命令中使用LOCALLOAD 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
为了解决这个问题,我在这里简单地遵循了三个步骤
评论
CSV文件的共享路径当然,尝试使用mysqldump --tab时会出现此错误,好像很难从mysql中获取自己的数据一样。
除了vhu的答案外,请在下面搜索wolfsshield的答案。您需要切换到“ /”以使其正常运行(我正在使用win10)
使用本地。加载数据本地文件...