我正在学习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";
查看已配置的目录.
您有两种选择:
secure-file-priv
.secure-file-priv
.必须从启动时删除,不能动态修改.为此,请检查MySQL启动参数(取决于平台)和my.ini.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,则客户端主机上的客户端程序将读取该文件并将其发送到服务器.该文件可以作为完整路径名提供,以指定其确切位置.如果以相对路径名的形式给出,则相对于启动客户端程序的目录解释名称.
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)
Car*_*Med 33
我正在使用Debian上的MySQL5.7.11,这个命令对我有用,看看目录是:
mysql> SELECT @@ global.secure_file_priv;
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 ):
services.msc
.C:\ProgramData\MySQL\MySQL Server 5.6
(ProgramData
在我的案例中是一个隐藏的文件夹).my.ini
在记事本中打开该文件.secure-file-priv=""
.对于MySQL Server 5.7.16及更高版本,请参阅下面的dbc评论.
Nel*_*les 17
在发布此帖子时,该线程已被查看 57 万次。老实说,MySQL 什么时候成为我们过度保护不合理的妈妈了?多么耗时的安全尝试 - 这实际上只会束缚我们!
经过多次搜索和多次尝试,一切都失败了。我的解决方案:
对我有用的是:
.csv
在旧的机器上通过 PhpMyAdmin 导入导入文件(如果在 cmd 行做大的话).sql
文件。.sql
文件。.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
然后,当我用它运行它时,它就起作用了。唯一的区别是斜线的方向。
我在'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 上对我有用。
我遇到了各种各样的问题。我正在更改 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)
对我有用的东西:
secure-file-priv
。要找到该类型:
mysql>显示类似“ secure_file_priv”的变量;
local_infile = 1
。输入以下内容:
mysql>显示类似“ local_infile”的变量;
如果你得到:
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| local_infile | OFF |
+---------------+-------+
Run Code Online (Sandbox Code Playgroud)
然后将其设置为一种输入:
mysql>设置全局local_infile = 1;
mysql>将文件“ C:/ ProgramData / MySQL / MySQL Server 8.0 / Uploads / file.txt”中的数据加载到表测试中;
如果您在 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)
它对我有用。祝你好运!
如果您正在运行 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 次 |
最近记录: |