MySQL PS_THREAD_ID 怎样把连接编号转换为监控线程编号
来源:17golang原创
时间:2026-10-30 15:20:09 159浏览 收藏
MySQL 的 PS_THREAD_ID(connection_id) 可以把连接编号映射成 Performance Schema 的线程编号。参数应取自 SHOW PROCESSLIST 的 Id 或 threads 表的 PROCESSLIST_ID;返回值才用于关联监控表里的 THREAD_ID。两种编号不能直接互换。
官方地址:https://dev.mysql.com/doc/refman/8.4/en/performance-schema-functions.html
以下以 MySQL 8.4 文档为依据。遇到“有连接号却查不到线程事件”的排查任务,我会先确认编号来源和实例,再看采集条件。这是操作建议,本文没有连接生产数据库或执行示例。
先把两种编号分开
我不习惯把交接消息里的“线程号”直接粘进查询。先问清楚:它来自进程列表,还是 Performance Schema?在用户连接对应的 threads 行中,PROCESSLIST_ID 是连接编号,THREAD_ID 是监控线程编号;后台线程的 PROCESSLIST_ID 则可能为 NULL。

在目标实例上取得映射
先确认正在连接的是发生问题的实例。示例中的 8042 仅为占位数字,应换成当次已确认的目标连接编号。
-- 记录实例和查询时间,避免把不同实例的编号混用。
SELECT @@hostname AS host_name,
@@port AS port_number,
VERSION() AS server_version,
NOW() AS observed_at;
-- 8042 是示例占位值,必须替换为当前目标连接编号。
SET @target_connection_id = 8042;
SELECT @target_connection_id AS connection_id,
PS_THREAD_ID(@target_connection_id) AS ps_thread_id;
结果应理解为“这一时刻的映射”。函数返回无符号大整数或 NULL,不能假定连接在下一次查询前仍然存在。若只是查看当前会话,也可使用下面的写法。
-- 用当前会话的连接编号进行映射,不需要手填编号。
SELECT CONNECTION_ID() AS connection_id,
PS_THREAD_ID(CONNECTION_ID()) AS ps_thread_id;
用映射结果定位线程记录
对我来说,先核对 threads 行比立刻扩大事件查询更清楚:它能说明连接用户、主机和采集状态。以下查询需要相应表的读取权限;获得线程表 SELECT 权限可能看见其他用户的线程信息,应使用受授权的诊断账号。
-- 同时保留连接号条件,便于检查这条映射对应的对象。
SELECT t.THREAD_ID, t.PROCESSLIST_ID,
t.PROCESSLIST_USER, t.PROCESSLIST_HOST,
t.INSTRUMENTED
FROM performance_schema.threads AS t
WHERE t.PROCESSLIST_ID = @target_connection_id
AND t.THREAD_ID = PS_THREAD_ID(@target_connection_id);
-- 查询当前语句,限制输出量;没有行不等于连接一定没有活动。
SELECT e.THREAD_ID, e.EVENT_ID, e.SQL_TEXT
FROM performance_schema.events_statements_current AS e
WHERE e.THREAD_ID = PS_THREAD_ID(@target_connection_id)
LIMIT 5;

SQL_TEXT 可能包含业务信息,交接时应按自身数据管理要求脱敏。这些查询不会修复慢 SQL,也不改变线程状态;它们只负责定位观察对象。
遇到 NULL 或无事件时怎样收尾
| 现象 | 先判断什么 | 处理建议 |
|---|---|---|
| 函数返回 NULL | 参数是否为空、连接是否仍在、线程实例资源是否可用 | 重新确认目标与实例,不把 NULL 当成线程编号 |
| 函数报错 | 版本、函数支持和 Performance Schema 是否启用 | 保留原始错误再处理环境问题 |
| 能映射,事件却为空 | 事件采集配置和查询时刻 | 继续按事件表规则排查,不立即宣告无活动 |
| 连接已经重连 | 是否仍是原会话 | 重新获取编号,不继续复用旧映射 |
官方文档特别区分了线程统计 consumer 与编号映射:关闭 thread_instrumentation 不会直接使 PS_THREAD_ID 失效;线程实例内存不足或上限为 0 则可能返回 NULL。若 Performance Schema 整体关闭,函数会报错。不要把几种现象归成同一个开关问题。
本篇只读查询没有需要回滚的业务修改。我更愿意在信息不足时停止扩大操作范围,先补齐记录,而不是为了让图表出现数据临时开启所有采集项。
交接时保留哪些线索
至少记下实例、观察时间、连接号来源、映射值和查询状态。threads 行会在会话结束后移除;自动重连关联的是新记录,所以一次映射不应当作长期身份。适合使用这个方法的场景,是手头已有连接编号、需要查对应监控数据的短时诊断。
PS_THREAD_ID(NULL) 表示当前会话吗?
不表示,它返回 NULL。不要与 sys.ps_thread_id() 的空参数语义混淆;需要当前会话时可显式传 CONNECTION_ID()。
映射结果能直接作为操作系统线程号吗?
不能。本文返回的是 Performance Schema 的 THREAD_ID,不能拿它直接解释操作系统进程或线程标识。
查不到行就代表采集系统故障吗?
不一定。目标会话可能已经结束,查询也可能落在错误实例上;先核对这些条件,再讨论采集配置。
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
337 收藏
-
447 收藏
-
432 收藏
-
492 收藏
-
443 收藏
-
454 收藏
-
143 收藏
-
209 收藏
-
369 收藏
-
281 收藏
-
400 收藏
-
393 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 485次学习