MySQL忘记root密码重置(Linux环境)
前言
忘记MySQL root密码是常见问题,不用慌,本文教你一步步重置。
重置步骤
第一步:停止MySQL服务
systemctl stop mysqld
第二步:以跳过权限模式启动
mysqld_safe --skip-grant-tables &
或者用这个方式:
systemctl set-environment MYSQLD_OPTS="--skip-grant-tables"
systemctl start mysqld
第三步:无密码登录MySQL
mysql -u root
现在不需要密码就能直接进了。
第四步:修改密码
-- 刷新权限
FLUSH PRIVILEGES;
-- 修改密码(MySQL 5.7)
ALTER USER 'root'@'localhost' IDENTIFIED BY '你的新密码';
-- 如果上面不行,用这个
UPDATE mysql.user SET authentication_string=PASSWORD('你的新密码') WHERE User='root' AND Host='localhost';
-- 刷新权限
FLUSH PRIVILEGES;
第五步:退出,正常重启MySQL
exit
systemctl stop mysqld
systemctl start mysqld
第六步:用新密码登录测试
mysql -u root -p
输入新密码,能进去就成功了。
常见坑
坑1:MySQL 8.0和5.7语法不一样
MySQL 8.0 不能用 PASSWORD() 函数了。
解决: 用 ALTER USER 语句。
坑2:skip-grant-tables没生效
启动后还是要密码。
原因: 可能MySQL已经在跑了,新启动的没生效。
解决: 先彻底停掉MySQL:
systemctl stop mysqld
pkill -9 mysqld
再重新启动。
坑3:改完密码忘记FLUSH PRIVILEGES
改完密码直接退出,结果还是不能用新密码登录。
解决: 改完密码一定要执行 FLUSH PRIVILEGES;
坑4:远程登录还是不行
本地改完密码,远程连接还是连不上。
原因: root用户只允许本地登录。
解决: 需要单独授权远程登录:
CREATE USER 'root'@'%' IDENTIFIED BY '密码';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;
总结
六步重置root密码:
- 停MySQL
- 跳过权限启动
- 无密码登录
- 改密码
- 正常重启
- 测试登录
记住: 改完密码一定要 FLUSH PRIVILEGES;
遇到问题加QQ23979811 协助处理
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 协助处理