4

我已经搜索并找到了这篇文章(http://stackoverflow.com/questions/1814297/cant-load-file-data-in-the-mysql-directory),但它对我不起作用。

我是 Ubuntu 12.04,MySQL 版本是 5.5.22-0ubuntu1

我已经以 root 身份登录 MySQL,所以授权应该没问题:

mysql> show grants;
+---------------------------------------------------------------------+
| Grants for root@localhost                                           |
+---------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION |
| GRANT PROXY ON ''@'' TO 'root'@'localhost' WITH GRANT OPTION        |
+---------------------------------------------------------------------+

我正在尝试将文本文件中的一些数据插入 MySQL 数据库,但该LOAD_FILE功能似乎无法正常工作

我创建了一个测试文件,权限为 777 并复制到安装的根目录(我尝试将所有者/组更改为 root:root 和 mysql:mysql 仍然不行):

mysql> select load_file('/test.txt');
+------------------------+
| load_file('/test.txt') |
+------------------------+
| NULL                   |
+------------------------+
1 row in set (0.00 sec)

但如果我试试这个:

mysql> select load_file('/etc/hosts');

它工作正常。如果我将测试文件复制到/etc它仍然失败。

有没有人见过这个或者可以指出我加载到数据库的另一种方式?

4

4 回答 4

1

要使用load_file,必须满足以下条件(来自文档):

  1. 该文件必须位于服务器主机上
  2. 您必须指定文件的完整路径名,并且您必须具有FILE权限。
  3. 该文件必须可供所有人读取,并且其大小小于max_allowed_packet字节。
  4. 如果secure_file_priv系统变量设置为非空目录名,则要加载的文件必须位于该目录中。

如果文件包含您要执行的 SQL 语句,则更简单的方法可能是将其通过管道输入:

mysql -u foo -p dbname < filename.sql

于 2012-06-13T10:00:25.950 回答
0

Adding this for future reference. Probably won't help the OP.

As noted before, AppArmor is to blame. You need to whitelist the paths needed for load_file into the provided profile which can be found here: /etc/apparmor.d/usr.sbin.mysqld. The apparmor.d documentation can be found here. This is the recommended way as AppArmor has its reasons to be there.

Alternatives:

  • This is the unrecommended method. Disable the usr.sbin.mysqld profile so you won't expose all the services. Simply link the profile to /etc/apparmor.d/disable with ln -s /etc/apparmor.d/usr.sbin.mysqld /etc/apparmor.d/disable/usr.sbin.mysqld. Reload the profiles with /etc/init.d/apparmor restart. It probably makes sense for a development machine.
  • This is the highly unrecommended method, if you don't actually need AppArmor. The profiles can be unloaded with /etc/init.d/apparmor teardown. Disable the init script with update-rc.d -f apparmor remove.

All the above stuff requires root privileges, but I skipped the ever repetitive sudo in front of all the commands.

于 2014-02-24T14:01:25.820 回答
0

考虑一下这个单线(注意,我在 Ubuntu 上):

printf "$(cat update_xml.sql)" "$(cat my.xml | sed s/"'"/"\\\'"/g)" | mysql -h myRemoteHost -u me -p***

在 update_xml.sql 中有:

UPDATE
   myTable
SET
   myXmlColumn = '%s'
WHERE
   ...
于 2013-12-26T19:43:13.940 回答
0

我不是 MySQL 专家,但我观察到 MySQL 5.5 版与 UBUNTU OS 存在问题。

即使遵循mysql docs LOAD_FILE() 中的文档也没有工作。有一个名为 apparmour 的服务,阻止函数 LOAD_FILE() 执行,我尝试停止该服务但它仍然存在.....

我知道这并不能解决你的问题,但至少它会帮助你找到问题所在......

于 2013-09-19T07:34:55.730 回答