替代LOAD_FILE()函数?

时间:2012-06-13 09:56:15

标签: mysql

我搜索过并找到了这篇文章(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 个答案:

答案 0 :(得分:1)

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

  1. 该文件必须位于服务器主机上
  2. 您必须指定文件的完整路径名,并且您必须具有FILE权限。
  3. 该文件必须可由所有人阅读,其大小必须小于max_allowed_packet字节。
  4. 如果secure_file_priv系统变量设置为非空目录名,则要加载的文件必须位于该目录中。
  5. 如果文件包含您要执行的SQL语句,则可以采用更简单的方法将其封装在:

    mysql -u foo -p dbname < filename.sql

答案 1 :(得分:0)

我不是MySQL的专家,但我观察到MySQL版本5.5与UBUNTU操作系统有问题。

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

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

答案 2 :(得分: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
   ...

答案 3 :(得分:0)

添加此项以供将来参考。可能无法帮助OP。

如前所述,AppArmor应该受到指责。您需要将load_file所需的路径列入所提供的配置文件的白名单,可在此处找到:/etc/apparmor.d/usr.sbin.mysqld。可以找到apparmor.d文档here。这是建议的方式,因为AppArmor有其理由在那里。

备选方案:

  • 这是未经推荐的方法。禁用usr.sbin.mysqld配置文件,这样您就不会公开所有服务。只需将个人资料与ln -s /etc/apparmor.d/usr.sbin.mysqld /etc/apparmor.d/disable/usr.sbin.mysqld链接到/etc/apparmor.d/disable即可。使用/etc/init.d/apparmor restart重新加载配置文件。它可能对开发机器有意义。
  • 如果你实际需要AppArmor,这是一个非常不推荐的方法。可以使用/etc/init.d/apparmor teardown卸载配置文件。使用update-rc.d -f apparmor remove禁用init脚本。

以上所有内容都需要root权限,但我在所有命令前面跳过了重复sudo