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: mysql
PROCESSLIST_COMMAND: NULL
PROCESSLIST_TIME: 418094
PROCESSLIST_STATE: NULL
PROCESSLIST_INFO: NULL
PARENT_THREAD_ID: NULL
ROLE: NULL
INSTRUMENTED: YES
HISTORY: YES
CONNECTION_TYPE: NULL
THREAD_OS_ID: 5856
RESOURCE_GROUP: SYS_default
EXECUTION_ENGINE: PRIMARY
CONTROLLED_MEMORY: 1456
MAX_CONTROLLED_MEMORY: 67480
TOTAL_MEMORY: 1270430
MAX_TOTAL_MEMORY: 1307317
TELEMETRY_ACTIVE: NO
...
当 Performance Schema 初始化时,它会根据当时存在的线程填充 threads
表。此后,每次服务器创建线程时都会添加新行。
新线程的 INSTRUMENTED
和 HISTORY
列值由 setup_actors
表的内容决定。有关如何使用 setup_actors
表来控制这些列的信息,请参见 第 29.4.6 节,“通过线程进行预过滤”。
从 threads
表中删除行发生在线程结束时。对于与客户端会话关联的线程,删除发生在会话结束时。如果客户端启用了自动重新连接,并且会话在断开连接后重新连接,则该会话将与 threads
表中具有不同 PROCESSLIST_ID
值的新行相关联。新线程的初始 INSTRUMENTED
和 HISTORY
值可能与原始线程的初始值不同:setup_actors
表可能在此期间发生了变化,并且如果在初始化行后更改了原始线程的 INSTRUMENTED
或 HISTORY
值,则更改不会延续到新线程。
您可以启用或禁用线程监控(即,线程执行的事件是否被检测),以及历史事件日志记录。要控制新前台线程的初始 INSTRUMENTED
和 HISTORY
值,请使用 setup_actors
表。要控制现有线程的这些方面,请设置 threads
表行的 INSTRUMENTED
和 HISTORY
列。(有关线程监控和历史事件日志记录发生条件的更多信息,请参见 INSTRUMENTED
和 HISTORY
列的描述。)
要比较 threads
表中列名以 PROCESSLIST_
为前缀的列与其他进程信息源,请参见 进程信息的来源。
对于除 threads
表之外的其他线程信息源,仅当当前用户具有 PROCESS
权限时才会显示其他用户的线程信息。对于 threads
表并非如此;对该表具有 SELECT
权限的任何用户都会显示所有行。不应通过访问 threads
表查看其他用户的线程的用户,不应获得对该表的 SELECT
权限。
表 threads
包含以下列:
THREAD_ID
唯一的线程标识符。
NAME
与服务器中线程检测代码关联的名称。例如,
thread/sql/one_connection
对应于代码中负责处理用户连接的线程函数,而thread/sql/main
代表服务器的main()
函数。TYPE
线程类型,可以是
FOREGROUND
或BACKGROUND
。用户连接线程是前台线程。与内部服务器活动相关的线程是后台线程。例如,内部InnoDB
线程、“binlog dump” 线程(将信息发送到副本)、复制 I/O 和 SQL 线程。PROCESSLIST_ID
对于前台线程(与用户连接相关),这是连接标识符。这与
INFORMATION_SCHEMA
PROCESSLIST
表的ID
列中显示的值、SHOW PROCESSLIST
输出的Id
列中显示的值以及线程内CONNECTION_ID()
函数返回的值相同。对于后台线程(与用户连接无关),
PROCESSLIST_ID
为NULL
,因此这些值并不唯一。PROCESSLIST_USER
与前台线程关联的用户,后台线程为
NULL
。PROCESSLIST_HOST
与前台线程关联的客户端主机名,后台线程为
NULL
。与
INFORMATION_SCHEMA
PROCESSLIST
表的HOST
列或SHOW PROCESSLIST
输出的Host
列不同,PROCESSLIST_HOST
列不包含 TCP/IP 连接的端口号。要从性能模式获取此信息,请启用套接字检测(默认情况下未启用)并检查socket_instances
表。mysql> SELECT NAME, ENABLED, TIMED 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
。有关线程命令的说明,请参见 第 10.14 节,“检查服务器线程(进程)信息”。此列的值对应于客户端/服务器协议的COM_
命令和xxx
Com_
状态变量。请参见 第 7.1.10 节,“服务器状态变量”。xxx
后台线程不会代表客户端执行命令,因此此列可能为
NULL
。PROCESSLIST_TIME
线程处于当前状态的秒数。对于副本 SQL 线程,该值为最后一个复制事件的时间戳与副本主机实际时间之间的秒数。请参见 第 19.2.3 节,“复制线程”。
PROCESSLIST_STATE
指示线程正在执行的操作、事件或状态。有关
PROCESSLIST_STATE
值的说明,请参见 第 10.14 节,“检查服务器线程(进程)信息”。如果值为NULL
,则线程可能对应于空闲的客户端会话,或者它正在执行的工作没有使用阶段进行检测。大多数状态对应于非常快速的操作。如果线程在给定状态下保持很多秒,则可能存在需要调查的问题。
PROCESSLIST_INFO
线程正在执行的语句,如果它没有执行任何语句,则为
NULL
。该语句可能是发送到服务器的语句,或者如果该语句执行其他语句,则为最内部的语句。例如,如果CALL
语句执行一个执行SELECT
语句的存储过程,则PROCESSLIST_INFO
值将显示SELECT
语句。PARENT_THREAD_ID
如果此线程是子线程(由另一个线程生成),则这是生成线程的
THREAD_ID
值。ROLE
未用。
INSTRUMENTED
线程执行的事件是否已检测。该值为
YES
或NO
。对于前台线程,初始
INSTRUMENTED
值取决于与线程关联的用户帐户是否与setup_actors
表中的任何行匹配。匹配基于PROCESSLIST_USER
和PROCESSLIST_HOST
列的值。如果线程生成子线程,则会再次为子线程创建的
threads
表行进行匹配。对于后台线程,
INSTRUMENTED
默认情况下为YES
。不会咨询setup_actors
,因为后台线程没有关联的用户。对于任何线程,其
INSTRUMENTED
值可以在线程的生命周期内更改。
要监视线程执行的事件,以下条件必须为真:
setup_consumers
表中的thread_instrumentation
消费者必须为YES
。threads.INSTRUMENTED
列必须为YES
。仅监视从检测器产生的那些线程事件,这些检测器在
setup_instruments
表中具有设置为YES
的ENABLED
列。
HISTORY
是否为线程记录历史事件。该值为
YES
或NO
。对于前台线程,初始
HISTORY
值取决于与线程关联的用户帐户是否与setup_actors
表中的任何行匹配。匹配基于PROCESSLIST_USER
和PROCESSLIST_HOST
列的值。如果线程生成子线程,则会再次为子线程创建的
threads
表行进行匹配。对于后台线程,
HISTORY
默认情况下为YES
。不会咨询setup_actors
,因为后台线程没有关联的用户。对于任何线程,其
HISTORY
值可以在线程的生命周期内更改。
要为线程记录历史事件,以下条件必须为真:
setup_consumers
表中适当的历史相关消费者必须启用。例如,在events_waits_history
和events_waits_history_long
表中进行等待事件日志记录需要对应的events_waits_history
和events_waits_history_long
消费者为YES
。threads.HISTORY
列必须为YES
。仅记录从检测器产生的那些线程事件,这些检测器在
setup_instruments
表中具有设置为YES
的ENABLED
列。
CONNECTION_TYPE
用于建立连接的协议,或后台线程的
NULL
。允许的值为TCP/IP
(未加密建立的 TCP/IP 连接)、SSL/TLS
(已加密建立的 TCP/IP 连接)、Socket
(Unix 套接字文件连接)、Named Pipe
(Windows 命名管道连接)和Shared Memory
(Windows 共享内存连接)。THREAD_OS_ID
基础操作系统定义的线程或任务标识符(如果有)。
当 MySQL 线程在其整个生命周期内与同一个操作系统线程关联时,
THREAD_OS_ID
包含操作系统线程 ID。当 MySQL 线程在其整个生命周期内没有与同一个操作系统线程关联时,
THREAD_OS_ID
包含NULL
。当使用线程池插件时,对于用户会话来说这很常见(请参见 第 7.6.3 节,“MySQL Enterprise 线程池”)。
对于 Windows,
THREAD_OS_ID
对应于在进程资源管理器中可见的线程 ID (https://technet.microsoft.com/en-us/sysinternals/bb896653.aspx)。对于 Linux,
THREAD_OS_ID
对应于gettid()
函数的值。此值例如通过 perf 或 ps -L 命令公开,或在proc
文件系统 (/proc/
) 中公开。有关详细信息,请参见[pid]
/task/[tid]
perf-stat(1)
、ps(1)
和proc(5)
手册页。RESOURCE_GROUP
资源组标签。如果当前平台或服务器配置不支持资源组,则此值为
NULL
(请参见 资源组限制)。EXECUTION_ENGINE
查询执行引擎。该值为
PRIMARY
或SECONDARY
。用于 HeatWave 服务和 HeatWave,其中PRIMARY
引擎为InnoDB
,而SECONDARY
引擎为 HeatWave (RAPID
)。对于 MySQL Community Edition Server、MySQL Enterprise Edition Server(本地)和没有 HeatWave 的 HeatWave 服务,该值始终为PRIMARY
。CONTROLLED_MEMORY
线程使用的受控内存量。
MAX_CONTROLLED_MEMORY
线程执行期间看到的
CONTROLLED_MEMORY
的最大值。TOTAL_MEMORY
线程当前使用的内存量,包括受控的和不受控的。
MAX_TOTAL_MEMORY
线程执行期间看到的
TOTAL_MEMORY
的最大值。TELEMETRY_ACTIVE
线程是否具有附加的活动遥测会话。该值为
YES
或NO
。
表 threads
包含以下索引:
主键为 (
THREAD_ID
)索引为 (
NAME
)索引为 (
PROCESSLIST_ID
)索引为 (
PROCESSLIST_USER
,PROCESSLIST_HOST
)索引为 (
PROCESSLIST_HOST
)索引为 (
THREAD_OS_ID
)索引为 (
RESOURCE_GROUP
)
TRUNCATE TABLE
不允许用于 threads
表。