Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


29.12.22.8 线程表

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
...

当性能方案初始化时,它根据存在的线程-populate threads 表。随后,每当服务器创建一个线程时,添加一行。

新线程的 INSTRUMENTEDHISTORY 列的值由 setup_actors 表的内容确定。有关如何使用 setup_actors 表来控制这些列的信息,请参阅 第29.4.6节,“Pre-Filtering by Thread”

threads 表中删除行的操作发生在线程结束时。对于与客户端会话相关的线程,删除操作发生在会话结束时。如果客户端启用了自动重新连接,并且会话重新连接后断开,会话将与新的行在 threads 表中关联,该行的 PROCESSLIST_ID 值不同。新线程的初始 INSTRUMENTEDHISTORY 值可能与原始线程不同: setup_actors 表可能已经更改了,原始线程的 INSTRUMENTEDHISTORY 值已经更改,但这些更改不适用于新线程。

您可以启用或禁用线程监控(即线程执行的事件是否被instrumented)和历史事件记录。要控制新前台线程的初始 INSTRUMENTEDHISTORY 值,请使用 setup_actors 表。要控制现有线程的这些方面,请设置 threads 表行的 INSTRUMENTEDHISTORY 列。 (有关线程监控和历史事件记录的条件的更多信息,请参阅 INSTRUMENTEDHISTORY 列的描述。)

关于threads表中的列名具有前缀PROCESSLIST_与其他进程信息来源的比较,请参见进程信息来源

Important

对于除threads表之外的线程信息来源,当前用户必须具有PROCESS特权。对于threads表,所有行将被显示给任何具有SELECT特权的用户。用户不应该被授予访问threads表的SELECT特权,以免他们可以查看其他用户的线程信息。

以下是threads表的列:

  • THREAD_ID

    唯一线程标识符。

  • NAME

    与服务器线程 instrumentation 代码关联的名称。例如,thread/sql/one_connection对应于处理用户连接的线程函数,而thread/sql/main表示服务器的主函数。

  • TYPE

    线程类型,either FOREGROUND or BACKGROUND。用户连接线程是前台线程,而与服务器内部活动相关的线程是后台线程。例如,内部InnoDB线程、发送信息到副本的binlog dump线程和复制I/O和SQL线程。

  • PROCESSLIST_ID

    对于前台线程(与用户连接相关联),这是连接标识符。 这与 INFORMATION_SCHEMA PROCESSLIST 表的 ID 列中显示的值相同,也与 SHOW PROCESSLIST 输出的 Id 列中显示的值相同,并由线程内的 CONNECTION_ID() 函数返回。

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

  • PROCESSLIST_USER

    与前台线程关联的用户,NULL为后台线程。

  • PROCESSLIST_HOST

    前台线程关联的客户端主机名,NULL为后台线程。

    INFORMATION_SCHEMA PROCESSLIST 表或SHOW PROCESSLIST 输出的Host列不同,PROCESSLIST_HOST 列不包括 TCP/IP 连接的端口号。要从性能 Schema 中获取该信息,启用 socket instrumentation(默认不启用)并查看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节,“Examining Server Thread (Process) Information”。该列的值对应于客户端/服务器协议中的COM_xxx命令和Com_xxx状态变量。请见第7.1.10节,“Server Status Variables”

    后台线程不在客户端执行命令,因此该列可能为NULL

  • PROCESSLIST_TIME

    线程当前状态的时间(以秒为单位)。对于复制 SQL 线程,值是从最后一个复制事件的时间戳到复制主机的实际时间之间的秒数。请见第19.2.3节,“Replication Threads”

  • PROCESSLIST_STATE

    线程正在做的事情的动作、事件或状态。对于PROCESSLIST_STATE值的描述,请见第10.14节,“Examining Server Thread (Process) Information”。如果值为NULL,线程可能对应于空闲客户端会话或它正在做的事情没有被instrumented。

    大多数状态对应于快速操作。如果线程在给定的状态中停留了许多秒,可能存在需要调查的问题。

  • PROCESSLIST_INFO

    当前执行的语句或NULL,如果当前没有执行语句。语句可能是发送到服务器的语句,也可能是执行其他语句的最内层语句。例如,如果一个CALL语句执行一个存储过程,该存储过程执行一个SELECT语句,那么PROCESSLIST_INFO值将显示SELECT语句。

  • PARENT_THREAD_ID

    如果当前线程是子线程(由另一个线程spawn),那么这是spawn线程的THREAD_ID值。

  • ROLE

    未使用。

  • INSTRUMENTED

    是否对线程执行的事件进行了instrumentation。值是YESNO

    • 对于前台线程,初始INSTRUMENTED值是根据用户账户是否与setup_actors表中的某一行匹配而确定的。匹配是基于PROCESSLIST_USERPROCESSLIST_HOST列的值。

      如果线程spawn了子线程,匹配将在threads表中的子线程行中再次发生。

    • 对于后台线程,INSTRUMENTED默认为YES。因为后台线程没有关联的用户,所以setup_actors不被 consulted。

    • 对于任何线程,它的INSTRUMENTED值可以在线程生命周期中被改变。

    为了监控线程执行的事件,以下条件必须满足:

    • setup_consumers表中的thread_instrumentation消费者必须为YES

    • threads.INSTRUMENTED列必须为YES

    • 监控只对来自instrumentation的线程事件进行,条件是setup_instruments表中的instrumentation instrument的ENABLED列设置为YES

  • HISTORY

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

    • 对于前台线程,初始HISTORY值是根据用户账户是否与setup_actors表中的某一行匹配来确定。匹配是基于PROCESSLIST_USERPROCESSLIST_HOST列的值。

      如果线程.spawn一个子线程,匹配将再次发生在threads表中创建的子线程的行。

    • 对于后台线程,HISTORY默认为YESsetup_actors不被 consulted,因为后台线程没有关联的用户。

    • 对于任何线程,它的HISTORY值可以在线程的生命周期中被改变。

    为了使历史事件日志记录线程生效,以下条件必须成立:

    • setup_consumers表中的适当历史相关消费者必须启用。例如,等待事件日志记录在events_waits_historyevents_waits_history_long表中需要相应的events_waits_historyevents_waits_history_long消费者被设置为YES

    • threads.HISTORY列必须为YES

    • 只有当来自于启用的仪器的线程事件被记录时,才会记录线程事件。这些仪器在setup_instruments表中ENABLED列设置为YES时才被启用。

  • CONNECTION_TYPE

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

  • THREAD_OS_ID

    线程或任务标识符,根据操作系统定义:

    • 当MySQL线程与操作系统线程关联其整个生命周期时,THREAD_OS_ID包含操作系统线程ID。

    • 当 MySQL 线程不与操作系统线程关联其整个生命周期时,THREAD_OS_ID包含NULL。这在使用线程池插件(见第7.6.3节,“MySQL Enterprise Thread Pool”)时是典型的用户会话。

    在 Windows 中,THREAD_OS_ID对应于 Process Explorer 中的线程 ID(https://technet.microsoft.com/en-us/sysinternals/bb896653.aspx)。

    在 Linux 中,THREAD_OS_ID对应于 gettid() 函数的值。该值可以使用 perfps -L 命令或在 proc 文件系统(/proc/[pid]/task/[tid])中暴露。更多信息,请见 perf-stat(1)ps(1)proc(5) 手册页。

  • RESOURCE_GROUP

    资源组标签。如果资源组不支持当前平台或服务器配置(见资源组限制),则该值为 NULL

  • EXECUTION_ENGINE

    查询执行引擎。该值是 PRIMARYSECONDARY。对于 MySQL HeatWave 服务和 HeatWave,PRIMARY 引擎是 InnoDBSECONDARY 引擎是 HeatWave(RAPID)。对于 MySQL Community Edition 服务器、MySQL Enterprise Edition 服务器(在站点)、MySQL HeatWave 服务(无 HeatWave),该值总是 PRIMARY

  • CONTROLLED_MEMORY

    线程使用的控制内存量。

  • MAX_CONTROLLED_MEMORY

    线程执行期间 CONTROLLED_MEMORY 的最大值。

  • TOTAL_MEMORY

    线程使用的总内存量,包括控制和非控制内存。

  • MAX_TOTAL_MEMORY

    线程执行期间 TOTAL_MEMORY 的最大值。

  • TELEMETRY_ACTIVE

    线程是否具有活动的遥测会话。该值是 YESNO

threads具有以下索引:

  • 主键(THREAD_ID

  • 索引(NAME

  • 索引(PROCESSLIST_ID

  • 索引(PROCESSLIST_USERPROCESSLIST_HOST

  • 索引(PROCESSLIST_HOST

  • 索引(THREAD_OS_ID

  • 索引(RESOURCE_GROUP)

TRUNCATE TABLE 不允许对threads 表。