MySQL LOAD_FILE返回NULL

时间:2014-06-27 19:05:08

标签: mysql sql chmod chown mysql-loadfile

我想让SQL LOAD_FILE 功能正常工作并阅读每一个问题/答案+关于此的文档,但这是正在发生的事情。

当我想从我的主目录 LOAD_FILE 时:

mysql> SELECT LOAD_FILE('/home/myuser/somefile.txt');
+----------------------------+
| LOAD_FILE('/home/myuser/somefile.txt') |
+----------------------------+
| NULL                       |
+----------------------------+
1 row in set (0.00 sec)

所以在得到这个之后,我想也许问题是MySQL无法访问我的主目录。我尝试运行它,这很好用:

SELECT LOAD_FILE('/etc/mysql/my.cnf');

然后SELECT LOAD_FILE('/etc/passwd');工作正常。

所以我说了问题,它是文件/文件夹读取/所有权许可问题。所以,我将我的文件移动到/ etc / mysql /但是它仍然没有工作。我试过了chown mysql:mysql somefile.txt但是,我没有运气:

mysql> SELECT LOAD_FILE('/etc/mysql/somefile.txt');
+----------------------------+
| LOAD_FILE('/etc/mysql/somefile.txt') |
+----------------------------+
| NULL                       |
+----------------------------+
1 row in set (0.00 sec)

P.S。 1。所有用户组都可以读取所有文件,因此无需chmod。但是,如果您想问,我甚至尝试过 chmod 777 2. 我检查过,在MySQL中没有设置secure-file-priv变量,所以不,LOAD_FILE不限于任何路径。

任何想法可能会出现问题吗?

5 个答案:

答案 0 :(得分:6)

我发现它与AppArmor有关。我禁用了AppArmor for MySQL并且它有效。 对于遇到相同问题的人,请在此处阅读:http://www.cyberciti.biz/faq/ubuntu-linux-howto-disable-apparmor-commands/

答案 1 :(得分:3)

Documentation

  

要使用此功能,该文件必须位于服务器主机上。

     

您必须指定文件的完整路径名。

     

您必须拥有FILE权限。

     

所有

文件必须是可读的      

文件大小应小于max_allowed_packet个字节。

     

如果secure_file_priv系统变量设置为非空目录   name,要加载的文件必须位于该目录中。

     

如果文件不存在或因为其中一个而无法读取   不满足前面的条件,函数返回NULL

所以检查上述所有条件是否满足。

修改

不确定你是否理解正确..

  1. 确保文件父目录具有执行权限。如果somefile.txt位于myuser目录下;您必须具有myuser目录的执行权。

  2. You must have the FILE privilege.表示必须使用GRANT FILE on . TO user@localhost

  3. 明确授予FILE权限
  4. 冲洗权限

  5. 退出并重新登录并检查它是否正常工作。

  6. 请参阅此帖子MySQL LOAD_FILE() loads null values

答案 2 :(得分:1)

在尝试将图像添加到blob字段时,我对Fedora Linux也存在同样的问题。

我解决了将文件复制到目录/var/lib/mysql/images并给出命令:

chown -R mysql:mysql /var/lib/mysql/images

答案 3 :(得分:0)

加载数据infile file_name ...是MySQL的正确命令。由于您没有提供文件中数据的示例,因此无法向您显示确切使用它。有变量来处理分隔符和行尾特征。祝你好运。

答案 4 :(得分:0)

所以我一直在努力解决这个问题,终于找到了解决方案:

mysql> select LOAD_FILE('/var/www/upload/test.zip');
+---------------------------------------+
| LOAD_FILE('/var/www/upload/test.zip') |
+---------------------------------------+
| NULL                                  |
+---------------------------------------+
1 row in set (0.00 sec)

问题是未设置 secure_file_priv 。要查看指向何处,请执行以下查询:

执行查询:

select @@GLOBAL.secure_file_priv;

指向要查找文件的区域 我所做的是将以下内容添加到mysqld.conf的最后

secure_file_priv =  /var/www/upload.

重新启动mysql并进行测试

mysql> select LOAD_FILE('/var/www/upload/test.zip');
+--------------------------------------------------------------------------------------