mysql初始密码忘记后的重置流程详解

来源:这里教程网 时间:2026-02-28 20:39:53 作者:

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;<br>UPDATE user SET authentication_string=PASSWORD('NewPass123!') WHERE User='root' AND Host='localhost';<br>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"
确认实际读取的配置路径。

相关推荐