mysql 5.7 忘记 root 密码时,--skip-grant-tables 是唯一可靠入口,但必须配合 flush privileges 和正确的字段更新,否则新密码不生效;密码以哈希形式存于 authentication_string 字段,不可找回,只能重置。

直接说结论:MySQL 5.7 忘记 root 密码时,--skip-grant-tables 是唯一可靠入口,但必须配合 FLUSH PRIVILEGES 和正确的字段更新,否则新密码不生效。
为什么不能直接改配置文件或查原始密码
MySQL 5.7 的密码不是明文存储,而是哈希后存在 mysql.user 表的 authentication_string 字段里;PASSWORD() 只是加密函数,不是解密工具。你没法“找回”,只能重置。所有声称能“查看原始密码”的方案都不可信——连 MySQL 自己都不存原始密码。
执行 --skip-grant-tables 启动时的常见卡住现象
Linux/macOS 下运行 mysqld --skip-grant-tables --skip-networking & 后终端没反应、光标不动,这是正常行为:mysqld 进程已前台驻留,不会自动返回 shell。别 Ctrl+C,也别后台化(比如加 & 再加 disown),否则 3306 端口可能不监听。
- 正确做法是另开一个终端,立刻执行
mysql -u root(不带-p,也不输密码) - Windows 下用管理员命令行运行
mysqld --console --skip-grant-tables --shared-memory,该窗口必须保持打开,它是 mysqld 主进程 - 如果执行后报错
Can't start server: Bind on TCP/IP port,说明已有 mysqld 在运行,先systemctl stop mysqld或net stop mysql
MySQL 5.7 改密码必须用对字段和函数
在免密登录后的 MySQL 命令行中,必须先 USE mysql;,再执行更新。错误写法会导致静默失败或报错 Unknown column 'password' in 'field list'。
- 必须更新
authentication_string字段,不是password(该字段在 5.7 已废弃) - 必须用
PASSWORD('新密码')函数,不能直接赋值字符串(如'*ABC...') - WHERE 条件要同时匹配
user = 'root'和host = 'localhost',否则可能改错账户(root@127.0.0.1是另一个用户) - 执行完必须立刻运行
FLUSH PRIVILEGES;,否则内存权限缓存未刷新,新密码无效
正确语句示例:
USE mysql;
UPDATE user SET authentication_string = PASSWORD('MyNewPass123') WHERE user = 'root' AND host = 'localhost';
FLUSH PRIVILEGES;
改完密码后最容易漏的两件事
很多人改完就去试登录,发现还是免密——说明跳过权限验证的状态还在持续。根本原因是没清理启动参数或配置残留。
- 如果你用的是
mysqld --skip-grant-tables临时启动,改完密码后必须手动终止该进程(kill [pid]或关掉对应终端),再用正常方式启动服务(systemctl start mysqld或net start mysql) - 如果你改了配置文件(如
/etc/my.cnf或 Windows 的my.ini),必须删掉或注释掉skip-grant-tables这一行,再重启服务;漏删等于长期裸奔 - 验证是否恢复:用
mysql -u root -p登录,输入新密码——如果没弹出密码提示直接进去了,说明skip-grant-tables还在生效











