2011-05-22 61 views
54

任何想法?MYSQL到outfile「訪問被拒絕」 - 但我的用戶有「所有」訪問..和文件夾是CHMOD 777

SELECT * INTO OUTFILE '/home/myacnt/docs/mysqlCSVtest.csv' 
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '*' 
LINES TERMINATED BY '\n' 
FROM tbl_property 
WHERE managerGroupID = {$managerGroupID} 

錯誤:

Access denied for user 'asdfsdf'@'localhost' (using password: YES) 
+1

「所有特權」不包括所有特權。與這種情況相關的是,它不包括'SELECT INTO OUTFILE'語句所需的'FILE'特權。我在英語和MySQL之間的這種不匹配方面遇到了一些麻煩:http://dba.stackexchange.com/a/96894/53784 – WAF 2017-02-27 15:39:37

回答

87

嘗試執行SQL命令:

> grant all privileges 
    on YOUR_DATABASE.* 
    to 'asdfsdf'@'localhost' 
    identified by 'your_password'; 
> flush privileges; 

看來,您有連接到數據庫,而不是寫你的文件夾的問題提。

此外,請確保您已將FILE授予用戶'asdfsdf'@'localhost'

> GRANT FILE ON *.* TO 'asdfsdf'@'localhost'; 
+0

一切看起來都很好,即使在cPanel中也檢查了一切 – Shackrock 2011-05-22 23:38:47

+1

@ Shackrock:check out更新的答案。確保你已經授予'FILE'給用戶。 – 2011-05-22 23:41:24

+37

這裏有兩個問題。 1)GRANT ALL不做GRANT FILE。 2)GRANT FILE僅適用於\ *。\ *(即全局)。這兩個都是MySQL中的錯誤。 – fijiaaron 2012-09-27 12:14:02

30

老實說,我沒有刻意去應對贈款和這個工作,即使沒有特權:

echo "select * from employee" | mysql --host=HOST --port=PORT --user=UserName --password=Password DATABASE.SCHEMA > output.txt 
+4

這是因爲您只是在執行常規SELECT操作,而不是SELECT INTO OUTFILE(本例中爲.csv文件)。 – aqn 2013-06-18 13:41:45

+3

對於較大的表,這是一種不好的方式,因爲客戶端會在將任何內容放入文件之前緩衝整個結果集。 – 2014-02-06 15:58:53

+3

當您無法獲得文件權限時很好使用 – jminkler 2014-05-15 16:41:48

12

由於@fijaaron說,

  1. GRANT ALL並不意味着GRANT FILE
  2. GRANT FILE只適用於*.*

所以做

GRANT FILE ON *.* TO user; 
0

由於CP /南國帶走修改用戶的權限在phpMyAdmin根的能力,你必須使用命令行:

mysql> GRANT FILE ON *.* TO 'user'@'localhost'; 

第二步是以允許該用戶轉儲特定文件夾中的文件。有幾個方法可以做到這一點,但我最終把一個文件夾中:

/home/user/tmp/db 

chown mysql:mysql /home/user/tmp/db 

這允許mysql用戶寫入文件。正如之前的海報所說的,你也可以使用MySQL臨時文件夾,我不認爲它真的很重要,但你絕對不想讓它成爲0777權限(世界可寫),除非你想讓世界看到你的數據。如果您想沖洗 - 如果文件存在,則INTO OUTFILE將無法​​工作,因此存在潛在的問題。如果您的文件屬於其他用戶,則只需嘗試unlink($file)將不起作用。如果你像我一樣(偏執0777),那麼你可以通過設置你的目標目錄:

chmod($dir,0777) 

只是之前後立即執行SQL命令,然後

chmod($dir,0755) 

,其次是unlink(file)到刪除該文件。這樣可以保證它在你的web用戶下運行,不需要調用mysql用戶。