必须停服务、跳权限验证、改完立刻恢复;新版mysql检测到--skip-grant-tables会禁用alter user等语句,报error 1290,需先执行flush privileges解锁账户管理功能,并必须加--skip-networking防裸奔。

必须停服务、跳权限验证、改完立刻恢复——缺任何一步,不是失败就是留后门;全程需系统管理员权限,且不能暴露在公网或多人共享环境。
为什么不能直接改 my.cnf 加 skip-grant-tables 就重启?
新版 MySQL(5.7.6+ 和 8.0+)启动时若检测到 skip-grant-tables,会自动禁用 ALTER USER、SET PASSWORD 等语句,直接执行会报错:ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement。你进得去,但改不了密码。
- 这不是配置遗漏,是 MySQL 内部的安全限制:跳过权限表的同时,也锁死了账户管理功能
- 必须先执行
FLUSH PRIVILEGES;才能“解锁”账户修改能力 - 仅加
skip-grant-tables还会让 MySQL 继续监听 TCP 端口,本地任意用户都能连上并篡改权限表——等于裸奔
Linux 下安全重置 root 密码的实操要点
核心是两个参数一起启动、立即刷新权限、版本适配语句、彻底清理残留进程。
- 停服务前先确认无残留:
ps aux | grep mysqld,看到mysqld_safe和mysqld两个进程都要杀干净 - 用
mysqld直接启动(不是mysqld_safe),命令必须带全:sudo mysqld --skip-grant-tables --skip-networking --user=mysql & - 新终端连:
mysql -u root(不加-p,也不输密码) - 登录后第一件事:
FLUSH PRIVILEGES;—— 否则后续所有改密操作都无效 - MySQL 8.0+ 必须用:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'NewPass123!';(不加WITH可能因默认插件导致旧客户端连不上) - 改完退出,手动杀掉所有
mysqld进程:sudo killall mysqld,再sudo systemctl start mysqld
Windows 下绕不开的三个坑
路径空格、通信方式、服务名识别,三者错一个就卡在“Can't connect to MySQL server on 'localhost'”。
- 路径含空格(如
Program Files)必须用双引号包裹完整路径,比如:--defaults-file="C:/Program Files/MySQL/MySQL Server 8.0/my.ini" - 必须显式加
--shared-memory,否则 Windows 下默认不启用共享内存,mysql -u root会连不上 - 服务名不是固定叫
mysql,先查清楚:sc queryex type= service state= all | findstr "MySQL",常见的是MySQL80或MySQL57 - 启动命令示例:
mysqld --skip-grant-tables --shared-memory --console(别关这个窗口) - 另开管理员 CMD:
mysql -u root→USE mysql;→FLUSH PRIVILEGES;→ 上面那条ALTER USER语句
改完密码仍登不上?先看这三处
最常被忽略的不是语法,而是认证链路本身断在哪一环。
-
host匹配问题:你用127.0.0.1连,但只改了'root'@'localhost';查匹配结果:SELECT User, Host, plugin FROM mysql.user WHERE User = 'root'; -
plugin不兼容:8.0 默认用caching_sha2_password,某些客户端不支持,强制切回mysql_native_password更稳妥 - 密码策略拦截:
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements→ 临时降级:SET GLOBAL validate_password.policy = LOW; - 没执行
FLUSH PRIVILEGES;:改了authentication_string字段也没用,缓存没更新 - 忘记删配置文件里的
skip-grant-tables行,下次重启又裸奔
真正麻烦的从来不是“怎么改密码”,而是改完之后发现连不上、或者别人还能免密登录——那说明跳过权限的痕迹没清干净,或者认证链路里某一层根本没对上。











