MySQL 8 忘记 root 密码?这两种方法帮你轻松解决

MySQL 8 忘记 root 密码?这两种方法帮你轻松解决

    • [📝 前言](#📝 前言)
    • [🎯 解决方案一:使用 skip-grant-tables 参数](#🎯 解决方案一:使用 skip-grant-tables 参数)
      • [步骤 1:修改配置文件](#步骤 1:修改配置文件)
      • [步骤 2:重启 MySQL 服务](#步骤 2:重启 MySQL 服务)
      • [步骤 3:无密码登录 MySQL](#步骤 3:无密码登录 MySQL)
      • [步骤 4:修改 root 密码](#步骤 4:修改 root 密码)
      • [步骤 5:恢复配置文件并重启](#步骤 5:恢复配置文件并重启)
      • [步骤 6:验证新密码](#步骤 6:验证新密码)
    • [🚀 解决方案二:使用 mysqld_safe 安全模式](#🚀 解决方案二:使用 mysqld_safe 安全模式)
      • [步骤 1:停止 MySQL 服务](#步骤 1:停止 MySQL 服务)
      • [步骤 2:安全模式启动](#步骤 2:安全模式启动)
      • [步骤 3:无密码登录](#步骤 3:无密码登录)
      • [步骤 4:修改密码](#步骤 4:修改密码)
      • [步骤 5:重启服务](#步骤 5:重启服务)
      • [步骤 6:验证新密码](#步骤 6:验证新密码)
    • [💡 总结与建议](#💡 总结与建议)

|-----------------------------|
| 🌺The Begin🌺点点关注,收藏不迷路🌺 |

📝 前言

今天维护服务器时遇到一个棘手问题:MySQL 8 数据库的 root 密码找不到了,无法连接数据库:

bash 复制代码
[root@mysql ~]# mysql -uroot -p
Enter password:
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

相信很多 DBA 和运维人员都遇到过这种尴尬情况。折腾一番后,我找到了两种可行的解决方案,现在分享给大家,希望能帮到遇到同样问题的朋友。

🎯 解决方案一:使用 skip-grant-tables 参数

这种方法通过设置 skip-grant-tables 参数来跳过权限表的加载。当 MySQL 以该参数启动时,会跳过所有用户权限和认证检查,允许任何人无需密码登录。

步骤 1:修改配置文件

编辑 MySQL 配置文件 my.cnf,在 [mysqld] 部分添加 skip-grant-tables

bash 复制代码
[root@mysql ~]# cat /etc/my.cnf
[mysqld]
user = mysql
port = 3306
basedir = /usr/local/mysql
datadir = /data/mysql/data
socket = /data/mysql/tmp/mysql.sock
pid-file = /data/mysql/tmp/mysql.pid
skip-grant-tables   # 添加这一行

步骤 2:重启 MySQL 服务

bash 复制代码
[root@mysql ~]# service mysql status
 SUCCESS! MySQL running (23724)

[root@mysql ~]# service mysql restart
Shutting down MySQL.. SUCCESS!
Starting MySQL........... SUCCESS!

步骤 3:无密码登录 MySQL

bash 复制代码
[root@mysql ~]# mysql -uroot
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 7
Server version: 8.0.26 MySQL Community Server - GPL

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MySQL [(none)]>

步骤 4:修改 root 密码

sql 复制代码
MySQL [(none)]> use mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed

-- 注意:必须先执行 FLUSH PRIVILEGES
MySQL [mysql]> flush privileges;
Query OK, 0 rows affected (0.00 sec)

-- 修改密码(根据你的需要修改 'mysql' 为 desired password)
MySQL [mysql]> ALTER USER 'root'@'%' IDENTIFIED BY 'mysql';
Query OK, 0 rows affected (0.01 sec)

⚠️ 关键提醒 :在 --skip-grant-tables 模式下,MySQL 会跳过权限验证,不会自动应用对 mysql.user 表的修改。必须 先执行 FLUSH PRIVILEGES 手动刷新权限表,才能确保修改生效。

步骤 5:恢复配置文件并重启

bash 复制代码
# 注释掉 skip-grant-tables 参数
[root@mysql ~]# sed -i '/skip-grant-tables/s/^/#/' /etc/my.cnf

# 重启 MySQL 服务
[root@mysql ~]# service mysql restart
Shutting down MySQL.. SUCCESS!
Starting MySQL........... SUCCESS!

步骤 6:验证新密码

bash 复制代码
[root@mysql ~]# mysql -uroot -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.26 MySQL Community Server - GPL

MySQL [(none)]>

成功登陆!🎉


🚀 解决方案二:使用 mysqld_safe 安全模式

这种方法原理和方案一相同,只是使用 mysqld_safe 命令启动 MySQL 安全模式来跳过权限表。

步骤 1:停止 MySQL 服务

bash 复制代码
[root@mysql ~]# service mysql stop
Shutting down MySQL. SUCCESS!

步骤 2:安全模式启动

bash 复制代码
[root@mysql ~]# /usr/local/mysql/bin/mysqld_safe --skip-grant-tables &
[1] 6736
[root@mysql ~]# 2026-01-07T09:06:02.741202Z mysqld_safe Logging to '/data/mysql/log/error.log'
2026-01-07T09:06:02.765308Z mysqld_safe Starting mysqld daemon with databases from /data/mysql/data

步骤 3:无密码登录

bash 复制代码
[root@mysql ~]# mysql -uroot
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 7
Server version: 8.0.26 MySQL Community Server - GPL

MySQL [(none)]>

步骤 4:修改密码

sql 复制代码
MySQL [(none)]> use mysql;
Database changed

-- 同样需要先执行 flush privileges
MySQL [mysql]> flush privileges;
Query OK, 0 rows affected (0.01 sec)

-- 设置新密码
MySQL [mysql]> ALTER USER 'root'@'%' IDENTIFIED BY 'mysql1';
Query OK, 0 rows affected (0.01 sec)

步骤 5:重启服务

bash 复制代码
[root@mysql ~]# service mysql restart
Shutting down MySQL.2026-01-07T09:07:56.558733Z mysqld_safe mysqld from pid file /data/mysql/tmp/mysql.pid ended
 SUCCESS!
[1]+  Done                    /usr/local/mysql/bin/mysqld_safe --skip-grant-tables

步骤 6:验证新密码

bash 复制代码
[root@mysql ~]# mysql -uroot -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.26 MySQL Community Server - GPL

MySQL [(none)]>

成功登陆!🎊


💡 总结与建议

两种方法的对比

方案 适用场景 优点 缺点
方案一(修改配置文件) 可以重启 MySQL 服务 操作规范,适合生产环境 需要修改配置文件并重启
方案二(mysqld_safe) 无法修改配置文件或需要快速处理 无需改配置文件,启动灵活 需要知道 mysqld_safe 的路径

注意事项

  1. MySQL 8 的密码修改语法 :MySQL 8 不再支持 SET PASSWORDUPDATE user SET password 的旧语法,必须使用 ALTER USER 命令

  2. FLUSH PRIVILEGES 的重要性 :在跳过权限表模式下,一定要先执行 FLUSH PRIVILEGES,否则修改不会生效

  3. 安全性考虑 :操作完成后务必关闭 skip-grant-tables 模式,否则数据库处于无防护状态,极其危险

  4. 备份配置文件 :修改 my.cnf 前建议先备份

预防措施

为了防止再次忘记密码,建议:

  • 使用密码管理工具(如 LastPass、1Password)保存密码
  • 定期更换密码并记录
  • 配置 MySQL 连接使用 socket 认证(本地连接无需密码)
  • 设置 root 用户的多因素认证

希望这篇文章对你有帮助!如果你在操作过程中遇到任何问题,欢迎在评论区留言交流。如果觉得文章有用,请点赞收藏支持一下~ 😊

|---------------------------|
| 🌺The End🌺点点关注,收藏不迷路🌺 |

相关推荐
刃神太酷啦25 分钟前
Linux 系统 MySQL 完整安装配置教程:从卸载 MariaDB 到优化 my.cnf----《Hello MySQL!》(1)
android·linux·c语言·c++·mysql·leetcode·mariadb
RestCloud35 分钟前
集成链路监控体系搭建:接口调用、数据流转与异常告警全覆盖
数据库·数据安全·ipaas·api管理·数据监控·集成平台·api 治理
xxwl5851 小时前
MySQL 基础学习笔记
数据库·mysql
SKH.1 小时前
Linux软件编程(6)线程间通信
java·开发语言·数据库
Rain的Java大神之路1 小时前
PC版网站被狂刷怎么处理
java·数据库·redis·后端·mysql·web安全·运维开发
闻哥2 小时前
小表驱动大表——SQL查询优化的核心原则(深度剖析+流程图)
数据库·sql·流程图
cmes_love2 小时前
港股Level2历史数据:逐笔成交与分钟线
数据库·oracle
自由能燃气设备2 小时前
燃气热水锅炉/全预混低氮冷凝锅炉哪个品牌好?哪家好?6大商用品牌横评
大数据·数据库·人工智能
智购科技智能售货柜2 小时前
2026自动售货机设备能耗计量系统:从功率监测到能效分析的工程实践~YH
数据库·人工智能·redis·缓存·架构·perl·symfony