mysql 5.7 忘记 root 密码时,必须用 --skip-grant-tables 启动绕过权限验证,再更新 authentication_string 字段并执行 flush privileges,否则新密码不会生效;密码以哈希形式存于 authentication_string 字段,不可找回,只能重置。

直接说结论:MySQL 5.7 忘记 root 密码时,必须用 --skip-grant-tables 启动绕过权限验证,再更新 authentication_string 字段并执行 FLUSH PRIVILEGES,否则新密码不会生效。
为什么不能直接改配置文件或查原始密码
MySQL 5.7 的密码不是明文存储,而是哈希后存在 mysql.user 表的 authentication_string 字段里;PASSWORD() 只是单向加密函数,不是解密工具。你没法“找回”,只能重置。所有声称能“查看原始密码”的方案都不可信——连 MySQL 自己都不存原始密码。
停服务 + 跳过权限启动(Linux/macOS)
必须先停掉正在运行的 MySQL 服务,否则 mysqld --skip-grant-tables 会报 Can't start server: Bind on TCP/IP port 错误。
-
sudo systemctl stop mysqld(CentOS/RHEL)或sudo service mysql stop(Ubuntu/Debian) - 然后运行:
sudo mysqld --skip-grant-tables --skip-networking & -
--skip-networking很关键:防止其他机器连上来绕过认证 - 该命令会后台运行,终端返回后即可进行下一步;别 Ctrl+C,也别加
disown,否则 3306 端口可能不监听
免密登录后必须用对字段和函数
新开终端,执行 mysql -u root(不带 -p,也不输密码),进库后立刻执行:
USE mysql;UPDATE user SET authentication_string = PASSWORD('MyNewPass123') WHERE user = 'root' AND host = 'localhost';- 错误写法会导致静默失败或报错
Unknown column 'password' in 'field list':MySQL 5.7 已废弃password字段,必须更新authentication_string - 必须用
PASSWORD('新密码')函数,不能直接赋值字符串(如'*ABC') - WHERE 条件要同时匹配
user = 'root'和host = 'localhost',否则可能改错账户(root@127.0.0.1是另一个用户) - 执行完必须立刻运行
FLUSH PRIVILEGES;,否则内存权限缓存未刷新,新密码无效
改完密码后最容易漏的两件事
很多人改完就去试登录,发现还是免密——说明跳过权限验证的状态还在持续。根本原因是没清理启动参数或配置残留。
- 如果你用的是
mysqld --skip-grant-tables临时启动,改完密码后必须手动终止该进程:sudo kill $(pgrep -f "mysqld.*skip-grant-tables") - 千万别只关终端就以为结束了;如果用
kill -9强杀,可能导致/tmp/mysql.sock或/tmp/mysql.sock.lock文件被锁住,后续systemctl start mysqld会失败 - 最后用常规方式启动:
sudo systemctl start mysqld,再验证mysql -u root -p
最常被忽略的其实是 FLUSH PRIVILEGES 和清理 --skip-grant-tables 进程这两步——它们不执行,前面所有操作等于白做。











