直接改mysql.user表无效,因MySQL缓存权限且绕过校验逻辑,必须用ALTER USER等标准语句并执行FLUSH PRIVILEGES;MySQL 8.0+废弃PASSWORD()函数,默认插件为caching_sha2_password,host不匹配或插件不兼容也会导致1045错误。

直接改mysql.user表后不FLUSH PRIVILEGES没用
改完user表里的密码或host字段,MySQL不会自动生效——它缓存着权限数据。必须显式执行FLUSH PRIVILEGES,否则所有变更都只是写进了磁盘,对新连接完全无效。这个步骤漏掉是1045反复出现的最常见原因。
UPDATE user SET authentication_string = PASSWORD('xxx')在MySQL 8.0+会报错
MySQL 8.0起废弃了PASSWORD()函数,且默认认证插件变为caching_sha2_password。直接用旧语法会触发ERROR 1372 (HY000)。正确做法是:
- 查当前插件:
SELECT user, host, plugin FROM mysql.user WHERE user = 'root'; - 若插件是
caching_sha2_password,改密必须用:ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'newpass'; - 如需兼容老客户端(比如旧版Navicat),可切回
mysql_native_password:ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'newpass';
host字段值不匹配也会导致1045,哪怕密码全对
MySQL把'root'@'localhost'和'root'@'127.0.0.1'视为两个完全不同的用户。如果你用mysql -u root -h 127.0.0.1 -p连,但user表里只有host = 'localhost'这一行,照样报1045。排查时务必运行:
SELECT user, host FROM mysql.user WHERE user = 'root';
常见修复方式:
- 补全缺失的host记录:
CREATE USER 'root'@'127.0.0.1' IDENTIFIED BY 'same_pass'; - 或合并成通配:
UPDATE mysql.user SET host = '%' WHERE user = 'root' AND host = 'localhost';(仅限测试环境)
修改user表前必须停掉权限校验,否则连不上库
你没法用错误密码登录后再去改自己的密码。必须先让MySQL跳过验证——不是靠删配置、也不是靠服务重启,而是两种可靠路径:
- Linux/macOS:
sudo mysqld_safe --skip-grant-tables &,然后mysql -u root(不加-p) - Windows:编辑
my.ini,在[mysqld]下加skip-grant-tables,保存后net stop mysql && net start mysql
注意:启用skip-grant-tables期间,任何本地用户都能无密码访问所有库,改完密码后必须立刻删掉该配置并重启服务。
真正容易被忽略的是host粒度和plugin兼容性——它们不像密码那样直观,但只要其中一个不对,FLUSH PRIVILEGES也救不回来。


















