文档首页
MySQL 9.0 参考手册
相关文档 下载本手册
PDF (US Ltr) - 40.0Mb
PDF (A4) - 40.1Mb
Man Pages (TGZ) - 258.2Kb
Man Pages (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


29.12.22.8 threads 表

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 表。此后,每次服务器创建线程时都会添加新行。

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

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

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

要比较 threads 表中列名以 PROCESSLIST_ 为前缀的列与其他进程信息源,请参见 进程信息的来源

重要

对于除 threads 表之外的其他线程信息源,仅当当前用户具有 PROCESS 权限时才会显示其他用户的线程信息。对于 threads 表并非如此;对该表具有 SELECT 权限的任何用户都会显示所有行。不应通过访问 threads 表查看其他用户的线程的用户,不应获得对该表的 SELECT 权限。

threads 包含以下列:

  • THREAD_ID

    唯一的线程标识符。

  • NAME

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

  • TYPE

    线程类型,可以是 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

    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_xxx 状态变量。请参见 第 7.1.10 节,“服务器状态变量”

    后台线程不会代表客户端执行命令,因此此列可能为 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

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

    • 对于前台线程,初始 INSTRUMENTED 值取决于与线程关联的用户帐户是否与 setup_actors 表中的任何行匹配。匹配基于 PROCESSLIST_USERPROCESSLIST_HOST 列的值。

      如果线程生成子线程,则会再次为子线程创建的 threads 表行进行匹配。

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

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

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

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

    • threads.INSTRUMENTED 列必须为 YES

    • 仅监视从检测器产生的那些线程事件,这些检测器在 setup_instruments 表中具有设置为 YESENABLED 列。

  • HISTORY

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

    • 对于前台线程,初始 HISTORY 值取决于与线程关联的用户帐户是否与 setup_actors 表中的任何行匹配。匹配基于 PROCESSLIST_USERPROCESSLIST_HOST 列的值。

      如果线程生成子线程,则会再次为子线程创建的 threads 表行进行匹配。

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

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

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

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

    • threads.HISTORY 列必须为 YES

    • 仅记录从检测器产生的那些线程事件,这些检测器在 setup_instruments 表中具有设置为 YESENABLED 列。

  • 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() 函数的值。此值例如通过 perfps -L 命令公开,或在 proc 文件系统 (/proc/[pid]/task/[tid]) 中公开。有关详细信息,请参见 perf-stat(1)ps(1)proc(5) 手册页。

  • RESOURCE_GROUP

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

  • EXECUTION_ENGINE

    查询执行引擎。该值为 PRIMARYSECONDARY。用于 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

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

threads 包含以下索引:

  • 主键为 (THREAD_ID)

  • 索引为 (NAME)

  • 索引为 (PROCESSLIST_ID)

  • 索引为 (PROCESSLIST_USER, PROCESSLIST_HOST)

  • 索引为 (PROCESSLIST_HOST)

  • 索引为 (THREAD_OS_ID)

  • 索引为 (RESOURCE_GROUP)

TRUNCATE TABLE 不允许用于 threads 表。