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

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

我得到了以下错误:

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

如何解决这个错误?

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

我使用的是MySQL 5.6


当前回答

我用命令中的LOCAL选项解决了这个问题:

LOAD DATA LOCAL INFILE "text.txt" INTO TABLE mytable;

你可以在这里找到更多信息。

上的客户端程序读取文件 客户端主机和发送到服务器。该文件可以作为一个完整的 路径名称,以指定其确切位置。如果给出一个相对路径 名称时,名称将相对于所在的目录进行解释 客户端程序启动。

其他回答

我在“secure-file-priv”上也遇到了同样的问题。在.ini文件中注释不起作用,在'secure-file-priv'指定的目录中移动文件也不起作用。

最后,正如dbc建议的那样,使'secure-file-priv'等于一个空字符串就可以工作了。所以如果有人在尝试了上面的答案后被困住了,希望这样做会有所帮助。

关于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。

我在这方面遇到了各种各样的问题。我在修改my。cnf和其他版本试图显示的各种疯狂的东西。

对我有用的是:

我得到的错误

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

我可以通过打开/usr/local/mysql/support-files/mysql来修复它。服务器,更改如下行:

$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=$?

to

$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=$?

无需更改任何配置文件..

使用@vhu发布的命令查找secure_file_priv的值:SHOW VARIABLES LIKE "secure_file_priv" 定义查询的完整路径,例如:select * from table into outfile 'secure_file_priv_PATH/OUTPUT-FILE'…剩下的问题

这适用于我的mysql-shell在ubuntu 18.04 LTS mysql 5.7.29

对我有用的是:

Put your file inside of the folder specified in secure-file-priv. To find that type: mysql> show variables like "secure_file_priv"; Check if you have local_infile = 1. Do that typing: mysql> show variables like "local_infile"; If you get: +---------------+-------+ | Variable_name | Value | +---------------+-------+ | local_infile | OFF | +---------------+-------+ Then set it to one typing: mysql> set global local_infile = 1; Specify the full path for your file. In my case: mysql> load data infile "C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/file.txt" into table test;