MYSQL 进入输出文件“拒绝访问”-但我的用户具有“全部”访问权限.. 文件夹是 CHMOD 777
Posted
技术标签:
【中文标题】MYSQL 进入输出文件“拒绝访问”-但我的用户具有“全部”访问权限.. 文件夹是 CHMOD 777【英文标题】:MYSQL into outfile "access denied" - but my user has "ALL" access.. and the folder is CHMOD 777 【发布时间】:2011-08-30 18:58:06 【问题描述】:有什么想法吗?
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)
【问题讨论】:
"ALL PRIVILEGES" 不包括所有权限。与这种情况相关,它不包括FILE
特权,这是SELECT INTO OUTFILE
语句所必需的。我在英语和 MySQL 之间的这种不匹配方面遇到了一些麻烦:dba.stackexchange.com/a/96894/53784
如果您随后遇到“MySQL 服务器正在使用 --secure-file-priv 选项运行,因此它无法执行此语句”,请查看:***.com/questions/32737478/…
【参考方案1】:
对于未来的读者,如果他们希望使用 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
示例代码 sn-p
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"
【讨论】:
【参考方案2】:我尝试了所有解决方案,但仍然不够。经过一番挖掘,我最终发现我还必须设置“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";
【讨论】:
【参考方案3】:由于 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)
删除文件。这使它在您的网络用户下运行,无需调用 mysql 用户。
【讨论】:
【参考方案4】:正如@fijaaron 所说,
GRANT ALL
并不暗示 GRANT FILE
GRANT FILE
仅适用于 *.*
也是这样
GRANT FILE ON *.* TO user;
【讨论】:
【参考方案5】:尝试执行这条 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';
【讨论】:
@Shackrock:查看更新的答案。确保您已将FILE
授予用户。
这里有两个问题。 1) GRANT ALL 不做 GRANT FILE。 2) GRANT FILE 仅适用于 *.* (即全局)。两者都是 MySQL 中的错误。
仅供参考,在执行此操作之前请仔细考虑您不是数据库管理员。我很不高兴发现我改变了特权(“Nooooooo!”)。 :-)
似乎它在写入文件系统中除 /var/lib/mysql 以外的位置时也存在问题,这似乎与文档相反。即使目标文件夹归 mysql:mysql 所有并且每个人都有 rwx 权限和/或使用 sudo 调用...(来自 Ubuntu 此处)
你不需要在GRANT
之后使用FLUSH PRIVILEGES
。仅当您使用 SQL 而不是使用GRANT
修改权限表时才需要这样做。【参考方案6】:
老实说,我没有费心去处理赠款问题,即使没有特权也可以:
echo "select * from employee" | mysql --host=HOST --port=PORT --user=UserName --password=Password DATABASE.SCHEMA > output.txt
【讨论】:
那是因为您只是在执行常规 SELECT,而不是 SELECT INTO OUTFILE(在这种情况下为 .csv 文件)。 这对于较大的表来说是一种不好的方法,因为客户端会在将任何内容放入文件之前缓冲整个结果集。 MySQL 将使用这种方法对文件进行制表符分隔,非常完美。在尝试了十几个文件权限、MySQL 设置和各种授权之后,所有这些都跨越了 5 或 6 个不同的帮助页面,这很有效。免得自己头疼,使用它。 在使用此方法之前不要忘记切换到相应的代码页,例如如果导出的数据中有特殊字符,则为“chcp 1252”或“chcp 65001”。 这是迄今为止最实用的答案,其他人非常依赖特权,不是每个人都可以控制以上是关于MYSQL 进入输出文件“拒绝访问”-但我的用户具有“全部”访问权限.. 文件夹是 CHMOD 777的主要内容,如果未能解决你的问题,请参考以下文章
用户''@ localhost'拒绝访问。试图插入数据PHP Mysql [重复]
Python Anywhere 拒绝访问 MySQL 数据库
通过 cPanel 创建的 MySql 用户在尝试登录时被“拒绝访问”
React Native,Android Studio,JDBC,MySql - 拒绝访问用户'root'@'ipaddress'