0
点赞
收藏
分享

微信扫一扫

mysql学习系列:总结数据库连接不上的数种情况,问题编号:ERROR 1045 (28000)

(文章目录)

场景

今天重启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.7user 表的 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.7user 表的 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

随缘求赞

举报

相关推荐

0 条评论