2012-06-13 110 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