MySQL用户认证插件信息唯一可靠来源是mysql.user表的plugin字段,执行SELECT User, Host, plugin FROM mysql.user可查全部配置;ALTER USER修改后须FLUSH PRIVILEGES生效,default_authentication_plugin仅影响新用户。

查 mysql.user 表就能知道用户配置的认证插件
MySQL 不在运行时动态记录每个连接实际用了哪个插件,但每个用户的认证方式是持久化保存在 mysql.user 表里的 plugin 字段。这是唯一可靠、可直接查询的来源。
执行以下语句查看所有用户及其插件:
SELECT User, Host, plugin FROM mysql.user;
常见值包括:
-
caching_sha2_password:MySQL 8.0+ 默认,SHA-256 + 缓存,安全且高效 -
mysql_native_password:旧版默认,SHA-1 哈希,兼容性好但已不推荐 -
auth_socket:不依赖密码,靠 UNIX socket 文件权限校验,仅限本地@'localhost' -
sha256_password:纯 SHA-256,无缓存,性能略低,现基本被caching_sha2_password取代
注意:SHOW VARIABLES LIKE 'default_authentication_plugin' 只告诉你新用户默认用啥,对已有用户完全没影响。
只查某个特定用户用什么插件
如果你只关心 appuser 这个账号,别扫全表,直接加 WHERE 条件:
SELECT plugin FROM mysql.user WHERE User = 'appuser' AND Host = 'localhost';
务必同时匹配 User 和 Host,因为 MySQL 是按 'user'@'host' 元组匹配账户的。同一个用户名在不同 host 下可以配置不同插件。
如果返回空结果,说明该用户不存在;如果返回多行,说明存在多个同名但 host 不同的账户,得逐个确认。
为什么不能从 performance_schema 或 SHOW PROCESSLIST 查当前连接的插件
很多人会下意识去查 performance_schema.threads 或 SHOW PROCESSLIST,但这两个地方根本**不存认证插件信息**:
-
performance_schema.threads没有authentication_plugin字段——MySQL 官方文档明确说明该字段未暴露 -
SHOW PROCESSLIST只显示User和Host,连CURRENT_USER()都不显示,更别说插件 -
INFORMATION_SCHEMA.PLUGINS只告诉你服务端加载了哪些插件,和谁在用、怎么用完全无关
所以别浪费时间翻这些表。真要确认某次连接“此刻”走的是哪个流程,只能靠反推:先用 SELECT USER(), CURRENT_USER(); 看它匹配到了哪个 'user'@'host',再回头查 mysql.user 表里这个元组的 plugin 值。
容易被忽略的关键点:插件修改后必须 FLUSH PRIVILEGES
改完用户插件(比如用 ALTER USER ... IDENTIFIED WITH ...),变更不会立即生效:
- 必须显式执行
FLUSH PRIVILEGES;,否则新配置还在内存里没刷进权限系统 - 尤其要注意
auth_socket用户:一旦设成这个插件,就**不能再用-p参数连**,否则报错Access denied;验证方式只能是su - username -c "mysql -u username" - 客户端不支持新插件时(如老 PHP 扩展连
caching_sha2_password报Plugin 'caching_sha2_password' cannot be loaded),不是服务端问题,得升级客户端驱动或降级插件
最常踩的坑,就是以为改了 my.cnf 里的 default_authentication_plugin 就万事大吉——它只管新用户,存量用户一个都不会动,mysql.user 表里的 plugin 字段才是真相所在。


















