11

我想让 SQL 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)

PS 1.所有用户组都可以读取所有文件,因此无需 chmod。但如果你想问的话, 我什至尝试过chmod 777 。2.我查了一下,MySQL中没有设置secure-file-priv变量,所以不,LOAD_FILE不限于任何路径。

有什么想法可能是这里的问题吗?

4

5 回答 5

8

我发现它与 AppArmor 有关。我为 MySQL 禁用了 AppArmor,它起作用了。对于有同样问题的人,请在此处阅读:http ://www.cyberciti.biz/faq/ubuntu-linux-howto-disable-apparmor-commands/

于 2014-06-27T23:06:27.430 回答
3

根据文档

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

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

您必须具有 FILE 权限。

该文件必须可供所有人读取

文件大小应小于max_allowed_packet字节。

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

如果文件不存在或由于不满足上述条件之一而无法读取,则该函数返回 NULL

因此,请检查所有上述条件是否满足。

编辑:

不知道你是否理解正确..

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

  2. You must have the FILE privilege.表示必须使用显式授予 FILE 权限GRANT FILE on . TO user@localhost

  3. 刷新特权

  4. 注销并重新登录并检查它是否正常工作。

见这篇文章MySQL LOAD_FILE() 加载空值

于 2014-06-27T19:14:44.947 回答
3

所以我一直在努力解决这个问题,最终找到解决它:

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');
+--------------------------------------------------------------------------------------
于 2019-07-29T19:14:02.930 回答
2

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

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

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

于 2015-12-08T00:36:05.700 回答
0

Load data infile file_name... 是 MySQL 的正确命令。而且由于您没有提供文件中数据的示例,因此我无法告诉您确切地使用它。有一些变量可以处理分隔符和行尾特征。祝你好运。

于 2014-06-27T20:01:15.853 回答