我应该如何处理——MySQL中的安全文件priv?
我正在学习MySQL,并尝试使用我应该如何处理——MySQL中的安全文件priv?,mysql,database,Mysql,Database,我正在学习MySQL,并尝试使用LOAD DATA子句。当我使用它时,如下所示: LOAD DATA INFILE "text.txt" INTO table mytable; 我得到了以下错误: MySQL服务器正在使用--secure file priv选项运行,因此无法执行此语句 我如何处理这个错误 我查过了,但还是找不到解决办法 我正在使用MySQL 5.6,它按预期工作。MySQL服务器的启动选项基本上限制了您可以使用loaddatainfle从哪些目录加载文件 您可以使用显示变量,
LOAD DATA
子句。当我使用它时,如下所示:
LOAD DATA INFILE "text.txt" INTO table mytable;
我得到了以下错误:
MySQL服务器正在使用--secure file priv选项运行,因此无法执行此语句
我如何处理这个错误
我查过了,但还是找不到解决办法
我正在使用MySQL 5.6,它按预期工作。MySQL服务器的启动选项基本上限制了您可以使用
loaddatainfle
从哪些目录加载文件
您可以使用显示变量,如“secure\u file\u priv”
查看已配置的目录
您有两个选择:
secure file priv
指定的目录安全文件priv
。这必须从启动时删除,并且不能动态修改。为此,请检查MySQL启动参数(取决于平台)和my.ini我正在Debian上使用MySQL5.7.11,用于查看目录的命令是:
mysql> SELECT @@global.secure_file_priv;
以下是我在Windows 7中禁用
安全文件priv
(选项#2 from)的工作原理:
services.msc
停止MySQL服务器服务C:\ProgramData\MySQL\MySQL服务器5.6
(ProgramData
在我的例子中是一个隐藏文件夹)my.ini
文件secure file priv=“”
services.msc
启动MySQL服务器服务我对“安全文件私有”也有同样的问题。.ini文件中的注释无效,在“secure file priv”指定的目录中移动文件也无效
最后,正如dbc所建议的,将“securefilepriv”设置为空字符串是可行的。因此,如果有人在尝试上述答案后遇到了问题,希望这样做会有所帮助。在Ubuntu 14和Mysql 5.5.53上,此设置似乎默认启用。要禁用它,您需要将
secure file priv=”“
添加到mysqld config组下的my.cnf文件中。例如:-
[mysqld]
secure-file-priv = ""
我使用命令中的
LOCAL
选项解决了这个问题:
LOAD DATA LOCAL INFILE "text.txt" INTO TABLE mytable;
你可以找到更多信息
如果指定了LOCAL,则客户端程序将在
客户端主机并发送到服务器。该文件可以作为完整文件提供
路径名以指定其确切位置。如果作为相对路径给出
名称,则该名称是相对于
客户端程序已启动
我对此有各种各样的问题。我在修改我的.cnf和其他版本的问题试图展示的各种疯狂的东西 对我有用的是: 我犯的错误
MySQL服务器正在使用--secure file priv选项运行,因此无法执行此语句
我可以通过打开/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=$?
到
我在Windows10上遇到了这个问题。“--secure file priv in MySQL”为了解决这个问题,我做了以下操作
服务器按预期启动 如果文件是本地文件,请使用命令中的local
LOAD DATA LOCAL INFILE "text.txt" INTO table mytable;
对我起作用的是:
secure file priv
中指定的文件夹中
要查找该类型,请执行以下操作:
mysql> show variables like "secure_file_priv";
local\u infle=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;
MySQL使用此系统变量控制文件的导入位置
mysql> SHOW VARIABLES LIKE "secure_file_priv";
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| secure_file_priv | NULL |
+------------------+-------+
所以问题是如何更改系统变量,例如secure\u file\u priv
mysqld
sudo mysqld\u safe--secure\u file\u priv=“”
mysql> SHOW VARIABLES LIKE "secure_file_priv";
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| secure_file_priv | |
+------------------+-------+
@vhu我做了
显示变量,比如“secure\u file\u priv”代码>返回C:\ProgramData\MySQL\MySQL Server 8.0\Uploads\
,所以当我插入时,它仍然无法工作
当我直接转到my.ini
文件时,我发现路径的格式有点不同:
C:/ProgramData/MySQL/MySQL Server 8.0/Uploads
然后,当我用它运行时,它工作了。唯一的区别是斜杠的方向。如果您在Ubuntu上运行,您可能还需要配置Apparmor以允许MySQL写入您的文件夹,例如,下面是我的配置:
将此行添加到文件/etc/apparmor.d/usr.sbin.mysqld:
/var/lib/mysql-files/* rw
然后将这两个配置行添加到/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';
这对我有用。祝你好运 对于mysql 8.0版本,您可以执行以下操作:
mysql.server stop
mysql.server start --secure-file-priv=''
它在Mac High Sierra上对我有效。在macOS Catalina,我按照以下步骤设置安全文件\u priv
1.停止MySQL服务
sudo /usr/local/mysql/support-files/mysql.server stop
2.重新启动MYSQL分配--安全文件\u私有系统变量
sudo /usr/local/mysql/support-files/mysql.server start --secure-file-priv=YOUR_FILE_DIRECTORY
注意:添加空值为我解决了这个问题,MYSQL将数据导出到/usr/local/MYSQL/data/YOUR_DB_TABLE/export_文件目录
sudo /usr/local/mysql/support-files/mysql.server start --secure-file-priv=
谢谢,无需更改任何配置文件
使用@vhu:SHOW变量如“secure\u file\u priv”
发布的命令查找secure\u file\u priv
的值
定义查询的完整路径,例如:select*从表到输出文件“secure\u file\u priv\u path/OUTPUT-file”。。。其余的
sudo /usr/local/mysql/support-files/mysql.server start --secure-file-priv=
INSERT INTO <your_table> VALUEs( **CSV LINE **)
"city","city_ascii","lat","lng","country","iso2","iso3","id"
"Tokyo","Tokyo","35.6850","139.7514","Japan","JP","JPN","1392685764",
...
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;
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;
sudo /usr/local/mysql/support-files/mysql.server start --secure-file-priv='' --local-infile
mysql -u root -p
/etc/mysql/my.cnf
secure-file-priv= <your data path directory like /home/user/data>
volumes:
- ./persistent:/var/lib/mysql
- ./conf/my.cnf:/etc/mysql/my.cnf
SHOW VARIABLES LIKE "secure_file_priv";
[client]
default-character-set=utf8
[mysqld]
character-set-server=utf8
secure-file-priv = ""
skip-external-locking
Loading local data is disabled - this must be enabled on both the client and server sides