最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
如何解决MySQL登录时报1045 Access denied错误
时间:2026-07-13 09:37:46 编辑:袖梨 来源:一聚教程网
ERROR 1045本质是'mysql.user'表中缺失'root'@'localhost'记录或plugin不兼容,需执行SELECT host,user,authentication_string,plugin FROM mysql.user WHERE user='root'确认存在性及插件类型。
确认 root@localhost 记录是否真实存在
ERROR 1045 的本质不是“密码错了”,而是 MySQL 在 mysql.user 表里根本没找到匹配的 'root'@'localhost' 这条记录。很多安装方式(尤其是 Docker 镜像、一键脚本、MySQL 8.0+ 默认安装)压根不创建它,只留 'root'@'127.0.0.1' 或 'root'@'%'。
如果你还能用其他账号(比如有 sudo 权限的系统用户)进 MySQL,立刻执行:
SELECT host, user, authentication_string, plugin FROM mysql.user WHERE user = 'root';
若结果为空,或只有 host 是 '%' 或 '127.0.0.1',那 'root'@'localhost' 就不存在——socket 连接(即不加 -h 或用 -h localhost)会直接失败。
- 用
mysql -u root -p登录失败,但mysql -u root -h 127.0.0.1 -p成功 → 典型缺失localhost记录 - 用
mysql -u root -h localhost -p --protocol=tcp能进 → 说明 socket 连接强制走host='localhost'匹配,而该行缺失
检查 plugin 是否导致静默认证失败
MySQL 8.0+ 默认用 caching_sha2_password 插件,但老客户端(如旧版 Navicat、PHP mysqli、某些 Python 驱动)不支持它,就会报 1045 而不是明确提示插件不兼容。
查当前 root 用户用的插件:
SELECT host, user, plugin FROM mysql.user WHERE user = 'root';
如果 plugin 是 caching_sha2_password,且你用的是旧工具,必须改回 mysql_native_password:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password';
- 改完必须执行
FLUSH PRIVILEGES; - 注意:不是所有客户端都支持动态切换插件;有些(如 Windows 上的老版 ODBC)必须改服务端配置才能生效
- 如果只改了
'root'@'127.0.0.1'却忘了'root'@'localhost',问题依旧
区分 localhost 和 127.0.0.1 的实际匹配行为
localhost 在 MySQL 里不等于 127.0.0.1:前者走 Unix socket(Linux/macOS)或 named pipe(Windows),后者走 TCP/IP。两者在 mysql.user 表中是完全独立的记录。
执行这条命令看排序优先级:
SELECT host, user FROM mysql.user ORDER BY host DESC, user;
你会发现 '%' 排最前,'localhost' 排最后——但这只是字符串排序,不影响匹配逻辑。MySQL 实际按「最精确匹配」选行:'localhost' 比 '%' 精确,所以只要存在 'root'@'localhost',它就一定被优先选中。
- 删掉
'root'@'localhost'后,即使'root'@'%'存在,mysql -u root -p仍会报 1045(因为 socket 强制要求 host=‘localhost’) -
skip-name-resolve开启时,localhost可能被解析成127.0.0.1,导致意外匹配到另一条记录
mysqldump 报 1045 但 mysql 命令能登录?检查密码里的特殊字符
这是 MySQL 8.0+ 生产环境高频坑:密码含 @、%、# 等 Shell 特殊符号,mysqldump -u root -pYour@Pass%Word 会被 Shell 提前解析,传给 mysqldump 的实际密码已损坏。
验证方法:
- 交互式
mysql -u root -p输入相同密码能进 → 密码本身正确 -
mysqldump报错信息里显示(using password: YES)但失败 → 很可能被 Shell 截断或替换
解决方式只有两个:
- 把密码用单引号包住:
mysqldump -u root -p'Your@Pass%Word' database_name - 或改用配置文件方式(
~/.my.cnf),避免密码暴露在命令行
别在配置文件里写明文密码后还 chmod 755——权限不对也会触发 1045。
相关文章
- 王者荣耀世界零氪玩家如何生存 07-28
- 快手极速版怎么绑定手机号 07-28
- 明日方舟和轻松小熊联动活动内容一览 07-28
- 逆战未来黎明之光 逆战未来黎明之光玩法机制与新手入门指南 07-28
- 植物大战僵尸融合版毁灭土豆地雷介绍 07-28
- 逆战未来飓风之龙 逆战未来飓风之龙武器获取方法详解 07-28