一、背景:
一天,检查java程序日志发现一直在报mysql连接失败,手动连接mysql时,发现也连不上,且,确认密码是正确的。
二、修复思路:
可能是程序bug或者其他用户的什么误操作改了密码。su -切换至root用户,通过安全启动mysql,跳过权限检查强行登录,然后重新给用户密码赋值。
三、安全启动mysql
1.先关闭mysql
systemctl stop mysqld
2.设置MySQL安全启动
systemctl set-environment MYSQLD_OPTS="--skip-grant-tables"
3.重新启动并登录
systemctl start mysqld
mysql -u root
注:
- 设置成安全启动后,不用再输入密码
4.尝试修改密码
use mysql;
ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';
注:
- 失败了,继续排查思路,查看MySQL用户表,怀疑root的host不是localhost
- 这里的‘123456’是示例密码,改密码失败时也有可能是密码强度太低。当然,这个错时都会有明显的报错指向信息
5.查看用户表
use mysql;
select user,host from user;
注:
- 发现是连root用户都不见了,怀疑:可能性是程序bug,也可能是mysql的数据目录遭到损坏。
6.重新创建root用户
CREATE USER 'root'@'%' IDENTIFIED BY '123456';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;
exit
注:
- 配成 ‘root’@'%'是为了方便能远程访问mysql。
四、关闭mysql安全启动设置,重新启动
1.关闭mysql并关闭安全启动设置
systemctl stop mysqld
systemctl unset-environment MYSQLD_OPTS
2.重新启动并登录
systemctl start mysqld
mysql -u root -p
注:
- 启动成功