SHOW SLAVE HOSTS不能查到当前活跃连接的从库,它仅显示主库内存中注册的从库列表,依赖从库配置report_host且执行过START SLAVE;真实连接状态需查PROCESSLIST中Binlog Dump线程。

SHOW SLAVE HOSTS 能不能查到连接的从库
不能直接查到“当前活跃连接”的从库,SHOW SLAVE HOSTS 只显示主库上配置了 report_host 且从库启动过 CHANGE MASTER TO(并设定了该参数)的从库列表,本质上是读取主库内存中缓存的从库注册信息,不是实时 TCP 连接状态。
为什么 SHOW SLAVE HOSTS 经常返回空或不全
常见原因包括:
-
report_host未在从库的my.cnf或启动参数中显式配置 —— 这是最主要原因,MySQL 默认不自动上报主机名 - 从库没执行过
START SLAVE,或执行过但之后被STOP SLAVE,部分版本会清掉注册信息 - 主库开启了
skip_slave_hosts(极少见,但存在) - 网络防火墙或 SELinux 阻断了从库向主库的反向注册请求(虽不常见,但在某些安全加固环境会出现)
真正能反映“谁正在连我”的方法:查 processlist
主库上运行 SHOW PROCESSLIST,过滤 Command = 'Binlog Dump' 的行,这才是真实、实时的从库连接快照:
SELECT host, user, command, time, state FROM information_schema.PROCESSLIST WHERE command = 'Binlog Dump';
注意:
- 每条
Binlog Dump线程对应一个已建立连接的从库(哪怕 SQL 线程已停) -
host字段是主库看到的从库 IP/主机名,可能受 DNS 解析或skip_name_resolve影响 - 如果从库用的是代理或 NAT 出口,这里显示的是代理 IP,不是真实从库 IP
- 该结果不含从库的复制延迟、IO/SQL 状态等元信息,需搭配
SHOW SLAVE STATUS在从库侧查
想持久化记录从库接入信息?得靠日志+外部工具
MySQL 自身不提供“谁在什么时候连上来”的审计日志开关(general_log 太重,且不区分 dump 连接)。可行路径有:
- 开启
slow_query_log并设置long_query_time = 0,配合解析日志识别Binlog Dump连接(不推荐,性能开销大) - 用
performance_schema表(如replication_connection_configuration)—— 但这只在从库端有,主库没有对应表 - 在主库前置部署 MySQL Proxy 或使用审计插件(如 MariaDB Audit Plugin、Percona Audit Log),捕获握手阶段的用户/IP 信息
- 运维层面统一要求所有从库配置
report_host+report_port,再定期轮询SHOW SLAVE HOSTS做基线比对
真正线上排查时,别依赖 SHOW SLAVE HOSTS 判断连接状态;它更像是一个弱注册表,而 PROCESSLIST 才是真相入口。漏掉的从库,八成是 report_host 没配。


















