mysql 5.7 忘记 root 密码时,必须停服务、用--skip-grant-tables和--skip-networking启动,登录后执行update user set authentication_string = password('新密码') where user='root' and host='localhost',再flush privileges,否则新密码不生效。

MySQL 5.7 忘记 root 密码时,必须停服务、用 --skip-grant-tables 启动绕过权限验证,再更新 authentication_string 字段并执行 FLUSH PRIVILEGES,否则新密码永远不会生效。
停服务 + 安全模式启动(必须带 --skip-networking)
不先停掉正在运行的 mysqld,--skip-grant-tables 会因端口占用失败;不加 --skip-networking,3306 端口仍对外暴露,任何本地网络用户都可无密码连接——这是最常被忽略的安全缺口。
- Linux(CentOS/RHEL):
sudo systemctl stop mysqld;Ubuntu/Debian:sudo systemctl stop mysql - 启动命令必须显式包含
--skip-networking:sudo mysqld --skip-grant-tables --skip-networking & - 别用
mysqld_safe:新版系统中该命令已弃用,直接调用mysqld更稳定 - 终端返回后不要关窗口或 Ctrl+C,它就是 mysqld 进程本身;可通过
ps aux | grep "skip-grant"确认进程在跑
登录后只改对字段、函数和 host 条件
MySQL 5.7 已完全废弃 password 字段,硬写会导致 Unknown column 'password' in 'field list' 报错;且 root@localhost 和 root@127.0.0.1 是两个独立账户,漏掉 host 条件可能改错人。
- 新开终端执行:
mysql -u root(不加-p,也不输任何字符) - 进库后立刻执行:
USE mysql; - 正确更新语句(注意大小写和引号):
UPDATE user SET authentication_string = PASSWORD('MyNewPass123') WHERE user = 'root' AND host = 'localhost'; - 错误写法示例:
UPDATE user SET password = ...(字段不存在)、WHERE user = 'root'(没限定 host,可能命中其他 root 行)
必须执行 FLUSH PRIVILEGES,且后续要清理残留
FLUSH PRIVILEGES 不是可选项——它把磁盘上刚写的 authentication_string 值加载进内存权限缓存;不执行,新密码永远不生效。更常见的是改完就重启,却忘了杀掉跳过权限的 mysqld 进程,导致新服务一启就又被旧进程抢占端口。
- 在 MySQL 客户端内执行:
FLUSH PRIVILEGES;(注意分号) - 退出后手动终止跳过权限的进程:
sudo kill $(pgrep -f "mysqld.*skip-grant-tables") - 检查
/etc/my.cnf或my.ini是否误加了skip-grant-tables=1,如有必须删掉或注释 - 最后用正常方式启动:
sudo systemctl start mysqld(Linux)或net start mysql(Windows)
整个过程里最容易被跳过的不是某条命令,而是确认 host = 'localhost' 和清理 --skip-grant-tables 进程这两步;一旦漏掉,你会反复遇到“密码改了但还是免密”或“新密码登录报 Access denied”的情况。











