1045错误主因是root用户Host不匹配或认证插件不兼容,需先用skip-grant-tables无密码登录,查mysql.user表确认root@localhost/127.0.0.1/%存在性及plugin字段,再针对性修复并执行FLUSH PRIVILEGES、删配置、重启服务。

1045 错误不是密码输错了就完事——它大概率是 root 用户在 mysql.user 表里没匹配到正确的 Host,或者认证插件不兼容。直接改密码可能无效,得先确认账户是否存在、是否被限制来源。
查清 root 用户到底存不存在、允许从哪连
你得进得去 MySQL 才能查,但 1045 挡着路?先用 mysqld --skip-grant-tables 启动(Linux/macOS)或在 my.ini 的 [mysqld] 下加 skip-grant-tables(Windows),然后无密码登录:mysql -u root。
登录后立刻执行:
USE mysql;SELECT User, Host, authentication_string FROM user WHERE User = 'root';
重点看返回的 Host 字段:如果只有 localhost,但你是用 127.0.0.1 连的,就会失败(二者不等价);如果只有 127.0.0.1,而 Navicat 默认连 localhost,也连不上。
常见修复方式:
- 补一个通配主机:
CREATE USER 'root'@'%' IDENTIFIED BY 'your_new_password'; GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION; - 或更新现有记录:
UPDATE user SET Host = '%' WHERE User = 'root' AND Host = 'localhost';(慎用,生产环境不建议开放%) - 别忘了:
FLUSH PRIVILEGES;
MySQL 8.0+ 必须注意 authentication_string 和 plugin
MySQL 5.7 以前用 password 字段存哈希,8.0+ 改用 authentication_string,且默认认证插件是 caching_sha2_password。老客户端(如旧版 PHP、某些 Navicat 版本)不支持,会报 1045,哪怕密码对。
检查当前插件:
SELECT User, Host, plugin FROM user WHERE User = 'root';
如果 plugin 是 caching_sha2_password,而你又没法升级客户端,就切回兼容模式:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password';FLUSH PRIVILEGES;
注意:必须用 IDENTIFIED WITH 显式指定插件,只改 authentication_string 不生效。
跳过权限验证后改密码,别漏 flush privileges
很多人在 skip-grant-tables 模式下执行了 UPDATE user SET authentication_string = PASSWORD('xxx') ... 就以为完事了,结果重启后还是 1045——因为权限缓存没刷新。
关键动作只有三步,缺一不可:
- 修改完
user表后,必须执行FLUSH PRIVILEGES; - 删掉
my.cnf或my.ini里的skip-grant-tables(或注释掉) - 完整重启 MySQL 服务:
sudo systemctl restart mysql(Linux)或服务管理器重启(Windows)
重启前不删 skip-grant-tables,服务起不来;重启后不 FLUSH,改的密码不会加载进内存。
真正卡住人的地方,往往不是“怎么重置密码”,而是没意识到 'root'@'localhost' 和 'root'@'127.0.0.1' 是两个用户,也没留意 MySQL 8.0 的认证插件已换。改完记得验证:mysql -h 127.0.0.1 -u root -p 和 mysql -h localhost -u root -p 都试一遍。


















