Mysql

無法將 MySQL 數據輸出到文件

  • April 26, 2021

我正在嘗試將數據從 MySQL 表輸出到文件,但出現權限錯誤:

$ pwd
/home/dotancohen
$ mkdir in
$ chmod 777 in/
$ mysql -ugs -p
mysql> USE someDatabase;
mysql> SELECT * FROM data INTO OUTFILE '/home/dotancohen/in/data.csv';
ERROR 1045 (28000): Access denied for user 'gs'@'localhost' (using password: YES)
mysql>

如果有問題的目錄被修改為 777,那麼 MySQL 使用者為什麼不能寫入該文件?有趣的是,我也無法寫入 /tmp/。

編輯: 看起來 DB 使用者具有適當的 MySQL 權限:

mysql> show grants;
+----------------------------------------------------------------------------------+
| Grants for gs@localhost                                                          |
+----------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'gs'@'localhost' IDENTIFIED BY PASSWORD 'somePassword'     | 
| GRANT ALL PRIVILEGES ON `gs\_%`.* TO 'gs'@'localhost'                            | 
+----------------------------------------------------------------------------------+
2 rows in set (0.01 sec)

根據SELECT … INTO OUTFILE上的 MySQL 文件

INTO OUTFILE 或 INTO DUMPFILE 創建的任何文件都可以被伺服器主機上的所有使用者寫入。這樣做的原因是 MySQL 伺服器不能創建一個文件,該文件由執行它的帳戶下的使用者以外的任何人擁有。(出於這個和其他原因,您永遠不應該以 root 身份執行 mysqld。)因此該文件必須是全域可寫的,以便您可以操作其內容。

你應該輸出SELECT INTO OUTFILE到 /var/lib/mysql 如下

SELECT * FROM data INTO OUTFILE 'data.csv';

當然,您需要確保您對 gs@localhost 具有 FILE 權限。

有兩種方法可以獲得此權限

方法#1

GRANT FILE ON *.* TO 'gs'@'localhost';

方法#2

UPDATE mysql.user SET File_priv = 'Y' WHERE user='gs' AND host='localhost';
FLUSH PRIVILEGES;

更新 2012-05-01 07:09 EDT

要給自己 FILE 權限,請執行以下操作:

service mysql restart --skip-networking --skip-grant-tables
mysql <hit enter>
UPDATE mysql.user SET File_priv = 'Y' WHERE user='gs' AND host='localhost';
exit
service mysql restart

引用自:https://dba.stackexchange.com/questions/17029