报 error 1045 (28000):90%是密码不匹配,10%为身份验证插件不兼容或shell特殊字符截断;重置密码须跳过权限检查并严格按mysql 8.0+语法执行alter user,且必须恢复skip-grant-tables配置。

直接说结论:报 ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES),**90% 是密码不匹配,不是服务没起、不是端口错、也不是用户名输错了**。剩下 10% 是身份验证插件不兼容或密码含 Shell 特殊字符被截断——这两类问题在 MySQL 8.0+ 和命令行批量操作时高频出现。
确认是不是真密码错了
别急着重置,先快速验证:
- 用
mysql -u root -p登录,输入你认为正确的密码;如果提示using password: NO,说明你根本没传密码(比如代码里漏了password字段,或命令行忘了-p) - 如果提示
using password: YES但失败,再试一次——注意大小写、空格、中文标点(比如把英文单引号 `’` 错粘成中文 `‘`) - 如果确定密码可能含
@、%、#、$等符号,**立刻换方式验证**:交互式登录(-p回车后手动输)能过,但mysqldump -u root -p'QinxiXiRoot@2022%'失败,基本就是 Shell 解析导致密码被截断
重置密码必须跳过权限检查
MySQL 启动时不会读取用户密码表,除非你强制它跳过——不能靠改 my.ini 末尾加 skip-grant-tables 就完事,位置和重启逻辑很关键:
使用tbot机器ID身份文件配合tsh CLI,通过Teleport访问控制SSH登录托管主机或执行远程命令。
- Windows:编辑
my.ini,在[mysqld]段落下**紧贴下方**加一行skip-grant-tables,保存后必须执行net stop mysql && net start mysql(仅重启服务不够,要确保配置重载) - Linux/macOS:用
sudo mysqld_safe --skip-grant-tables &启动,**不要用systemctl start mysql**,否则跳过无效 - 启动成功后,新开终端运行
mysql -u root(不带-p),能进就说明跳过生效;进不去?检查 MySQL 进程是否真由你刚启的命令启动(ps aux | grep mysqld)
MySQL 8.0+ 必须用 ALTER USER,别碰 password 字段
MySQL 5.7 以前可用 UPDATE user SET authentication_string = PASSWORD('xxx') ...,**8.0+ 的 password 字段已删除,硬写会报错**:
- 进 MySQL 后先切库:
USE mysql; - 刷新权限(必须!否则 ALTER 不生效):
FLUSH PRIVILEGES; - 重置密码(host 要严格匹配):
ALTER USER 'root'@'localhost' IDENTIFIED BY '你的新密码'; - 如果报 “Your password does not satisfy the current policy requirements”,说明密码强度不够,临时关策略:
SET GLOBAL validate_password.policy = LOW;
重置后连不上?检查 authentication_string 和插件
重置完密码不代表万事大吉,MySQL 8.0 默认用 caching_sha2_password 插件,但老客户端(如某些 PHP 扩展、旧版 Navicat)只认 mysql_native_password:
- 查当前插件:
SELECT user, host, plugin FROM mysql.user WHERE user = 'root'; - 如果
plugin是caching_sha2_password且客户端报错,强制切回:ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的新密码'; - 改完仍需
FLUSH PRIVILEGES;,且客户端连接时最好显式指定--default-auth=mysql_native_password
真正容易被忽略的是:重置完必须删掉 my.ini 里的 skip-grant-tables 并重启服务,否则数据库等于裸奔——任何用户都能无密码登录。另外,如果用脚本自动备份,密码含特殊字符时,宁可用配置文件(~/.my.cnf)存凭据,也别拼在命令行里。










