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

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

我得到了以下错误:

MySQL服务器正在使用——secure-file-priv选项运行,所以它不能执行这条语句

如何解决这个错误?

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

我使用的是MySQL 5.6


当前回答

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

其他回答

它正在按预期工作。你的MySQL服务器已经启动了——secure-file-priv选项,该选项限制你可以使用load DATA INFILE从哪个目录加载文件。

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

你有两个选择:

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

我正在Debian上的MySQL5.7.11上工作,为我工作的命令是:

mysql> SELECT @@global.secure_file_priv;

下面是我在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服务器服务。

关于secure_file_priv的解释如下:

https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_secure_file_priv

下面是LOAD DATA的解释:

https://dev.mysql.com/doc/refman/8.0/en/load-data.html

在我的例子中,使用的是官方Docker镜像中的MySQL,所以我需要弄清楚如何设置secure_file_priv。

为了更好地理解什么是secure_file_priv,我阅读了上面的链接; 并阅读MySQL的DockerHub不得不说,https://hub.docker.com/_/mysql

了解(docker) mysql默认值:

$ docker run -it --rm mysql --verbose --help
Variables (--variable-name=value)
and boolean options {FALSE|TRUE}          Value (after reading options)
----------------------------------------- -----------------------------
...
local-infile                              FALSE
...
secure-file-priv                          NULL
...

事实上,(在容器内部)配置文件说:

root@a2b1e0c46541:/# cat /etc/mysql/my.cnf
#
# (...license...)
#
# The MySQL  Server configuration file.
#
# For explanations see
# http://dev.mysql.com/doc/mysql/en/server-system-variables.html

[mysqld]
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
datadir         = /var/lib/mysql
secure-file-priv= NULL

# Custom config should go here
!includedir /etc/mysql/conf.d/

使用官方图像(如README中解释的那样):

$ docker run --name mysql -e MYSQL_ROOT_PASSWORD=secret -d mysql \
         --secure_file_priv=/data

如果你想允许LOCAL INFILE加载,还需要定义选项local_infile=TRUE。

现在你应该能够加载数据INFILE '/ DATA / DATA .csv'到表some_table。

注意:在同样的任务中——一旦“INFILE”的事情被解决(如上)——我在我的CSV数据中有空值的问题,对此的答案(和问题)非常有帮助:https://stackoverflow.com/a/5968530/687896。

在这篇文章发表时,这个帖子已经被浏览了570k次。说实话,MySQL什么时候变成了我们过度保护的无理妈妈了?这是多么耗费时间的安全尝试——这实际上只会束缚我们!

经过多次搜索和尝试,一切都失败了。 我的解决方案:

对我有用的是:

导入。csv文件通过PhpMyAdmin导入旧的盒子(如果大做在cmd行) 生成一个.sql文件。 下载。sql文件。 通过MySQL Workbench导入.sql文件。