必须通过 performance_schema.threads 表关联:SELECT THREAD_ID FROM performance_schema.threads WHERE PROCESSLIST_ID = 123; 再查 events_statements_current,否则因线程不存在、权限不足或 performance_schema 关闭等导致查不到。

直接查 performance_schema.events_statements_current,但必须先拿到准确的 THREAD_ID —— 这是唯一可靠入口,INFO 字段在 PROCESSLIST 里经常被截断或为空。
怎么从 connection_id 映射到 performance_schema.thread_id
MySQL 内部线程 ID(THREAD_ID)和连接 ID(CONNECTION_ID())不是同一个值,不能直接等同。必须通过 performance_schema.threads 表做一次关联:
-
SELECT THREAD_ID FROM performance_schema.threads WHERE PROCESSLIST_ID = CONNECTION_ID();—— 当前会话适用 -
SELECT THREAD_ID FROM performance_schema.threads WHERE PROCESSLIST_ID = 123;—— 查其他会话时,把123换成SHOW PROCESSLIST里看到的Id列值 - 如果
PROCESSLIST_ID为NULL(比如后台线程、内部线程),说明它不对应客户端连接,events_statements_current里也不会有它的 SQL 记录
查指定 thread_id 的当前执行 SQL(含完整文本)
events_statements_current 是实时快照表,每条记录对应一个线程「当前正在执行或刚执行完」的语句。只要线程没结束、语句没完成,这里就能看到:
SELECT SQL_TEXT, EVENT_NAME, TIMER_WAIT / 1E12 AS exec_seconds FROM performance_schema.events_statements_current WHERE THREAD_ID = 128;-
SQL_TEXT是完整语句(不受 100 字符限制),但仅当语句未完成或刚完成时才保留;一旦线程进入空闲(Sleep),该行会被新语句覆盖或清空 -
TIMER_WAIT单位是皮秒,除以1E12才是秒;若为0,说明语句刚开始或已结束但尚未刷新状态 - 注意:该表默认只保留每个线程 1 条记录(由
performance_schema_events_statements_history_size控制,默认 10,但_current表始终只存最新一条)
为什么查不到?常见映射失败原因
即使你确认了 Id 是 45,用它去查 threads 却返回空,大概率是以下情况之一:
- 该连接已断开,
performance_schema.threads中对应行已被自动删除(它只存活跃线程) - 用户权限不足:
SELECT权限只对本用户线程有效;要查别人线程,需PROCESS或SUPER权限 -
performance_schema被禁用:SHOW VARIABLES LIKE 'performance_schema';返回OFF—— 此时所有相关表都不可用 - 线程处于非 SQL 执行态(如
Waiting for table flush、Idle),events_statements_current可能无记录或SQL_TEXT为NULL
真正难的不是写那条 SELECT,而是确认你要盯的那个线程此刻是否还活着、有没有被 instrumented、权限够不够——这些条件缺一不可,漏掉一个就查不到。


















