MySQL 5.7 --secure-file-priv 问题

(这是一篇记录自己愚蠢错误的博客……避免以后再犯)


起因

前些天需要把一些数据从csv文件导入进MySQL,本来觉得是个几分钟的活计,最后硬是搞了几个小时才收场……

经过

  1. 开始导入: LOAD DATA INFILE "xxx" INTO TABLE tbl FIELDS TERMINATED BY ',' ENCLOSED BY '' LINES TERMINATED BY '\n'
    直接报错:ERROR 1290 (HY000): The MySQL server is running with the –secure-file-priv option so it cannot execute this statement.
    使用SHOW GLOBAL VARIABLES LIKE '%secure_file%'查看当前配置的上传目录,windows下一般是在 C:\ProgramData\MySQL\MySQL Server 5.7\Uploads
    知道了目录,我就美滋滋的把要加载的文件放在了这个目录下,想着这下就没问题了吧?结果……
  2. 再次报错:ERROR 13 (HY000): Can’t get stat of ‘xxx’ (Errcode: 2)
    perror 2命令查询可知,错误代码13的意义是No such file or directory。这就奇了怪了,明明文件就在这里,为什么会有这种提示呢……
    查了MySQL的文档后发现,原因如下:
    MySQL Load data
    If LOCAL is specified, the file is read by the client program on the client host and sent to the server.
    If LOCAL is not specified, the file must be located on the server host and is read directly by the server.
    即如果声明了LOCAL,则MySQL会在客户端主机寻找这个文件;没有声明的话,则会直接在服务端主机上寻找。

    个人的理解是,MySQL作为一个服务,自己就是一个server。所以如果不声明的话,MySQL会直接在自己这个运行起来的server上寻找文件,那当然是找不到了啊……毕竟文件是在本机上,即相对于MySQL server的客户端上。
    所以呢,我们要做的就是:
    登录mysql的时候给予local权限:mysql -uroot -p --local-infile
    导入时导入本地文件:LOAD DATA LOCAL INFILE "xxx" INTO TABLE tbl FIELDS TERMINATED BY ',' ENCLOSED BY '' LINES TERMINATED BY '\n'

总结

查阅资料时,发现有一些类似的情况,如youxin所写的
MySQL: ERROR13(HY000):Can’t get stat of
他所遇到的问题是由于不声明LOCAL关键字时,MySQL需要FILE权限才能读取文件,致使最终出现Permission denied。读者可以根据具体问题对症下药

你可能感兴趣的:(MySQL 5.7 --secure-file-priv 问题)