Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

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

当性能模式初始化时,它会根据当前存在的线程填充 threads 表。然后,每当服务器创建一个新线程时,就会添加一行。

新线程的 INSTRUMENTEDHISTORY 列值是根据 setup_actors 表的内容确定的。有关如何使用 setup_actors 表控制这些列的信息,请参阅 第 29.4.6 节,“按线程预过滤”

threads 表中删除行时,线程结束时发生。对于与客户会话关联的线程,删除发生在会话结束时。如果客户启用了自动重新连接并在断开连接后重新连接,会话将关联到 threads 表中的一个新行,该行具有不同的 PROCESSLIST_ID 值。新线程的初始 INSTRUMENTEDHISTORY 值可能与原始线程的不同:setup_actors 表可能在此期间发生了变化,如果原始线程的 INSTRUMENTEDHISTORY 值在初始化后发生了变化,那么更改不会传递到新线程。

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

有关 threads 表列名前缀为 PROCESSLIST_ 的比较与其他进程信息源,请参阅 进程信息源

Important

对于线程信息源以外的 threads 表,其他用户的线程信息仅在当前用户拥有 PROCESS 权限时显示。这不是 threads 表的情况;任何拥有该表 SELECT 权限的用户都可以看到所有行。不应将 SELECT 权限授予不应查看其他用户线程的用户。

threads 表具有以下列:

  • THREAD_ID

    唯一的线程标识符。

  • NAME

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

  • TYPE

    线程类型,either FOREGROUNDBACKGROUND。用户连接线程是前台线程。与内部服务器活动相关的线程是后台线程。例如,内部 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

    HOSTINFORMATION_SCHEMA PROCESSLIST 表或 SHOW PROCESSLIST 输出的 Host 列不同,PROCESSLIST_HOST 列不包括 TCP/IP 连接的端口号。要从性能模式获取此信息,启用套接字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

    对于前台线程,客户端执行的命令类型,或者如果会话处于 idle 状态则为 Sleep。对于线程命令的描述,请参阅 Section 10.14, “Examining Server Thread (Process) Information”。该列的值对应于客户端/服务器协议的 COM_xxx 命令和 Com_xxx 状态变量。请参阅 Section 7.1.10, “Server Status Variables”

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

  • PROCESSLIST_TIME

    线程处于当前状态的时间(以秒为单位)。对于副本 SQL 线程,该值是最后一个复制事件的时间戳和副本主机的实际时间之间的差异。请参阅 Section 19.2.3, “Replication Threads”

  • PROCESSLIST_STATE

    表示线程当前正在执行的操作、事件或状态。对于 PROCESSLIST_STATE 值的描述,请参阅 Section 10.14, “Examining Server Thread (Process) Information”。如果该值为 NULL,则线程可能对应于闲置的客户端会话,或者它正在执行的工作没有被instrumentation阶段。

    大多数状态对应于非常快速的操作。如果线程停留在给定状态很长时间,可能存在需要调查的问题。

  • PROCESSLIST_INFO

    该线程正在执行的语句,或者如果它不执行语句则为 NULL。该语句可能是发送到服务器的语句,或者如果语句执行其他语句,则为最内层语句。例如,如果 CALL 语句执行存储过程,该过程执行 SELECT 语句,则 PROCESSLIST_INFO 值将显示 SELECT 语句。

  • PARENT_THREAD_ID

    如果该线程是子线程(由另一个线程spawn),则这是spawn线程的 THREAD_ID 值。

  • ROLE

    未使用。

  • INSTRUMENTED

    该线程执行的事件是否被instrumented。该值是 YESNO

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

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

    • 对于后台线程,INSTRUMENTED 默认为 YESsetup_actors 不会被咨询,因为后台线程没有关联用户。

    • 对于任何线程,其 INSTRUMENTED 值可以在线程生命周期中更改。

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

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

    • threads.INSTRUMENTED 列必须为 YES

    • 监控仅适用于来自启用了 ENABLED 列的仪器的线程事件,位于 setup_instruments 表中。

  • HISTORY

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

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

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

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

    • 对于任何线程,其 HISTORY 值可以在线程生命周期中更改。

    为了记录线程的历史事件,以下条件必须为真:

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

    • The threads.HISTORY 列必须为 YES

    • 日志记录仅适用于来自启用了ENABLED列设置为YES的仪器的线程事件,在setup_instruments表中。

  • 连接类型

    用于建立连接的协议,或者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 Thread Pool”)。

    对于Windows,THREAD_OS_ID对应于Process Explorer(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)手册页。

  • RESOURCE_GROUP

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

  • EXECUTION_ENGINE

    查询执行引擎。该值是PRIMARYSECONDARY。用于MySQL HeatWave Service和HeatWave,where the PRIMARY引擎是InnoDBSECONDARY引擎是HeatWave(RAPID)。对于MySQL Community Edition Server、MySQL Enterprise Edition Server(on-premise)和MySQL HeatWave Service without 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_USER, PROCESSLIST_HOST

  • 索引在(PROCESSLIST_HOST

  • 索引在(THREAD_OS_ID

  • 索引在(RESOURCE_GROUP

不允许对threads表使用TRUNCATE TABLE语句。