25.12.16.3 线程 table

threadstable 为每个服务器线程包含一行。每行包含有关线程的信息,并指示是否为该线程启用了监视和历史事件日志记录:

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
            HISTORY: YES
    CONNECTION_TYPE: NULL
       THREAD_OS_ID: 489803
...
*************************** 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
            HISTORY: YES
    CONNECTION_TYPE: SSL/TLS
       THREAD_OS_ID: 755399
...

性能模式初始化时,它将根据当时存在的线程填充threadstable。此后,每次服务器创建线程时都会添加一个新行。

新线程的INSTRUMENTEDHISTORY列值由setup_actorstable 的内容确定。有关如何使用setup_actorstable 控制这些列的信息,请参见第 25.4.6 节“通过线程进行预过滤”

线程结束时,会从threadstable 中删除行。对于与 Client 端会话相关联的线程,会话结束时会进行删除。如果 Client 端启用了自动重新连接,并且会话在断开连接后重新连接,则该会话将与threadstable 中具有不同PROCESSLIST_ID值的新行关联。新线程的初始INSTRUMENTEDHISTORY值可能与原始线程的值不同:setup_actorstable 在此期间可能已更改,并且如果在初始化行之后更改了原始线程的INSTRUMENTEDHISTORY值,则更改不会继承到新线程。

您可以启用或禁用线程监视(即,是否检测到线程执行的事件)和历史事件日志记录。要控制新前台线程的初始INSTRUMENTEDHISTORY值,请使用setup_actorstable。要控制现有线程的这些方面,请设置threads个 table 行的INSTRUMENTEDHISTORY列。 (有关发生线程监视和历史事件记录的条件的更多信息,请参见INSTRUMENTEDHISTORY列的描述.)

有关名称与其他过程信息源具有PROCESSLIST_前缀的threadstable 列的比较,请参见Process信息来源

Important

对于除threadstable 以外的线程信息源,仅当当前用户具有PROCESS特权时,才会显示有关其他用户的线程信息。 threadstable 并非如此;所有行都显示给对该 table 具有SELECT特权的任何用户。不能通过访问threadstable 看到其他用户线程的用户不应获得SELECT特权。

threadstable 具有以下列:

  • THREAD_ID

唯一的线程标识符。

  • NAME

与服务器中的线程检测代码关联的名称。例如,thread/sql/one_connection对应于负责处理用户连接的代码中的线程功能,而thread/sql/main代 table 服务器的main()功能。

  • TYPE

线程类型FOREGROUNDBACKGROUND。用户连接线程是前台线程。与内部服务器活动关联的线程是后台线程。示例包括内部InnoDB线程,将信息发送到副本的“ binlog 转储”线程以及复制 I/O 和 SQL 线程。

  • PROCESSLIST_ID

对于INFORMATION_SCHEMA.PROCESSLISTtable 中显示的线程,该值与该 table 的ID列中显示的值相同,该值在SHOW PROCESSLIST输出的Id列中显示,并由该线程内的CONNECTION_ID()函数返回。

对于后台线程(与用户连接无关的线程),PROCESSLIST_IDNULL,因此值不是唯一的。

  • PROCESSLIST_USER

与前景线程关联的用户,NULL为背景线程。

  • PROCESSLIST_HOST

与前台线程关联的 Client 端的主机名,NULLtable 示后台线程。

INFORMATION_SCHEMA PROCESSLISTtable 的HOST列或SHOW PROCESSLIST输出的Host列不同,PROCESSLIST_HOST列不包括 TCP/IP 连接的端口号。要从性能架构中获取此信息,请启用套接字检测(默认情况下未启用)并检查socket_instancestable:

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

对于前台线程,该线程代 tableClient 端执行的命令类型;如果会话空闲,则返回Sleep。有关线程命令的说明,请参见第 8.14 节“检查服务器线程(进程)信息”。该列的值对应于 Client 机/服务器协议的COM_xxx命令和Com_xxx状态变量。参见第 5.1.9 节“服务器状态变量”

后台线程不代 tableClient 端执行命令,因此此列可能是NULL

  • PROCESSLIST_TIME

线程处于其当前状态的时间(以秒为单位)。对于副本 SQL 线程,该值是最后一个复制事件的时间戳与副本主机的实时之间的秒数。参见第 16.2.2 节“复制实现的详细信息”

  • PROCESSLIST_STATE

指示线程正在执行的操作,事件或状态。有关PROCESSLIST_STATE个值的说明,请参见第 8.14 节“检查服务器线程(进程)信息”。如果值为NULL,则该线程可能对应于一个空闲的 Client 端会话,或者该线程正在执行的工作没有阶段化。

大多数状态对应于非常快速的操作。如果线程在给定状态下停留数秒钟,则可能存在值得研究的问题。

  • PROCESSLIST_INFO

线程正在执行的语句,如果不执行任何语句,则返回NULL。该语句可能是发送到服务器的那条语句,或者是最内部的语句(如果该语句执行其他语句)。例如,如果CALL语句执行了正在执行SELECT语句的存储过程,则PROCESSLIST_INFO值将显示SELECT语句。

  • PARENT_THREAD_ID

如果此线程是子线程(由另一个线程生成),则这是生成线程的THREAD_ID值。

  • ROLE

Unused.

  • INSTRUMENTED

是否检测线程执行的事件。该值为YESNO

  • 对于前台线程,初始INSTRUMENTED值由与该线程关联的用户帐户是否与setup_actorstable 中的任何行匹配来确定。匹配基于PROCESSLIST_USERPROCESSLIST_HOST列的值。

如果线程产生一个子线程,则为该子线程创建的threadstable 行再次匹配。

  • 对于后台线程,默认情况下INSTRUMENTEDYES。未咨询setup_actors,因为后台线程没有关联的用户。

  • 对于任何线程,可以在线程的生存期内更改其INSTRUMENTED值。

为了监视由线程执行的事件的发生,这些情况必须为真:

  • setup_consumerstable 中的thread_instrumentation使用者必须是YES

    • threads.INSTRUMENTED列必须为YES

    • 仅对在setup_instrumentstable 中将ENABLED列设置为YES的仪器产生的那些线程事件进行监视。

  • HISTORY

是否记录线程的历史事件。该值为YESNO

  • 对于前台线程,初始HISTORY值由与该线程关联的用户帐户是否与setup_actorstable 中的任何行匹配来确定。匹配基于PROCESSLIST_USERPROCESSLIST_HOST列的值。

如果线程产生一个子线程,则为该子线程创建的threadstable 行再次匹配。

  • 对于后台线程,默认情况下HISTORYYES。未咨询setup_actors,因为后台线程没有关联的用户。

  • 对于任何线程,可以在线程的生存期内更改其HISTORY值。

为了使线程发生历史事件日志,这些条件必须为真:

  • 必须启用setup_consumerstable 中与历史记录相关的适当使用者。例如,在events_waits_historyevents_waits_history_longtable 中的 await 事件日志记录要求相应的events_waits_historyevents_waits_history_long使用者为YES

    • threads.HISTORY列必须为YES

    • 仅对在setup_instrumentstable 中将ENABLED列设置为YES的仪器产生的那些线程事件进行记录。

  • CONNECTION_TYPE

用于构建连接的协议,或用于后台线程的NULL。允许的值为TCP/IP(未加密构建的 TCP/IP 连接),SSL/TLS(通过加密构建的 TCP/IP 连接),Socket(Unix 套接字文件连接),Named Pipe(Windows 命名管道连接)和Shared Memory(Windows 共享内存连接)。

  • THREAD_OS_ID

基础 os 定义的线程或任务标识符(如果有):

  • 当 MySQL 线程在其生命周期内与同一 os 线程关联时,THREAD_OS_ID包含 os 线程 ID。

    • 当 MySQL 线程在其生命周期内未与同一 os 线程关联时,THREAD_OS_ID包含NULL。当使用线程池插件时,这对于用户会话是典型的(请参阅第 5.5.3 节“ MySQL 企业线程池”)。

对于 Windows,THREAD_OS_ID对应于在进程资源 Management 器(https://technet.microsoft.com/en-us/sysinternals/bb896653.aspx)中可见的线程 ID。

对于 Linux,THREAD_OS_ID对应于gettid()函数的值。例如,使用 perfps -L 命令或在proc文件系统(/proc/[pid]/task/[tid])中公开此值。有关更多信息,请参见perf-stat(1)ps(1)proc(5)手册页。

threadstable 不允许TRUNCATE TABLE