本文章的使用到的MySQL版本:
Server version: 5.7.17 MySQL Community Server (GPL)
首先了解一下,此版本的离线重置方式(需要重启MySQL服务),此方法不适合生产环境中。
vim /etc/my.cnf
# 在配置文件中加入不验证登录配置
skip_grant_tables
# 保存并退出
# 重启MySQL服务
systemctl restart mysqld
在修改my.cnf配置文件的时候,存在密码的策略,请清除掉以恢复默认的密码策略
# 输入mysql可以直接登陆上mysql
mysql
# 通过 skip-grant-tables 登录的情况,是不支持grant方式进行密码重置
mysql> grant all on *.* to root@'localhost' identified by '123!@#Qq';
ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement
# 可以查询到用户表的字段有叫 authentication_string,用于存入加密的登录密码
mysql> desc mysql.user;
# 因此更新user表中authentication_string对应的密码,使用password()作为加密方式
mysql> update mysql.user set authentication_string=password('123!@#Qq') where User='root' and Host='localhost';
# 确保权限生效
mysql> flush privileges;
mysql> exit;
# 去掉对主配置文件的修改并重启数据库服务
vim /etc/my.cnf
[mysqld]
#skip-grant-tables
# 重启服务
systemctl restart mysqld
以上方法适用于可以反复重启MySQL服务的情况
以下方式,可以进行在线状态的强制修改root登录密码!
在日常工作中难免会出现root密码忘记或者交接出现问题,同时又不能影响在线业务,可以使用以下方案进行重置。
思路:
1.将需要重置主机/var/lib/mysql/mysql 所有user用户文件直接拷贝到一个能够使用的mysql主机。
2.通过上面离线状态的方法修改对应账户的密码
3.重新拷贝user用户记录表到在线数据库上
4.查看mysql的父进程,再通过发送SIGHUP信号进行重新加载
5.使用新密码进行登录
# 待破解root密码的数据库A的用户信息(用户表的表结构,数据,索引)
ll /var/lib/mysql/mysql | grep user.*
-rw-r----- 1 mysql mysql 10816 Aug 31 11:07 user.frm
-rw-r----- 1 mysql mysql 488 Sep 3 05:14 user.MYD
-rw-r----- 1 mysql mysql 4096 Sep 3 05:14 user.MYI
# 将本地的用户数据库文件拷贝到辅助的数据库B上(前提新建一个test库)
rsync -av /var/lib/mysql/mysql/user.* 192.168.2.2:/var/lib/mysql/test/
# ---------------------------------------------------------------------------
# 进入辅助的数据库B服务器
mysql> update test.user set authentication_string=password('123!@#Qq') where User='root' and Host='localhost';
# 再拷贝对应文件回原数据库A
rsync -av /var/lib/mysql/test/user.* 192.168.2.1:/var/lib/mysql/mysql/
# ---------------------------------------------------------------------------
# 查询数据库A的进程号
ps -aux | grep mysqld
mysql 2390 0.0 21.2 1132988 212056 ? Sl Sep03 0:45 /usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid
# 获取到PID为2390
# 给数据库A发送SIGHUP信号,能够重新加载用户表
kill -SIGHUP 2390
# 验证登录已经修改的root密码
mysql -uroot -p'123!@#Qq'
此办法适用于在线修改,不需要对业务进行中断操作!