MySQL 5.7 root密码只能重置不能找回,因authentication_string存哈希值且PASSWORD()不可逆;必须停服务后以--skip-grant-tables启动,严格匹配user和host更新authentication_string并执行FLUSH PRIVILEGES,最后终止跳过权限进程并重启服务。

必须停服务再启动 skip-grant-tables 模式
直接连不上、改不了,因为 MySQL 5.7 的 authentication_string 字段是哈希值,没有明文可查,也没有“找回”一说。唯一可行路径是停掉正在运行的 mysqld 进程,再以跳过权限验证的方式重启——否则所有 SQL 修改都会被拒绝。
关键点有三个:--skip-grant-tables 绕认证、--skip-networking 防暴露、& 后台运行别关窗口。漏掉 --skip-networking 就等于把没上锁的数据库直接挂到局域网里。
- Linux(systemd):先
sudo systemctl stop mysqld,再sudo mysqld_safe --skip-grant-tables --skip-networking & - Windows:用管理员 CMD 执行
net stop mysql57,然后进bin/目录跑mysqld --skip-grant-tables --shared-memory(不用--console也行,但得确保能看到日志) - 启动后立刻用
ps aux | grep mysqld(Linux)或任务管理器(Windows)确认进程里含skip-grant-tables,否则后续全白忙
UPDATE user 表时必须指定 host 和字段名
MySQL 5.7 把密码存在 mysql.user 表的 authentication_string 字段,不是 password 字段——后者在 5.7 已废弃,写错就静默失败。而且 'root'@'localhost' 和 'root'@'127.0.0.1' 是两个独立用户,只写 WHERE User='root' 可能改错账户。
正确操作分三步:进库、改字段、刷缓存。少任何一步,新密码都不生效。
面向 CRM 系统的 MySQL 8 数据库模式设计。当用户需要为客户关系管理(CRM)系统设计、评审、优化或生成数据库模式时,应使用此项技能。
- 新开终端执行
mysql -u root(不加-p,也不输密码) - 进库后立即执行:
USE mysql; - 更新语句必须完整:
UPDATE user SET authentication_string = PASSWORD('MyNewPass123!') WHERE User = 'root' AND Host = 'localhost'; - 紧接着执行:
FLUSH PRIVILEGES;—— 这步漏掉,密码永远不生效
改完密码后最容易忽略的清理动作
很多人改完就去试 mysql -u root -p,发现还是免密登录,问题往往出在残留进程或配置没清干净。MySQL 不会自动退出安全模式,你得手动干预。
- Linux 下杀掉跳过权限的进程:
sudo kill $(pgrep -f "mysqld.*skip-grant-tables"),别只killall mysqld,可能误杀其他实例 - 检查
/etc/my.cnf或C:\ProgramData\MySQL\MySQL Server 5.7\my.ini,删掉手动加的skip-grant-tables行(如果之前是改配置文件启动的) - Windows 下,要关掉那个跑
mysqld --skip-grant-tables的 CMD 窗口(按Ctrl+C),再用net start mysql57正常启服务 - 最后验证:
mysql -u root -p输入新密码;如果仍免密,说明--skip-grant-tables还在生效,回去查进程或配置
密码强度和插件兼容性不能硬来
MySQL 5.7 默认启用 validate_password 插件,设太短或太简单的密码会报错:ERROR 1819 (HY000): Your password does not satisfy the current policy requirements。这不是操作错了,是策略拦住了。
临时绕过方法是先关插件,设完再开,但更稳妥的是直接满足要求——比如用大小写字母+数字+符号,长度 ≥8。
- 查当前策略:
SHOW VARIABLES LIKE 'validate_password%'; - 临时关闭(仅限重置时):
SET GLOBAL validate_password.policy = LOW; - 设完密码后建议恢复:
SET GLOBAL validate_password.policy = MEDIUM; - 注意:不要用
SET PASSWORD语句,5.7.6+ 已不推荐,ALTER USER在 5.7.6 后才支持,老版本只能靠UPDATE user

















