MySQL 5.7 忘记 root 密码时,必须停服务后以 --skip-grant-tables 启动,更新 authentication_string 字段并执行 FLUSH PRIVILEGES;能正常登录则应使用 ALTER USER 语句重置密码,该方式自动处理哈希、插件适配与权限刷新。

能正常登录就用 ALTER USER,不能登录就停服务 + --skip-grant-tables 改 authentication_string 字段——别碰 password 字段,它在 5.7 里已失效。
能登录时:用 ALTER USER 安全修改
只要还能用原密码进 MySQL,这是唯一推荐的方式。它自动处理哈希、过期状态和权限刷新,不会漏掉关键步骤。
-
ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass123';—— 必须写全'root'@'localhost','root'@'%'是另一个账户 - 执行后不用手动
FLUSH PRIVILEGES;,ALTER USER内部已生效 - 如果提示
ERROR 1819 (HY000),说明启用了密码策略插件,新密码需含大小写字母、数字、特殊字符且长度 ≥8 - 改完立刻用
mysql -u root -p验证,别只信命令没报错
忘密码时:必须停服务 + --skip-grant-tables 启动
不关服务、不跳过权限表,就根本进不去数据库,所有“在线重置”说法都是错的。
面向 CRM 系统的 MySQL 8 数据库模式设计。当用户需要为客户关系管理(CRM)系统设计、评审、优化或生成数据库模式时,应使用此项技能。
- 先停服务:
sudo systemctl stop mysqld(CentOS/RHEL)或sudo service mysql stop(Ubuntu/Debian) - 启动跳过验证:
sudo mysqld --skip-grant-tables --skip-networking &——--skip-networking很关键,防远程未授权访问 - 无密码登录:
mysql -u root(不加-p,也不输任何东西) - 进库后立刻执行:
USE mysql;→UPDATE user SET authentication_string = PASSWORD('MyNewPass123') WHERE user = 'root' AND host = 'localhost'; - 必须跟
FLUSH PRIVILEGES;,否则新密码永远不加载到内存
容易踩的坑:字段名、host、残留配置全得对上
错一个细节,就会出现“明明改了却还是免密登录”或“输新密码仍被拒绝”。
-
password字段在 MySQL 5.7 中已废弃,写它会静默失败或报错;只认authentication_string -
WHERE user = 'root'不够,必须加AND host = 'localhost'—— 因为'root'@'127.0.0.1'和'root'@'localhost'是两个独立账户 - 改完别急着试登录:先杀掉跳过权限的进程(
sudo kill $(pgrep -f "mysqld.*skip-grant-tables")),再删掉/etc/my.cnf里可能误加的skip-grant-tables=1行,最后systemctl start mysqld - Windows 用户注意服务名可能是
mysql57或MySQL80,查清楚再net stop
验证和收尾:别跳过最后两步
很多人卡在“改完登不进去”,其实问题不在改密码本身,而在后续清理没做干净。
- 验证方式只有一种:
mysql -u root -p,然后输入新密码 —— 如果直接进了没提示输密码,说明--skip-grant-tables还在生效 - 检查是否还有残留进程:
ps aux | grep mysqld,确认只有正常服务进程,没有带skip-grant-tables的 - 如果之前用
mysqld_safe启动,新版系统(如 CentOS 8+/Ubuntu 22.04)可能已弃用,直接用mysqld更稳 - 初始安装生成的随机密码在
/var/log/mysqld.log里,搜temporary password能找到,首次登录后必须用ALTER USER强制改掉










