MySQL Access denied for user 'root'@'localhost'

来源:互联网 发布:淘宝卖虚拟物品流程 编辑:程序博客网 时间:2024/05/16 12:08

#MySQL Access denied for user ‘root’@’localhost’
问题起因:
执行命令

CREATE USER goodboy IDENTIFIED BY 'goodboy';GRANT ALL privileges ON *.* TO 'goodboy'@'%' identified by 'goodboy' WITH GRANT OPTION;flush privileges;

第二句将所有数据库的权限赋予goodboy用户时出现错误

ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

最终的解决办法是把

GRANT ALL privileges ON *.* TO 'goodboy'@'%' identified by 'goodboy' WITH GRANT OPTION;中的*.*替换成gooddb(数据库).*GRANT ALL privileges ON gooddb.* TO 'goodboy'@'%' identified by 'goodboy' WITH GRANT OPTION;

意思就是,前面一句是把所有库的所有表的权限都赋予goodboy用户,但是root@localhost说:“你丫的谁啊?凭什么动我的奶酪!”我理解的就是一些库比如mysql里面保存有用户名和密码,只有root用户有权限更改,所以这些库的权限不能给别人,哪怕你是我root创建的用户。
数据库gooddb是在root用户创建,可以把权限给goodboy用户,所以第二句命令执行成功了。

问题虽然解决,但中间的过程非常曲折。
首先试着将root用户的host改为%

update user set host='%' where user='root';

这时候

show grants;或者show grants for root@'localhost';

会执行失败。
然后我又增加了一个root用户,host=localhost,和root@%的密码一样,flush privileges后退出重新root用户登录,发现只可见两个数据库,mysql等库不见了。应该是用户权限导致的问题。这时我就没办法再修改mysql这个库里的user表里的用户信息,采用以下步骤:

# /etc/init.d/mysql stop# mysqld_safe --user=mysql --skip-grant-tables --skip-networking &# mysql -u root mysqlmysql> UPDATE user SET Password=PASSWORD('newpassword') where USER='root';mysql> FLUSH PRIVILEGES;mysql> quit# /etc/init.d/mysql restart# mysql -uroot -pEnter password: <输入新设的密码newpassword>

中间的update操作直接换成删除;

Delete FROM user where Host='localhost' and user='root';

或者直接删干净,增加一个用户

INSERT INTO `user` VALUES ('%','root','root123','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','','','','',0,0,0,0);

多少个参数看user这个表的表结构,或者直接用:

insert into mysql.user(Host,User,Password) values("localhost","root",password("root123"));

最后一定要记住flush privileges后再退出。我是直接

INSERT INTO `user` VALUES ('%','goodboy','goodboy','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','','','','',0,0,0,0);

增加一个用户goodboy,再GRANT ALL privileges,依然还是同样的问题。最后偶然之下改了

*.*为gooddb.*

才解决问题。之所以出现问题是在root创建一个用户A时,同时创建了数据库DB,想把DB的权限付给A时,让用户A可以访问到DB这个数据库,却意外将所有数据库和表的权限给A,这是不允许的。建议规范使用,在创建用户之后退出,以新用户登录创建数据库和表,避免相同的问题。

其他方面,在load data infile时出现错误

 The MySQL server is running with the --secure-file-priv option so it cannot execute this statement

问题原因是当前的目录不能作为数据加载的目录,

show variables like '%secure%';+--------------------------+-----------------------+| Variable_name            | Value                 |+--------------------------+-----------------------+| require_secure_transport | OFF                   || secure_auth              | ON                    || secure_file_priv         | /var/lib/mysql-files/ |+--------------------------+-----------------------+

可以看到允许的目录是/var/lib/mysql-files/,当把文件cp到这个目录下再试,出现了文件not found的问题(Are U f**king kidding me?!),原因是文件权限的问题

chmod 777 /var/lib/mysql-files/filename.txt

执行后成功!

我在另一个版本的mysql创建了三个用户:

INSERT INTO `user` VALUES ('%','goodboy','goodboy','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','','','','',0,0,0,0);

创建了用户
root@%
user1@localhost
user1@%
奇怪的是他们在mysql.user的表中的密码没有变成加密的密文,这时出现的问题是我在用user1进行登录的时候,mysql -u user1 -p输入密码,登录被user1@localhost拒绝了,去掉-p后可以正常访问….用user1加载数据进入数据库的时候也被拒绝。
当我用root进行登录后,执行:

GRANT ALL privileges ON *.* TO 'user1'@'%' identified by 'user1' WITH GRANT OPTION;

mysql.user中的三个用户的密码变成了密文,刚才的问题也解决了。
然而,这里执行的是

*.*

就是本页说的第一个问题(what f*ck).如有知晓原因,还请留言!

0 0
原创粉丝点击