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。
将 WCAG 2 AA 无障碍标准应用于设计系统、UI 组件和网页——通过可运行的验证器进行对比度计算,采用设计 token 模式使颜色天生可访问,设定排版和焦点状态规则,并提供语义检查清单。适用于构建或审查 UI。
- 执行:
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 来得快。










