MySQL忘记root密码重置(Linux环境)
前言
做运维或者开发的同学肯定遇到过这种情况:服务器上的MySQL数据库用了很久,突然有一天忘记了root密码,登录不进去了。这时候项目可能正在运行,不能随便重装数据库,那怎么办呢?
别慌,MySQL提供了一种跳过权限验证的启动方式,我们可以用这种方式登录进去,然后重置root密码。这篇文章就详细讲讲在Linux环境下怎么重置MySQL的root密码。
操作步骤
1. 先停止MySQL服务
首先我们需要把正在运行的MySQL服务停掉:
systemctl stop mysqld
如果你用的是MariaDB,命令是:
systemctl stop mariadb
执行完之后可以检查一下MySQL是不是真的停了:
ps aux | grep mysql
如果没有看到mysql进程,说明已经停掉了。
2. 跳过权限验证启动MySQL
接下来我们要用 --skip-grant-tables 参数启动MySQL,这样启动之后就可以不用密码直接登录了。
mysqld_safe --skip-grant-tables &
注意最后面的 & 符号,这个是让MySQL在后台运行。
执行完这个命令之后,等个几秒钟,让MySQL完全启动起来。
3. 无密码登录MySQL
现在我们就可以不用密码直接登录MySQL了:
mysql -u root
执行完之后直接就进入MySQL命令行界面了,不需要输入密码。
4. 修改root密码
登录进去之后,我们就可以修改root密码了。
首先选择mysql数据库:
USE mysql;
然后修改root密码。注意不同版本的MySQL,修改密码的语句不一样:
MySQL 5.7版本:
UPDATE user SET authentication_string=PASSWORD('你的新密码') WHERE User='root';
MySQL 8.0版本:
ALTER USER 'root'@'localhost' IDENTIFIED BY '你的新密码';
修改完密码之后,一定要执行一下刷新权限的命令:
FLUSH PRIVILEGES;
然后退出MySQL:
EXIT;
5. 关闭跳过权限的MySQL进程,正常重启MySQL
现在我们需要把刚才用跳过权限方式启动的MySQL进程关掉,然后用正常方式重启。
先找到MySQL的进程ID:
ps aux | grep mysqld_safe
然后杀掉这个进程:
kill -9 进程ID
等个几秒钟,让MySQL完全关闭。然后用正常方式启动MySQL:
systemctl start mysqld
6. 验证新密码能不能登录
最后我们来验证一下新密码能不能正常登录:
mysql -u root -p
输入你刚才设置的新密码,如果能正常登录进去,说明密码重置成功了。
常见坑
坑1:修改密码之后忘了执行FLUSH PRIVILEGES
很多同学修改完密码之后直接就退出了,结果发现重启MySQL之后密码还是不对。这是因为修改完密码之后一定要执行 FLUSH PRIVILEGES 刷新权限,不然修改不会生效。
坑2:MySQL版本不一样,修改密码的语句不一样
很多同学抄网上的教程,结果修改密码的语句不对,报错了。这是因为MySQL 5.7和MySQL 8.0修改密码的方式不一样。5.7用的是 authentication_string 字段,8.0用的是 ALTER USER 语句。
你可以先执行一下这个命令看看你的MySQL版本:
SELECT VERSION();
然后用对应的语句修改密码。
坑3:跳过权限启动的时候没加 & 符号
如果执行 mysqld_safe --skip-grant-tables 的时候没加 & 符号,那这个命令就会一直占着你的终端窗口,你没法继续操作了。所以一定要记得在最后面加个 & 符号,让它在后台运行。
坑4:杀进程的时候杀错了
杀进程的时候一定要看清楚,不要把其他无关的进程杀掉了。最好先 ps aux | grep mysqld 看一下,确认哪个是我们刚才启动的跳过权限的MySQL进程。
总结
Linux环境下重置MySQL root密码的步骤总结一下:
- 停止MySQL服务
- 用 --skip-grant-tables 参数跳过权限启动
- 无密码登录MySQL
- 修改root密码
- 刷新权限
- 关闭跳过权限的进程,正常重启MySQL
- 用新密码验证登录
记住这几个步骤,以后忘记root密码的时候就不用慌了,按照这个流程操作就能搞定。
遇到问题加QQ23979811 协助处理