MySQL初始密码忘记后必须通过skip-grant-tables跳过权限验证重置:先在[mysqld]段添加该参数并重启服务,再无密码登录执行对应版本的密码修改语句(5.7用UPDATE+PASSWORD(),8.0+用ALTER USER),最后删除配置、重启并验证。

MySQL初始密码忘记后,不能靠“猜”或“重装”,必须通过跳过权限验证的方式重置——核心是让 mysqld 启动时不加载 mysql.user 表,从而允许无密码登录并直接修改密码。
停服务 + 跳过授权表启动(关键第一步)
这一步失败,后续全白忙。不是简单 systemctl stop mysqld 就完事,重点在于“如何安全绕过密码校验”:
- Linux 系统:编辑
/etc/my.cnf,在[mysqld]段下添加skip-grant-tables,保存后执行systemctl restart mysqld - Windows 或需手动启动的场景:用命令行进入
bin/目录,运行mysqld --console --skip-grant-tables --shared-memory(注意不要关闭这个窗口) - ⚠️ 常见坑:
skip-grant-tables必须写在[mysqld]下,写错段落(如 [client])无效;若使用 systemd,改配置后一定要systemctl daemon-reload再重启
无密码登录 + 修改 root 密码(版本差异最大)
登录后执行的 SQL 命令,取决于你的 MySQL 版本——5.7、8.0+ 的字段名和加密方式完全不同,混用会报错:
- MySQL 5.7:
USE mysql;
UPDATE user SET authentication_string=PASSWORD('NewPass123!') WHERE User='root' AND Host='localhost';
FLUSH PRIVILEGES; - MySQL 8.0+(推荐用
ALTER USER):ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPass123!';
如果遇到ERROR 1827(密码策略不满足),先临时关掉:SET GLOBAL validate_password.policy=LOW;
- ⚠️ 常见坑:直接用
UPDATE user SET Password=...在 5.7+ 已失效;authentication_string字段不能用password()函数赋值(该函数在 8.0+ 已废弃),应改用SHA2('xxx', 256)或直接用ALTER USER
清理配置 + 验证新密码(收尾最容易翻车)
很多人改完密码就以为结束了,结果下次启动失败或仍能免密登录——因为忘了还原启动环境:
- 删掉
/etc/my.cnf中的skip-grant-tables行,再执行systemctl restart mysqld - 验证是否生效:
mysql -u root -p,输入新密码;若仍免密进入,说明skip-grant-tables还在生效,或服务没真正重启(检查ps aux | grep mysqld是否有残留进程) - 若提示
Access denied for user 'root'@'localhost',大概率是 Host 匹配错了——检查SELECT User,Host FROM mysql.user WHERE User='root';,常见的是'root'@'127.0.0.1'和'root'@'localhost'是两条不同记录,需分别处理
整个流程最脆弱的环节不是改密码本身,而是启动模式切换时的残留状态:跳过授权表的进程没杀干净、配置文件改了但没 reload、或者多个 my.cnf 文件(如 /etc/my.cnf 和 /usr/my.cnf)优先级搞混。建议操作前先 mysqld --help --verbose | grep "Default options" 确认实际读取的配置路径。









