2012-06-13 97 views
3

我已经搜索并找到了这篇文章(http://stackoverflow.com/questions/1814297/cant-load-file-data-in-the-mysql-directory),但它不适合我。替代LOAD_FILE()函数?

我是联合国的Ubuntu 12.04和MySQL的版本是5.5.22-0ubuntu1

我已经登录到MySQL作为根等补助都应该没关系:

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

我试图插入一些数据从一个文本文件到一个MySQL数据库和LOAD_FILE函数似乎不能正常工作

我创建了一个测试文件,权限为777并复制到安装的根目录(我尝试将所有者/组更改为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中,它仍会失败。

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

回答

1

要使用load_file,下面的条件必须得到满足(从documentation):

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

如果文件中包含要执行SQL语句,更简单的方法可能是管它:

mysql -u foo -p dbname < filename.sql

+0

'secure_file_priv'为空。我在本地运行并使用完整路径并且可读。测试文件的大小要小于'/ etc/hosts',所以以上所有内容都应该没问题。它不是SQL语句,所以也不起作用。它基本上是一个文本文件中的大量数字,它们被发送并且在测试步骤中接收到类似的数据。 – Firedragon

+0

你确定这里的路? 'select load_file('/ test.txt');'这不是完整路径,除非文件实际位于'/ test.txt' –

+0

文件被复制到那里。我尝试过'/ home/me/test.txt'这样的各种路径,它不起作用。 – Firedragon

0

我不是在MySQL的专家,但香港专业教育学院发现,MySQL版本5.5有一个UBUNTU操作系统的问题。

即使在遵循mysql docs的文档之后LOAD_FILE()也没有工作。 有一个服务叫做apparmour,阻止执行函数LOAD_FILE(),我试着停止该服务,但它仍然持续.....

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

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 
    ... 
0

添加此以备将来参考。可能不会帮助OP。

如前所述,AppArmor是责任。您需要将load_file所需的路径白名单列入所提供的配置文件中,该文件位于/etc/apparmor.d/usr.sbin.mysqld。 apparmor.d文档可以找到here。这是AppArmor有其原因的推荐方式。

备选方案:

  • 这是不推荐的方法。禁用usr.sbin.mysqld配置文件,以便您不会公开所有服务。只需将该配置文件链接到/etc/apparmor.d/disable即可,其中ln -s /etc/apparmor.d/usr.sbin.mysqld /etc/apparmor.d/disable/usr.sbin.mysqld即可。用/etc/init.d/apparmor restart重新加载配置文件。这对开发机器来说可能是有意义的。
  • 这是非常不推荐的方法,如果你不需要其实需要AppArmor。配置文件可以通过/etc/init.d/apparmor teardown卸载。使用update-rc.d -f apparmor remove禁用init脚本。

以上所有东西都需要root权限,但是我跳过所有命令前重复的sudo