MySQL 8.0+重置密码必须先执行FLUSH PRIVILEGES;才能使用ALTER USER修改authentication_string字段,因skip-grant-tables会禁用密码修改语句;5.7需注意host匹配和认证插件;Windows用--init-file易因编码、路径、换行等问题失败。

能重置,但必须立刻断网、禁用远程连接、全程在本地终端操作——否则跳过权限表等于把数据库裸奔在公网。
为什么不能直接改 my.cnf 加 skip-grant-tables 就重启?
因为新版 MySQL(5.7.6+ 和 8.0+)启动时若检测到 skip-grant-tables,会自动禁用 ALTER USER、SET PASSWORD 等语句,直接执行会报错:ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement。
这意味着你进去了也改不了密码,卡在登录后第一步。
- 必须先执行
FLUSH PRIVILEGES;才能解锁账户管理功能 - MySQL 8.0+ 的密码字段是
authentication_string,不是Password或password -
PASSWORD()函数在 8.0.11+ 已被移除,硬写会报错ERROR 1305 (42000): FUNCTION mysql.PASSWORD does not exist
MySQL 8.0+ 正确重置流程(以 Linux 为例)
整个过程需 root 权限,且确保无其他用户正在访问数据库。
- 停止服务:
sudo systemctl stop mysqld - 临时绕过权限启动:
sudo mysqld_safe --skip-grant-tables --skip-networking &(--skip-networking关键,禁 TCP 连接) - 免密登录:
mysql -u root(不加-p,也不输密码) - 立即加载权限表:
FLUSH PRIVILEGES; - 修改密码(8.0+ 必须用此格式):
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'YourNewPass123!'; - 退出:
EXIT; - 杀掉 mysqld_safe 进程(别直接
systemctl start,它还在后台跑):sudo killall mysqld_safe && sudo killall mysqld - 正常启动:
sudo systemctl start mysqld
MySQL 5.7 的兼容写法要注意什么?
5.7 支持 PASSWORD(),但字段名和 host 匹配更敏感。常见失败点:
- 只改了
'root'@'localhost',但你是用127.0.0.1连的 → 实际对应的是'root'@'127.0.0.1',得两条都改 - 执行
UPDATE mysql.user SET Password=PASSWORD('xxx') WHERE User='root';后忘了FLUSH PRIVILEGES;→ 密码不会生效 - 没确认默认认证插件:
SELECT plugin FROM mysql.user WHERE User='root';,如果是caching_sha2_password,强行设mysql_native_password更稳妥
推荐统一用:ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'xxx';,兼容性更好。
Windows 下用 --init-file 方案的坑
这个方法看似“不用动配置”,但实际更容易出错:
- 文件路径含空格或中文 → 启动失败,日志里只报
Failed to open init file,不提示具体原因 - init 文件末尾没换行 → MySQL 解析最后一行失败,静默跳过密码设置
- 忘记删 init 文件 → 下次重启还会再执行一遍,可能覆盖掉你刚设的新密码
- 文件编码不是 UTF-8 无 BOM → Windows 记事本默认保存为 ANSI,MySQL 读取时乱码,
ALTER USER语法错误
真要用,就用 notepad++ 存为 UTF-8(无 BOM),路径全用英文,写完立刻删。
最常被忽略的一点:重置完密码,别急着开远程访问。先确认 bind-address 是 127.0.0.1 或注释掉,再检查防火墙是否放行了 3306。裸奔一次,比忘密码危险十倍。











