必须区分能否登录:能登录时用ALTER USER直接修改(5.7.6+推荐,无需FLUSH);完全忘记密码则停服务、加skip-grant-tables启动、UPDATE authentication_string字段并FLUSH PRIVILEGES,之后务必删除该配置重启。

mysqld 服务停不掉、mysql -u root -p 报错 Access denied、改完密码还是登不上——这些都不是配置问题,而是你没选对重置路径。CentOS 7 上重置 MySQL root 密码,必须区分两种情况:能正常登录 MySQL 和 完全忘记密码无法登录。方法完全不同,混用会卡在 FLUSH PRIVILEGES 或 skip-grant-tables 不生效。
能登录 MySQL 时直接用 ALTER USER 修改
这种情况指你还记得当前 root 密码,只是想换一个。这是最安全、最推荐的方式,不需重启服务、不绕过权限校验。执行前确认 MySQL 版本:mysql --version。5.7.6 及以上必须用 ALTER USER,旧版本才兼容 SET PASSWORD。
- 登录:
mysql -u root -p,输入当前密码 - 执行修改(注意单引号和 @ 符号不能漏):
ALTER USER 'root'@'localhost' IDENTIFIED BY 'YourNewPass123!'; - 立即生效,不用
FLUSH PRIVILEGES(ALTER USER自带刷新) - 退出后测试:
mysql -u root -p,输入新密码
如果提示 ERROR 1819 (HY000): Your password does not satisfy the current policy requirements,说明启用了密码强度策略。临时关闭可执行:SET GLOBAL validate_password.policy=LOW;,再重试。
完全无法登录时用 skip-grant-tables 绕过验证
这是真忘密码的唯一可靠路径。核心是让mysqld 启动时不加载权限表,但必须严格按顺序操作,否则会卡死或 SELinux 拒绝写入。
先停服务:systemctl stop mysqld。确认已停:systemctl is-active mysqld 应返回 inactive。
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
- 编辑配置:
vi /etc/my.cnf,在[mysqld]段末尾新增一行:skip-grant-tables - 保存后启动:
systemctl start mysqld(此时不会校验密码) - 免密登录:
mysql -u root(不加-p,直接回车) - 切换数据库并更新密码(MySQL 5.7+):
USE mysql; UPDATE user SET authentication_string=PASSWORD('NewPass123!') WHERE User='root'; - 强制刷新:
FLUSH PRIVILEGES; - 退出后,**必须删掉
/etc/my.cnf里的skip-grant-tables行**,再systemctl restart mysqld
常见坑:authentication_string 字段名在 MySQL 5.7+ 才有效;如果用 password 字段会报错;PASSWORD() 函数在 8.0+ 已废弃,但 CentOS 7 默认装的是 5.7,仍可用。
mysqld 启动失败或跳过失败的排查点
skip-grant-tables 加了却还是要密码?大概率是配置没生效或服务没真正重启。
检查是否真的读取了 /etc/my.cnf:mysqld --help --verbose 2>/dev/null | grep "Default options",确认输出里包含该路径。
- 查看错误日志定位问题:
tail -n 20 /var/log/mysqld.log,常见报错如Can't open and lock privilege tables表示skip-grant-tables写错位置 - SELinux 可能拦截写操作:临时关闭测试
setenforce 0,成功后再用chcon修复上下文 -
systemctl restart mysqld实际可能只是 reload,务必用stop+start确保干净重启
最后提醒:整个过程必须保证服务器无其他用户连接,skip-grant-tables 开启期间,任何知道 IP 和端口的人都能无密码访问数据库。

















