1045错误本质是认证失败,核心在于'user'@'host'组合与authentication_string、plugin三者不匹配;需先用socket直连查mysql.user表确认实际用户记录、密码状态及认证插件,再针对性修复。

1045 错误不是连不上 MySQL,而是连上了但被拒了——问题一定出在 user、host、authentication_string 三者之一,或它们的组合不匹配。
查清楚你到底在连哪个 'user'@'host'
MySQL 把 'root'@'localhost' 和 'root'@'127.0.0.1' 当作两个完全独立的用户。你用 mysql -u root -p 默认走 Unix socket,匹配的是 'root'@'localhost';而用 mysql -h 127.0.0.1 -u root -p 走 TCP,匹配的是 'root'@'127.0.0.1' 或 'root'@'%'。
所以第一步永远是登录进去看真实记录:
sudo mysql -S /var/run/mysqld/mysqld.sock -e "SELECT User, Host, plugin, authentication_string IS NOT NULL AS has_pw FROM mysql.user;"
- 如果返回空行或没看到
'root'@'localhost',说明这个用户根本不存在 - 如果
has_pw是 0,说明密码字段为空(常见于初始化未设密或重置失败) - 如果
plugin是caching_sha2_password,而你用的是老版 PHP/Navicat,大概率不兼容
本地 socket 登录失败时,别急着改密码
很多情况下你根本进不去 MySQL,但又不是服务挂了——这时优先试试 socket 直连,绕过网络层和权限表加载逻辑:
sudo mysql -S /var/run/mysqld/mysqld.sock
- 成功进入:说明服务正常,只是认证环节卡住,直接查
mysql.user - 报
Can't connect to local MySQL server:那才是服务没启,先systemctl status mysql - 报
Access denied for user ''@'localhost'(空用户名):说明 socket 认证插件异常,可能是auth_socket插件启用且未配对应系统用户
若确实是 auth_socket 导致(如 Ubuntu 默认配置),可临时切回密码验证:
UPDATE mysql.user SET plugin = 'mysql_native_password', authentication_string = PASSWORD('newpass') WHERE User = 'root' AND Host = 'localhost'; FLUSH PRIVILEGES;
skip-grant-tables 启动后仍 UPDATE 失败?字段名早变了
MySQL 5.7+ 彻底移除了 password 字段,改用 authentication_string。如果你在 skip-grant-tables 模式下执行:
UPDATE user SET password = PASSWORD('xxx') WHERE User = 'root';
会直接报错 ERROR 1054 (42S22): Unknown column 'password' in 'field list'。
面向 CRM 系统的 MySQL 8 数据库模式设计。当用户需要为客户关系管理(CRM)系统设计、评审、优化或生成数据库模式时,应使用此项技能。
正确写法(注意大小写和字段名):
USE mysql;
UPDATE user SET authentication_string = PASSWORD('newpass') WHERE User = 'root' AND Host = 'localhost';
FLUSH PRIVILEGES;
- 必须带
WHERE Host = 'localhost',否则可能改错用户(比如只改了'root'@'%'却没动'root'@'localhost') -
PASSWORD()函数在 8.0.30+ 已废弃,若版本更新,改用SHA2('newpass', 256)或直接ALTER USER - 执行完
FLUSH PRIVILEGES后务必删掉 my.cnf 里的skip-grant-tables,再重启 mysqld,否则权限系统始终失效
PHP 或 Navicat 连不上,先看 plugin 是否兼容
MySQL 8.0 默认用 caching_sha2_password,但很多旧客户端(尤其是 PHP 7.2 以下、Navicat 12 以前)只认 mysql_native_password。错误现象是:命令行能登,PHP 报 1045,且 using password: YES。
确认方式:
SELECT User, Host, plugin FROM mysql.user WHERE User = 'root';
修复方法(以 'root'@'localhost' 为例):
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_actual_password'; FLUSH PRIVILEGES;
- 不要用
UPDATE直改plugin字段,ALTER USER 会同步处理哈希值 - 如果应用连接用的是
127.0.0.1,记得也对'root'@'127.0.0.1'执行同样操作 - 某些 Docker 镜像或一键包会默认禁用
mysql_native_password插件,需在 my.cnf 加default_authentication_plugin=mysql_native_password
最易被忽略的一点:改完 plugin 后,必须用新密码重新连接一次,否则客户端缓存的旧握手方式仍会失败——不是配置没生效,是客户端没重协商。










