首页 > 数据库 >MySQL登录报错1045 Access denied解决方法

MySQL登录报错1045 Access denied解决方法

来源:互联网 2026-07-22 08:37:08

MySQL登录ERROR1045本质是mysql.user表缺失'root'@'localhost'记录,而非密码错误。也可能因旧客户端不支持caching_sha2_password插件。注意localhost走Unixsocket,与127.0.0.1不同,缺失记录导致socket登录失败。mysqldump报错但mysql命令正常时,需检查密码中特殊字

如何解决MySQL登录时报1045 Access denied错误?

很多人以为ERROR 1045就是密码输错了,但其实本质是MySQL在系统表里没有找到匹配的记录,或者插件不兼容。先说个很多人容易搞混的点——这个错误的核心,是mysql.user表中缺失了'root'@'localhost'这条记录,而不是密码本身的问题。

MySQL登录报错1045 Access denied解决方法

长期稳定更新的攒劲资源: >>>点此立即查看<<<

先别急着改密码,试试这个诊断方法:如果你还能用其他账号(比如有sudo权限的系统用户)进MySQL,立刻执行查询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'@'%'——但socket连接强制要求host='localhost',这就踩空掉了。

用上面的查询结果判断:如果结果为空,或者只有host'%''127.0.0.1',那'root'@'localhost'就不存在。socket连接(比如直接用mysql -u root -p或加-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,而不是明确提示插件不兼容——所以很多人一头雾水地试密码。

执行查询SELECT host, user, plugin FROM mysql.user WHERE user = 'root',看你当前root用户用的是哪个插件。如果plugin显示caching_sha2_password,而你用的是旧工具,必须改回mysql_native_password

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password';

改完记得执行FLUSH PRIVILEGES;。这里有个细节很多人会踩坑:改之前确认你改的是'root'@'localhost'而不是'root'@'127.0.0.1'——前者没动,问题照旧。

区分 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)避免密码暴露在命令行

不过要注意:配置文件里写了明文密码后,权限不能设成755——权限不对照样触发1045,这个坑也不少见。

侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述

热游推荐

更多
湘ICP备2026025700号-3 湘公网安备 43070302000280号
All Rights Reserved
本站为非盈利网站,不接受任何广告。本站所有软件,都由网友
上传,如有侵犯你的版权,请发邮件给xiayx666@163.com
抵制不良色情、反动、暴力游戏。注意自我保护,谨防受骗上当。
适度游戏益脑,沉迷游戏伤身。合理安排时间,享受健康生活。