有什么想法吗?
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)
尝试执行此 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';
老实说,我没有费心去处理补助金,即使没有特权,这也能奏效:
echo "select * from employee" | mysql --host=HOST --port=PORT --user=UserName --password=Password DATABASE.SCHEMA > output.txt
正如@fijaaron所说,
GRANT ALL
并不意味着GRANT FILE
GRANT FILE
仅适用于 *.*
也这样吧
GRANT FILE ON *.* TO user;
由于 cP/WHM 取消了在 PHPMyAdmin 中以 root 身份修改用户权限的功能,因此您必须使用命令行来:
mysql> GRANT FILE ON *.* TO 'user'@'localhost';
第 2 步是允许该用户将文件转储到特定文件夹中。有几种方法可以做到这一点,但我最终将一个文件夹放入:
/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 用户。
我尝试了所有解决方案,但仍然不够。经过更多挖掘后,我最终发现我还必须设置“file_priv”标志,并重新启动 mysql。
恢复:
授予权限:
> GRANT ALL PRIVILEGES
ON my_database.*
to 'my_user'@'localhost';
> GRANT FILE ON *.* TO my_user;
> FLUSH PRIVILEGES;
设置旗帜:
> UPDATE mysql.user SET File_priv = 'Y' WHERE user='my_user' AND host='localhost';
最后重启mysql服务器:
$ sudo service mysql restart
之后,我就可以写入
secure_file_priv
目录了。对我来说它是 /var/lib/mysql-files/,但你可以使用以下命令检查它:
> SHOW VARIABLES LIKE "secure_file_priv";
对于未来的读者,如果他们希望使用 bash 批量导出,一种简单的方法如下,
akshay@ideapad:/tmp$ mysql -u someuser -p test -e "select * from offices"
Enter password:
+------------+---------------+------------------+--------------------------+--------------+------------+-----------+------------+-----------+
| officeCode | city | phone | addressLine1 | addressLine2 | state | country | postalCode | territory |
+------------+---------------+------------------+--------------------------+--------------+------------+-----------+------------+-----------+
| 1 | San Francisco | +1 650 219 4782 | 100 Market Street | Suite 300 | CA | USA | 94080 | NA |
| 2 | Boston | +1 215 837 0825 | 1550 Court Place | Suite 102 | MA | USA | 02107 | NA |
| 3 | NYC | +1 212 555 3000 | 523 East 53rd Street | apt. 5A | NY | USA | 10022 | NA |
| 4 | Paris | +33 14 723 4404 | 43 Rue Jouffroy D'abbans | NULL | NULL | France | 75017 | EMEA |
| 5 | Tokyo | +81 33 224 5000 | 4-1 Kioicho | NULL | Chiyoda-Ku | Japan | 102-8578 | Japan |
| 6 | Sydney | +61 2 9264 2451 | 5-11 Wentworth Avenue | Floor #2 | NULL | Australia | NSW 2010 | APAC |
| 7 | London | +44 20 7877 2041 | 25 Old Broad Street | Level 7 | NULL | UK | EC2N 1HN | EMEA |
+------------+---------------+------------------+--------------------------+--------------+------------+-----------+------------+-----------+
如果您由非 root 用户导出,请按如下方式设置权限
root@ideapad:/tmp# mysql -u root -p
MariaDB[(none)]> UPDATE mysql.user SET File_priv = 'Y' WHERE user='someuser' AND host='localhost';
重新启动或重新加载 mysqld
akshay@ideapad:/tmp$ sudo su
root@ideapad:/tmp# systemctl restart mariadb
示例代码片段
akshay@ideapad:/tmp$ cat test.sh
#!/usr/bin/env bash
user="someuser"
password="password"
database="test"
mysql -u"$user" -p"$password" "$database" <<EOF
SELECT *
INTO OUTFILE '/tmp/csvs/offices.csv'
FIELDS TERMINATED BY '|'
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
FROM offices;
EOF
执行
akshay@ideapad:/tmp$ mkdir -p /tmp/csvs
akshay@ideapad:/tmp$ chmod +x test.sh
akshay@ideapad:/tmp$ ./test.sh
akshay@ideapad:/tmp$ cat /tmp/csvs/offices.csv
"1"|"San Francisco"|"+1 650 219 4782"|"100 Market Street"|"Suite 300"|"CA"|"USA"|"94080"|"NA"
"2"|"Boston"|"+1 215 837 0825"|"1550 Court Place"|"Suite 102"|"MA"|"USA"|"02107"|"NA"
"3"|"NYC"|"+1 212 555 3000"|"523 East 53rd Street"|"apt. 5A"|"NY"|"USA"|"10022"|"NA"
"4"|"Paris"|"+33 14 723 4404"|"43 Rue Jouffroy D'abbans"|\N|\N|"France"|"75017"|"EMEA"
"5"|"Tokyo"|"+81 33 224 5000"|"4-1 Kioicho"|\N|"Chiyoda-Ku"|"Japan"|"102-8578"|"Japan"
"6"|"Sydney"|"+61 2 9264 2451"|"5-11 Wentworth Avenue"|"Floor #2"|\N|"Australia"|"NSW 2010"|"APAC"
"7"|"London"|"+44 20 7877 2041"|"25 Old Broad Street"|"Level 7"|\N|"UK"|"EC2N 1HN"|"EMEA"