我搜索过并找到了这篇文章(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
,它仍然会失败。
以前有人见过这个或者可能指向我加载到数据库的另一种方式吗?
答案 0 :(得分:1)
要使用load_file
,必须满足以下条件(来自documentation):
FILE
权限。max_allowed_packet
字节。secure_file_priv
系统变量设置为非空目录名,则要加载的文件必须位于该目录中。如果文件包含您要执行的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有其理由在那里。
备选方案:
ln -s /etc/apparmor.d/usr.sbin.mysqld /etc/apparmor.d/disable/usr.sbin.mysqld
链接到/etc/apparmor.d/disable即可。使用/etc/init.d/apparmor restart
重新加载配置文件。它可能对开发机器有意义。/etc/init.d/apparmor teardown
卸载配置文件。使用update-rc.d -f apparmor remove
禁用init脚本。以上所有内容都需要root权限,但我在所有命令前面跳过了重复sudo
。