MySQL登录时出现Access denied for user ‘root‘@‘localhost‘ (using password: YES)

最近在使用Ansible 从源码编译mysql5.7,尝试了很多次 成功了之后尝试登录mysql提示上述报错

经过我的检查后问题是出在mysql进程没有正常启动或者重启导致的

 

Ansible 从源码安装mysql,必然要在一步使用 mysql –initialize  去重置mysql密码并在重置后重启mysql ,从而让新密码应用

而如果问题出在重启mysql这部分 则会导致新密码无法应用

但是问题在于 Ansible有良好的报错机制,却没有报出重启失败的错误,这个问题是出在 systemd 进程管理的一个小bug

如果在systemctl start mysql 之前,使用,命令行直接运行 mysql.server start 则会导致systemd 无法正常管理mysql进程

如果此时贸然执行了 systemctl restart mysql  则会按照systemd的管理模式进行:停止已有systemd管理的进程(因命令行启动,所以这步直接跳过),删除掉已创建的mysql.pid文件,并尝试启动mysql

但是此时启动mysql会产生端口占用 导致mysql启动不正常,而启动不正常并不会导致systemd报错,如果此时使用systemctl status mysql 会查看到进程状态为 fail 而非常见的 inactive(dead)

如果要解除现在这种不稳定状态,只能kill 掉原启动的mysql进程,再执行systemctl restart mysql重启才可恢复正常

这类问题同样会发生在 nginx、Prometheus、redis等常用的使用tcp端口的应用