该threads
表包含每个服务器线程的一行。每行包含有关线程的信息,并指示是否为其启用监控:
mysql> SELECT * FROM performance_schema.threads\G
*************************** 1. row ***************************
THREAD_ID: 1
NAME: thread/sql/main
TYPE: BACKGROUND
PROCESSLIST_ID: NULL
PROCESSLIST_USER: NULL
PROCESSLIST_HOST: NULL
PROCESSLIST_DB: NULL
PROCESSLIST_COMMAND: NULL
PROCESSLIST_TIME: 80284
PROCESSLIST_STATE: NULL
PROCESSLIST_INFO: NULL
PARENT_THREAD_ID: NULL
ROLE: NULL
INSTRUMENTED: YES
...
*************************** 4. row ***************************
THREAD_ID: 51
NAME: thread/sql/one_connection
TYPE: FOREGROUND
PROCESSLIST_ID: 34
PROCESSLIST_USER: isabella
PROCESSLIST_HOST: localhost
PROCESSLIST_DB: performance_schema
PROCESSLIST_COMMAND: Query
PROCESSLIST_TIME: 0
PROCESSLIST_STATE: Sending data
PROCESSLIST_INFO: SELECT * FROM performance_schema.threads
PARENT_THREAD_ID: 1
ROLE: NULL
INSTRUMENTED: YES
...
当 Performance Schema 初始化时,它会
threads
根据当时存在的线程填充表。此后,每次服务器创建线程时都会添加一个新行。
新线程的INSTRUMENTED
列值由
setup_actors
表的内容决定。有关如何使用
setup_actors
表来控制此列的信息,请参阅
第 22.4.6 节,“按线程预过滤”。
threads
当线程结束时,会
从表中删除行。对于与客户端会话关联的线程,删除发生在会话结束时。如果客户端启用了自动重新连接并且会话在断开连接后重新连接,则会话将与threads
表中具有不同PROCESSLIST_ID
值的新行相关联。新线程的初始INSTRUMENTED
值可能与原始线程的初始值不同:
setup_actors
表可能同时更改,如果
INSTRUMENTED
原始线程的值在初始化后发生更改,则该更改不会延续到新线程线。
您可以启用或禁用线程监视(即,是否检测线程执行的事件)。要控制新前台线程的初始INSTRUMENTED
值,请使用该
setup_actors
表。要控制对现有线程的监视,请设置表行的
INSTRUMENTED
列
threads
。(有关发生线程监视的条件的更多信息,请参阅
INSTRUMENTED
专栏的描述。)
有关threads
名称前缀为 的表列与
PROCESSLIST_
其他流程信息源的比较,请参阅流程信息源。
对于
threads
表之外的线程信息源,只有当当前用户有权限时,才会显示其他用户的线程信息PROCESS
。threads
桌子不是这样
;所有行都显示给具有该
SELECT
表权限的任何用户。不应通过访问该表来查看其他用户的线程的用户threads
不应被授予该表的
SELECT
权限。
该threads
表有以下列:
THREAD_ID
唯一的线程标识符。
NAME
与服务器中的线程检测代码关联的名称。例如
thread/sql/one_connection
对应代码中负责处理用户连接的线程函数,thread/sql/main
代表main()
服务器的函数。TYPE
线程类型,或者
FOREGROUND
或BACKGROUND
。用户连接线程是前台线程。与内部服务器活动关联的线程是后台线程。例如内部InnoDB
线程、向副本发送信息的“二进制日志转储”线程,以及副本 I/O 和 SQL 线程。PROCESSLIST_ID
对于前台线程(与用户连接相关联),这是连接标识符。这与表
ID
列中显示的值、输出列中 显示的值以及线程内函数 返回的 值相同。INFORMATION_SCHEMA
PROCESSLIST
Id
SHOW PROCESSLIST
CONNECTION_ID()
对于后台线程(不与用户连接关联),
PROCESSLIST_ID
是NULL
,因此值不是唯一的。PROCESSLIST_USER
与前台线程关联的用户,
NULL
用于后台线程。PROCESSLIST_HOST
对于后台线程,与前台线程关联的客户端的主机名
NULL
。与表的
HOST
列INFORMATION_SCHEMA
PROCESSLIST
或 输出的列不同,该Host
列 不包括 TCP/IP 连接的端口号。要从 Performance Schema 获取此信息,请启用套接字检测(默认情况下未启用)并检查 表:SHOW PROCESSLIST
PROCESSLIST_HOST
socket_instances
mysql> SELECT * FROM performance_schema.setup_instruments WHERE NAME LIKE 'wait/io/socket%'; +----------------------------------------+---------+-------+ | NAME | ENABLED | TIMED | +----------------------------------------+---------+-------+ | wait/io/socket/sql/server_tcpip_socket | NO | NO | | wait/io/socket/sql/server_unix_socket | NO | NO | | wait/io/socket/sql/client_connection | NO | NO | +----------------------------------------+---------+-------+ 3 rows in set (0.01 sec) mysql> UPDATE performance_schema.setup_instruments SET ENABLED='YES' WHERE NAME LIKE 'wait/io/socket%'; Query OK, 3 rows affected (0.00 sec) Rows matched: 3 Changed: 3 Warnings: 0 mysql> SELECT * FROM performance_schema.socket_instances\G *************************** 1. row *************************** EVENT_NAME: wait/io/socket/sql/client_connection OBJECT_INSTANCE_BEGIN: 140612577298432 THREAD_ID: 31 SOCKET_ID: 53 IP: ::ffff:127.0.0.1 PORT: 55642 STATE: ACTIVE ...
PROCESSLIST_DB
线程的默认数据库,或者
NULL
如果未选择任何数据库。PROCESSLIST_COMMAND
对于前台线程,线程代表客户端执行的命令类型,或者
Sleep
会话是否空闲。有关线程命令的说明,请参阅 第 8.14 节,“检查服务器线程(进程)信息”。此列的值对应于 客户端/服务器协议和 状态变量的命令。参见 第 5.1.9 节,“服务器状态变量”COM_
xxx
Com_
xxx
后台线程不代表客户端执行命令,因此此列可能是
NULL
.PROCESSLIST_TIME
线程处于其当前状态的时间(以秒为单位)。对于副本 SQL 线程,该值是最后一个复制事件的时间戳与副本主机的实际时间之间的秒数。请参阅第 17.2.1 节,“复制线程”。
PROCESSLIST_STATE
指示线程正在做什么的操作、事件或状态。有关
PROCESSLIST_STATE
值的说明,请参阅 第 8.14 节,“检查服务器线程(进程)信息”。如果值为 ifNULL
,则线程可能对应于一个空闲的客户端会话,或者它正在执行的工作未使用阶段进行检测。大多数状态对应于非常快速的操作。如果线程在给定状态下停留数秒,则可能存在需要调查的问题。
PROCESSLIST_INFO
线程正在执行的语句,或者
NULL
如果它没有执行任何语句。该语句可能是发送到服务器的语句,如果该语句执行其他语句,则可能是最里面的语句。例如,如果一个CALL
语句执行一个正在执行SELECT
语句的存储过程,则该PROCESSLIST_INFO
值显示该SELECT
语句。PARENT_THREAD_ID
如果此线程是子线程(由另一个线程生成),则这是生成线程的
THREAD_ID
值。发生线程生成,例如,以处理INSERT DELAYED
语句中的行插入。ROLE
没用过。
INSTRUMENTED
是否检测线程执行的事件。值为
YES
或NO
。对于前台线程,初始
INSTRUMENTED
值取决于与线程关联的用户帐户是否与setup_actors
表中的任何行匹配。匹配基于PROCESSLIST_USER
和PROCESSLIST_HOST
列的值。如果该线程产生一个子线程,则为该子线程
threads
创建的表行再次发生匹配。对于后台线程, 默认
INSTRUMENTED
为YES
。setup_actors
不被咨询,因为后台线程没有关联的用户。对于任何线程,它的
INSTRUMENTED
值都可以在线程的生命周期内改变。这是唯一threads
可以修改的表列。
要监视线程执行的事件,必须满足以下条件:
表中的
thread_instrumentation
消费者setup_consumers
必须是YES
。该
threads.INSTRUMENTED
列必须是YES
.ENABLED
仅对表中列设置为YES
的 仪器产生的线程事件进行监视setup_instruments
。
TRUNCATE TABLE
不允许用于threads
表。