(文章目录)
场景
今天重启CDH
的时候,发现重启报错,查看日志才发现是mysql
数据库连接不上。在尝试解决的过程中,踩到一些坑。所以总结一下,并分享给大家看看,减少大家伙继续踩坑的次数。那么,连接报错会提示什么呢?如下:
ERROR 1045 (28000): Access denied for user 'hive'@'datanode01' (using password: YES)
环境
软件 | 版本 |
---|---|
mysql | 5.6.40 |
Centos | 7 |
正文
接下来,我会罗列几种连接报错的原因。
一、密码输入错误
这种情况很司空见惯,有时候忘记密码了,有时候打错密码了。所以,遇到这种情况的时候,先仔细查看自己的密码是否输对了,如果输错密码了 那就重新输对就行!反之,如果是忘记密码,就得费一番功夫了。 然后,这里针对忘记密码,就得区分两种情况了:
i、root账户忘记密码
关闭mysql服务
ps -ef|grep mysqld|grep -v grep|awk '{print $2}'|xargs kill -9
免密启动mysql服务
mysqld_safe --user=mysql --skip-grant-tables --skip-networking &
免密码登录
mysql -uroot
修改密码
UPDATE user SET Password=PASSWORD('密码') where USER='root';
请注意使用
MySQL
提供的PASSWORD()
函数来对密码进行加密。 注意: 在MySQL5.7
中user
表的password
已换成了authentication_string
。 注意:password()
加密函数已经在8.0.11
中移除了,可以使用MD5()
函数代替。
刷新配置
FLUSH PRIVILEGES;
注意: 注意需要执行
FLUSH PRIVILEGES
语句。 这个命令执行后会重新载入授权表。 如果你不使用该命令,你就无法使用新创建的用户来连接mysql
服务器,除非你重启mysql
服务器。
重新启动mysql服务
mysqladmin -uroot -p shutdown
mysqld_safe &
ii、非root账户忘记密码
不是root
账户忘记密码了,就直接用root
账户重新更新密码即可。
UPDATE user SET Password=PASSWORD('密码') where USER='{用户名称}';
FLUSH PRIVILEGES;
请注意使用
MySQL
提供的PASSWORD()
函数来对密码进行加密。 注意: 在MySQL5.7
中user
表的password
已换成了authentication_string
。 注意:password()
加密函数已经在8.0.11
中移除了,可以使用MD5()
函数代替。 注意: 注意需要执行FLUSH PRIVILEGES
语句。 这个命令执行后会重新载入授权表。 如果你不使用该命令,你就无法使用新创建的用户来连接mysql
服务器,除非你重启mysql
服务器。
二、mysql.user 未赋予权限
用户没有访问权限或者没有对应访问地址的权限。比如,user
表配置的host
地址是datanode01
,那如果在namenode01
访问,就会报连接不上。那么,可以使用grant
命令来赋权,grant
可以赋值的权限可以看文末的扩展。比如我们给hive
用户,赋权hive
数据库的访问权限,登录密码为test
,那么可以执行以下命令:
# 赋予部分权限,不限访问地址
GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP on hive.* to 'hive'@'%' identified by 'test';
#or 赋予全部权限,不限访问地址
GRANT all privileges on hive.* to 'hive'@'%' identified by 'test';
#or 赋予全部权限,限制访问地址,datanode01可以自定义,主要为访问的地址
GRANT all privileges on hive.* to 'hive'@'datanode01' identified by 'test';
执行完毕之后,记得刷新权限
FLUSH PRIVILEGES;
三、mysql.user 存在匿名用户
以上情况都排除过了,但是还是登陆不上。那就可能是存在匿名用户。即user
存在可以匹配上的多个host
数据,如图:
Host | User | Password |
---|---|---|
% | test | *19F211E90F007D52C9E9B0127238E56057782 |
localhost | *19F211E90F007D52C9E9B0127238E56057781 |
从上图可以看出,用户test
在表user
里面有多条记录,其中存在匿名用户,而且密码和test
用户的密码不一致。这样,用户在登陆mysql
的时候,mysql
会进行选择,选择了匿名用户的这条记录,然后密码不匹配,就会报这个问题。那么匹配的规则是怎么样的呢?
首先,检查 Host 字段。如果有多个 Host 符合条件,则选择匹配度最高的记录(IP地址 > 通配符%)。 其次,检查 User 字段。如果有多个 User 符合条件,则选择匹配度最高的记录。匿名用户可以匹配任何用户,因此匹配度最低。 ——引自《https://www.cnblogs.com/chyingp/p/mysql-access-denied-because-of-anonymous-user.html》
那么如何解决这个问题呢,这个有两种方案:
i. 新插入一条Host
为需要访问的地址的记录
ii. 删除匿名用户的记录
记得,无论使用哪种方案,都要刷新权限,不然除非启动mysql
服务器,否则都是不生效的。
FLUSH PRIVILEGES;
总结
针对mysql
数据库连接不上的情况,博主罗列了几种情况。一般按照这几种情况,依次排查,都可以解决这个问题。当然,如果有其他情况,也欢迎大家留言。谢谢大家!
扩展
grant命令可以赋予的权限
Select_priv Insert_priv Update_priv Delete_priv Create_priv Drop_priv Reload_priv Shutdown_priv Process_priv File_priv Grant_priv References_priv Index_priv Alter_priv
随缘求赞
如果我的文章对大家产生了帮忙,可以在文章底部点个赞或者收藏; 如果有好的讨论,可以留言; 如果想继续查看我以后的文章,可以点击关注 可以扫描以下二维码,关注我的公众号:枫夜之求索阁,查看我最新的分享!