唯一可靠路径是停服务、用--skip-grant-tables和--skip-networking启动,进库改authentication_string字段并执行FLUSH PRIVILEGES;漏掉任意一环新密码都不会生效。

MySQL 5.7 忘记 root 密码时,唯一可靠路径是停服务、用 --skip-grant-tables 和 --skip-networking 启动,进库改 authentication_string 字段并执行 FLUSH PRIVILEGES;漏掉任意一环,新密码都不会生效。
必须先停服务再启动跳过权限模式
正在运行的 mysqld 占着 3306 端口,不先停掉,mysqld --skip-grant-tables 会直接报 Can't start server: Bind on TCP/IP port 错误。同时,--skip-networking 不是可选项——它禁用 TCP 连接,只保留本地 socket,否则同一局域网内任何机器都能无密码连进来。
- Linux(systemd):
sudo systemctl stop mysqld(CentOS/RHEL)或sudo systemctl stop mysql(Ubuntu/Debian) - Windows:
net stop mysql,若服务名非默认(如mysql57),先用sc query | findstr "mysql"确认 - 启动命令必须完整:
sudo mysqld --skip-grant-tables --skip-networking &(别用已弃用的mysqld_safe) - 终端返回后别关窗口或按
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 是两条独立记录,只限定 user = 'root' 可能改错人。
安装、修复、更新或打包一个基于 Python 和 PyMySQL 实现的 Windows `mysql` 命令。适用于用户希望在 PowerShell/CMD 中输入 `mysql` 时重定向到 Python 实现、需要交互式输入 MySQL 连接信息、需要同步到当前用户本地 bin 目录,或需要将该能力封装成可公开复用的 Codex skill。
- 新开终端执行:
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)、直接赋值哈希字符串如'*ABC...'(必须用PASSWORD()函数)
FLUSH PRIVILEGES 不是可选项,而是生效前提
FLUSH PRIVILEGES 把刚写入磁盘的 authentication_string 值加载进内存权限缓存。不执行这步,后续所有登录都仍走旧缓存,新密码永远不生效——这不是延迟,是彻底无效。
- 在 MySQL 客户端内执行:
FLUSH PRIVILEGES;(注意分号) - 退出后必须手动清理残留:
sudo kill $(pgrep -f "mysqld.*skip-grant-tables")(Linux)或关掉运行该命令的 CMD 窗口(Windows) - 检查
/etc/my.cnf或my.ini是否误加了skip_grant_tables=1,如有必须删掉或注释 - 最后用正常方式启动:
sudo systemctl start mysqld或net start mysql
整个流程里最常被跳过的其实是两件事:一是启动时漏掉 --skip-networking,让数据库短暂暴露在局域网中;二是改完密码后没杀掉跳过权限的进程,导致新服务启动失败或持续免密——这两点不是“可能出问题”,而是只要发生,就必然失效。

















