plugin字段为空或NULL导致MySQL报错1045,因用户记录被忽略;须用--skip-grant-tables登录后执行ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'pwd'并FLUSH PRIVILEGES。

plugin字段为空或为NULL导致1045错误
MySQL启动时若发现mysql.user表中某行的plugin字段为NULL或空字符串(''),会直接忽略该用户记录,哪怕密码正确也进不去,日志里常带警告:User entry 'root'@'localhost' has an empty plugin value. The user will be ignored。
必须先绕过权限验证登录(如用sudo mysqld --skip-grant-tables或sudo mysql -S /var/run/mysqld/mysqld.sock),再执行:
-
SELECT host, user, plugin, authentication_string FROM mysql.user WHERE user = 'root';—— 确认plugin列值 - 若为
NULL或'',用ALTER USER修复:ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_new_password'; - 切勿直接
UPDATE mysql.user SET plugin = ...,尤其在MySQL 8.0+中字段逻辑已变,ALTER USER才是安全路径 - 执行完立刻
FLUSH PRIVILEGES;,否则不生效
caching_sha2_password不兼容老客户端
MySQL 8.0+默认用caching_sha2_password插件,但旧版Navicat(12以下)、PHP mysqli(未启用mysqlnd)、PyMySQL(ERROR 1045 (using password: YES)——不是密码错,是认证链根本没跑通。
查当前插件:SELECT user, host, plugin FROM mysql.user WHERE user = 'root';
- 若
plugin是caching_sha2_password,且你无法升级客户端,就切回兼容模式:ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password'; - 改完必须
FLUSH PRIVILEGES; - PHP连接可加DSN参数绕过:
mysql:host=localhost;dbname=test;auth_plugin=mysql_native_password - 注意:
mysql_native_password插件文件需存在,查路径:SHOW VARIABLES LIKE 'plugin_dir';,确认mysql_native_password.so在对应目录下
auth_socket插件导致“不校验密码”误判
Ubuntu系MySQL常默认给'root'@'localhost'配auth_socket插件,它不看authentication_string,而是比对系统用户UID。此时mysql -u root -p必然失败,因为密码被完全忽略。
验证方式:mysql -h 127.0.0.1 -u root -p能进,但mysql -u root -p报1045,基本就是它。
- 临时验证:加
--protocol=tcp强制走TCP:mysql -h localhost -u root -p --protocol=tcp - 永久修复:用有权限账户登录后,执行
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password'; - 别用
sudo mysql进去后直接UPDATE,容易写错字段;ALTER USER语句自动处理底层字段映射
Host匹配失败引发plugin误触发
MySQL把'root'@'localhost'和'root'@'127.0.0.1'当两个独立用户,socket连接强制要求host = 'localhost',TCP连接则要求host = '127.0.0.1'或'%'。如果你只建了'root'@'127.0.0.1',又用mysql -u root -p(默认socket),那plugin字段再正常也白搭。
- 查真实存在的记录:
SELECT User, Host FROM mysql.user WHERE User = 'root'; - 若缺
'root'@'localhost',补一条:CREATE USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password'; - 别UPDATE Host字段——破坏权限结构风险高;用
CREATE USER+GRANT更稳 - Docker或一键脚本安装的MySQL 8.0+,常默认不建
'root'@'localhost',这点极易被忽略
真正卡住人的从来不是插件名记不住,而是四元组(user+host+plugin+authentication_string)里任意一环断掉,MySQL都直接返回1045,连密码校验都不走。查的时候必须四字段一起看,不能只盯着password或plugin单点突破。


















