能,SHOW PROCESSLIST 的 Host 列显示的是客户端真实连接的 IP 和端口(如 192.168.1.105:3456),而非授权表中的通配符模式;需 PROCESS 权限,且仅反映当前活跃连接。

SHOW PROCESSLIST 能看到用户来源 IP 吗?
能,但只显示当前活跃连接的客户端 IP,不显示授权时定义的 Host 值。比如某用户被授权为 'user'@'192.168.1.%',但实际连接时用的是 192.168.1.105,SHOW PROCESSLIST 里显示的就是 192.168.1.105,不是通配符模式。
执行命令:
SHOW PROCESSLIST;
重点关注 Host 列(格式通常是 xxx.xxx.xxx.xxx:port),它就是 TCP 连接的真实来源 IP 和端口。
- 需要
PROCESS权限才能执行,普通用户可能被拒绝 - 只反映“此刻在线”的连接,断开后立刻消失
- 如果用了代理(如 HAProxy、MySQL Router),
Host显示的是代理 IP,不是原始客户端
如何查某个用户在 mysql.user 表中被授权的源 IP 模式?
mysql.user 表里的 Host 字段存的是授权时指定的允许来源(支持 %、192.168.1.%、localhost 等),不是实时连接地址。要查某用户的所有授权记录,得直接查表:
SELECT User, Host, authentication_string FROM mysql.user WHERE User = 'your_username';
注意:
面向 CRM 系统的 MySQL 8 数据库模式设计。当用户需要为客户关系管理(CRM)系统设计、评审、优化或生成数据库模式时,应使用此项技能。
- 必须用
root或有SELECT权限的账号登录才能查mysql.user -
Host是授权维度的关键字段,'user'@'%'和'user'@'127.0.0.1'是两个完全独立的账户 - MySQL 8.0+ 默认使用
caching_sha2_password插件,authentication_string是加密后的值,不可逆,别指望从中还原密码
怎么把 SHOW PROCESSLIST 的在线 IP 和 mysql.user 的授权 Host 对上?
没有内置视图能自动关联这两者——因为它们属于不同维度:一个是运行时连接快照,一个是静态权限配置。人工比对是常见做法,可借助简单 JOIN 查询辅助判断:
SELECT p.USER, p.HOST AS connected_from, u.HOST AS authorized_from FROM information_schema.PROCESSLIST p JOIN mysql.user u ON p.USER = u.User WHERE p.USER != 'system user';
这个查询有明显局限:
- 一个用户可能有多个
Host授权记录(比如同时有'app'@'10.0.1.%'和'app'@'127.0.0.1'),结果会重复出现 - 无法判断当前连接是否匹配某条授权(例如用户从
10.0.2.5连入,但只授权了10.0.1.%,这条连接其实不该成功——但 MySQL 已放行,说明授权已生效或存在更宽泛的规则) -
information_schema.PROCESSLIST中的HOST不带端口,而真实连接字符串含端口;mysql.user.Host不解析通配符,需人工估算匹配逻辑
为什么有时候 SHOW PROCESSLIST 显示 localhost 却连不上?
这是 Unix socket 和 TCP/IP 混淆导致的典型误解。当 Host 列显示 localhost,MySQL 实际走的是本地 socket 文件(如 /var/run/mysqld/mysqld.sock),而非 TCP 的 127.0.0.1。而 'user'@'localhost' 和 'user'@'127.0.0.1' 在权限系统中是两条独立记录。
- 用
mysql -u user -h localhost仍走 socket(除非加--protocol=tcp) - 用
mysql -u user -h 127.0.0.1才走 TCP,此时必须有对应'user'@'127.0.0.1'授权 -
SHOW PROCESSLIST里看到localhost,不代表你授权了127.0.0.1,反之亦然
真正容易被忽略的是:socket 连接绕过网络层,Host 字段写死为 localhost,和实际 IP 无关;排查权限问题时,先确认连接方式再查对应 Host 记录。










