1045报错本质是认证失败,即mysql明确拒绝user@host+密码组合;主因是root@localhost记录缺失、caching_sha2_password插件不兼容或shell解析密码特殊字符(如@、#),需通过select查询确认记录存在、alter user切换插件并flush privileges生效。

1045 报错不是“连不上”,而是 MySQL 明确拒绝了你提供的 user@host + 密码组合。90% 的情况和密码输错无关,真正卡住你的往往是 root@localhost 记录缺失、caching_sha2_password 插件不兼容,或者 shell 把密码里的 @、# 提前吃了。
查清楚到底有没有 root@localhost 这条记录
MySQL 认证是按 user + host 组合精确匹配的。root@localhost 和 root@127.0.0.1 是两条完全独立的记录,不能互相替代。
- 如果你还能用其他账号登录(比如有 sudo 权限的系统用户),执行:
SELECT host, user, authentication_string, plugin FROM mysql.user WHERE user = 'root'; - 结果里必须有一行
host = 'localhost',否则mysql -u root -p必然报 1045 - 如果只有
root@'127.0.0.1'或root@'%',说明root@localhost被删了或压根没创建过 - 补一条:先
CREATE USER 'root'@'localhost' IDENTIFIED BY 'your_new_pass';,再GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION;,最后FLUSH PRIVILEGES;
caching_sha2_password 插件导致老客户端静默失败
MySQL 8.0+ 默认用 caching_sha2_password,但 Navicat 旧版、PHP mysqli、某些 Python 驱动不支持它——不会提示插件不兼容,只会报 1045。
MySQL 9.6.0是面向Linux平台的2026年创新版本,核心架构迎来重大革新。其将外键约束与级联操作从InnoDB引擎层上移至SQL层,确保所有数据变更均被完整记录至Binlog,彻底解决了CDC(变更数据捕获)与主从复制中的数据不一致难题。此外,该版本引入container_aware启动选项以原生适配容器环境,并对审计日志进行了组件化重构,为追求极致数据一致性与云原生体验的开发者提供了全新选择。
- 执行:
SELECT user, host, plugin FROM mysql.user WHERE user = 'root';,看plugin字段是不是caching_sha2_password - 如果是,且你用的是老工具,临时切回兼容模式:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password'; - 别忘了跟一句:
FLUSH PRIVILEGES; - 注意:云数据库(如阿里云 RDS)通常禁用该操作,此时应升级客户端,而不是硬改服务端
密码含特殊字符时命令行传参被 shell 解析
Linux/macOS 下,mysqldump -uroot -p'Pass@2024#' 中的 @ 和 # 会被 shell 提前解释,实际传给 MySQL 的密码已损坏。
-
mysql -u root -p交互式输入不受影响;但脚本、定时任务、mysqldump等自动调用场景必踩此坑 - 验证方式:在命令中显式转义,例如:
mysqldump -uroot -p'Pass\@2024\#' - 更稳妥做法:把密码写进
~/.my.cnf,内容为:[client]\npassword=Pass@2024#
,然后 chmod 600 ~/.my.cnf - Windows CMD 下虽不解析
@,但%会被当作环境变量展开,同样需转义或换配置文件
最常被忽略的一点:用 mysql -u root -h localhost -p 登录失败,但 mysql -u root -h 127.0.0.1 -p 成功,大概率是因为 localhost 强制走 socket 连接,而 mysql.user 表里没有对应 host='localhost' 的记录——这时候查 socket 文件路径、确认 skip-name-resolve 是否开启,反而不如直接补一条 root@localhost 来得快。










