error 1045 是 mysql 在连接握手阶段认证失败,核心在于 'user'@'host' 元组是否真实存在、authentication_string 是否匹配、plugin(如 caching_sha2_password)是否兼容,且必须执行 flush privileges 生效。

ERROR 1045 不是密码输错了重试就行,而是 MySQL 在连接握手阶段就拒绝了认证——它甚至没查权限表,更不涉及应用层逻辑。核心问题永远落在 user、host、authentication_string、plugin 这四个字段的匹配上。
确认你连的是哪个 'user'@'host' 元组
错误信息末尾的 'root'@'localhost' 或 'admin'@'127.0.0.1' 是 MySQL 实际比对的完整身份标识,不能只看用户名或只改密码。常见误判:
-
localhost和127.0.0.1在 MySQL 中完全不等价:前者强制走 Unix socket,只匹配user@'localhost';后者走 TCP,需匹配user@'127.0.0.1'或user@'%' -
%通配符不匹配localhost(这是设计行为,不是 bug);如果只建了'user'@'%',又用mysql -u user -p直连,必须额外加一条'user'@'localhost' - 执行
SELECT User, Host FROM mysql.user WHERE User = 'root';,看结果里有没有对应行;空结果 = 账号根本不存在,改密码毫无意义
MySQL 8.0+ 改密必须用 ALTER USER,且指定 plugin
直接 UPDATE mysql.user SET authentication_string = PASSWORD('xxx') 在 8.0+ 会报 ERROR 1372,因为 PASSWORD() 函数已废弃,且字段校验更严格。
- 先查当前插件:
SELECT user, host, plugin FROM mysql.user WHERE user = 'root'; - 若插件是
caching_sha2_password(8.0 默认),改密必须写全:ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'newpass'; - 若要兼容老客户端(如旧版 Navicat、PHP mysqlnd),切回:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'newpass'; - 改完必须立刻执行:
FLUSH PRIVILEGES;——否则变更仅写磁盘,不生效
mysqldump 报 1045 但 mysql -u -p 能登?检查 using password: NO
错误末尾的 (using password: NO) 是强提示:命令里根本没传密码参数。
- 比如:
mysqldump -u root database_name > backup.sql缺少-p,就会触发该提示 - 某些脚本或 CI 环境中,密码变量为空或未
export,也会导致实际传入空密码 -
mysqldump默认走 socket 连接(即'user'@'localhost'),但若配置了--protocol=tcp,就变成走 TCP,此时需确保有'user'@'127.0.0.1'或'user'@'%'的账号
最容易被忽略的点:MySQL 用户匹配是「最精确 host 匹配优先」,不是按字母顺序或插入顺序。哪怕你只建了一条 'root'@'%',只要 mysqld 启用了 skip-name-resolve,localhost 可能被解析成 127.0.0.1,从而跳过 'root'@'localhost' 去匹配另一条规则——而那条规则可能 plugin 不兼容,或 authentication_string 为空。验证前先关掉这个配置,或用 --protocol=tcp 强制路径。











