MySQL 5.7 root密码只能重置不能找回,因authentication_string存哈希值且PASSWORD()不可逆;skip-grant-tables启动后需另开终端连接,UPDATE需严格匹配user和host并FLUSH PRIVILEGES,推荐用ALTER USER替代;最后必须终止跳过权限进程并重启服务。

根本不能“找回”,只能重置——MySQL 5.7 的 root 密码是哈希后存进 authentication_string 字段的,没有明文,PASSWORD() 是单向函数,不存在解密或还原可能。
为什么 skip-grant-tables 启动后还连不上?
常见卡在连接环节,不是方法失效,而是启动没真正生效或连接方式不对:
- Linux/macOS 下运行
mysqld --skip-grant-tables --skip-networking &后终端“卡住”是正常现象——进程已在前台驻留,别Ctrl+C,也别关窗口;必须另开终端执行mysql -u root(不加-p,也不输密码) - Windows 下用管理员 CMD 运行
mysqld --console --skip-grant-tables --shared-memory,该窗口必须保持打开,它是主进程;若一闪而退,说明配置路径错误或端口被占,查my.ini中datadir和port是否冲突 - 报
Can't connect to local MySQL server:先确认mysqld进程是否真起来了,用ps aux | grep mysqld(Linux)或tasklist | findstr mysqld(Windows)验证;再检查 socket 路径,必要时显式指定:mysql -S /var/lib/mysql/mysql.sock -u root
UPDATE user SET authentication_string = ... 为什么总不生效?
这是 5.7 最常静默失败的操作,错一点就白忙活:
- 字段名必须是
authentication_string,不是password(该字段已废弃,写它不会报错但完全无效) -
PASSWORD('新密码')在 5.7.6+ 版本中已被标记为 deprecated,部分小版本仍兼容,但行为不稳定;更稳妥的是用ALTER USER语句(见下一条) -
WHERE条件必须同时限定user = 'root'和host = 'localhost'—— 因为'root'@'localhost'和'root'@'127.0.0.1'是两条独立记录,只写user = 'root'可能改错行 - 执行完必须立刻运行
FLUSH PRIVILEGES;,否则修改只写入磁盘,未加载进内存权限系统,新密码永远不生效
推荐用 ALTER USER 替代 UPDATE(5.7.6+ 必须)
官方从 5.7.6 起明确要求用 ALTER USER,它自动适配认证插件、生成合规哈希、避免手动拼接风险:
- 免密登录后,先执行
USE mysql;,再运行:ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass123'; - 如果报错
ERROR 1820 (HY000),说明账户被标记为过期,先执行:ALTER USER 'root'@'localhost' PASSWORD EXPIRE NEVER; - 若客户端连不上(比如 Navicat 报
Authentication plugin 'caching_sha2_password' cannot be loaded),显式指定插件:ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'MyNewPass123'; - 执行完仍需
FLUSH PRIVILEGES;—— 虽然文档说跳过权限模式下这步无实际作用,但它能防止你误判“没刷新所以密码无效”,加了更稳妥
最易被忽略的收尾动作:改完密码后,必须手动杀掉 mysqld --skip-grant-tables 进程(Linux 用 sudo kill $(pgrep -f "mysqld.*skip-grant-tables"),Windows 直接关掉那个 CMD 窗口),再删掉配置文件里残留的 skip_grant_tables=1,最后用常规方式重启服务。否则,数据库始终处于无权限状态,任何用户都能免密访问。











