我正在学习MySQL,并尝试使用LOAD DATA子句。当我使用它时,如下所示:
LOAD DATA INFILE "text.txt" INTO table mytable;
我得到了以下错误:
MySQL服务器正在使用——secure-file-priv选项运行,所以它不能执行这条语句
如何解决这个错误?
我已经检查了关于相同错误信息的另一个问题,但仍然找不到解决方案。
我使用的是MySQL 5.6
我正在学习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 | |
+------------------+-------+
其他回答
我在windows 10上遇到了这个问题。为了解决这个问题,我做了以下工作。
在windows搜索(左下角)中,我输入了“powershell”。 右键单击powershell并以管理员身份运行。 导航到服务器bin文件。(C:\Program Files\MySQL\MySQL Server 5.6\bin); 键入。/ mysqld “输入”
服务器按预期启动。
关于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。
下面是我在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服务器服务。
在Linux中,你必须编辑my.cnf文件
/etc/mysql/my.cnf
修改26行号参数,如下所示:
secure-file-priv= <your data path directory like /home/user/data>
然后重新启动MySQL并重试。
在码头工人 你必须在docker-compose或手动添加命令中将my.cnf文件与my.cnf文件挂载到容器中:
volumes:
- ./persistent:/var/lib/mysql
- ./conf/my.cnf:/etc/mysql/my.cnf
接下来,在你的主机中修改/conf/my.cnf,并像上面的方法一样配置secure-file-priv参数,此外,你必须在mysql容器中挂载你的数据,并为secure-file-priv参数设置路径,重新启动你的服务,最后,你可以加载你的数据。
你可以用这个命令检查你的配置:
SHOW VARIABLES LIKE "secure_file_priv";
如果文件是本地的,请在命令中使用local
LOAD DATA LOCAL INFILE "text.txt" INTO table mytable;