Documentation Home

25.12.16.4 线程表

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

当 Performance Schema 初始化时,它会 threads根据当时存在的线程填充表。此后,每次服务器创建线程时都会添加一个新行。

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

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

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

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

重要的

对于 threads表之外的线程信息源,只有当当前用户有权限时,才会显示其他用户的线程信息PROCESSthreads桌子不是这样 ;所有行都显示给具有该 SELECT表权限的任何用户。不应通过访问该表来查看其他用户的线程的用户threads 不应被授予该表的 SELECT权限。

threads表有以下列:

  • THREAD_ID

    唯一的线程标识符。

  • NAME

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

  • TYPE

    线程类型,或者FOREGROUNDBACKGROUND。用户连接线程是前台线程。与内部服务器活动关联的线程是后台线程。例如内部InnoDB线程、向副本发送信息的二进制日志转储线程,以及复制 I/O 和 SQL 线程。

  • PROCESSLIST_ID

    对于前台线程(与用户连接相关联),这是连接标识符。这与表ID 列中显示的值、输出列中 显示的值以及线程内函数 返回的 值相同。INFORMATION_SCHEMA PROCESSLISTIdSHOW PROCESSLISTCONNECTION_ID()

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

  • PROCESSLIST_USER

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

  • PROCESSLIST_HOST

    对于后台线程,与前台线程关联的客户端的主机名NULL

    与表的HOSTINFORMATION_SCHEMA PROCESSLIST或 输出的列不同,该Host列 不包括 TCP/IP 连接的端口号。要从 Performance Schema 获取此信息,请启用套接字检测(默认情况下未启用)并检查 表: SHOW PROCESSLISTPROCESSLIST_HOSTsocket_instances

    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

    对于前台线程,线程代表客户端执行的命令类型,或者 Sleep会话是否空闲。有关线程命令的说明,请参阅 第 8.14 节,“检查服务器线程(进程)信息”。此列的值对应于 客户端/服务器协议和 状态变量的命令。参见 第 5.1.9 节,“服务器状态变量”COM_xxxCom_xxx

    后台线程不代表客户端执行命令,因此此列可能是NULL.

  • PROCESSLIST_TIME

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

  • PROCESSLIST_STATE

    指示线程正在做什么的操作、事件或状态。有关 PROCESSLIST_STATE值的说明,请参阅 第 8.14 节,“检查服务器线程(进程)信息”。如果值为 if NULL,则线程可能对应于一个空闲的客户端会话,或者它正在执行的工作未使用阶段进行检测。

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

  • PROCESSLIST_INFO

    线程正在执行的语句,或者 NULL如果它没有执行任何语句。该语句可能是发送到服务器的语句,如果该语句执行其他语句,则可能是最里面的语句。例如,如果一个CALL 语句执行一个正在执行 SELECT语句的存储过程,则该 PROCESSLIST_INFO值显示该 SELECT语句。

  • PARENT_THREAD_ID

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

  • ROLE

    没用过。

  • INSTRUMENTED

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

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

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

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

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

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

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

    • threads.INSTRUMENTED列必须是YES.

    • ENABLED仅对表中列设置为 YES的 仪器产生的线程事件进行监视 setup_instruments

  • HISTORY

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

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

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

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

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

    对于要发生的线程的历史事件日志记录,这些事情必须为真:

    • setup_consumers必须启用表 中适当的与历史相关的消费者 。events_waits_history 比如and events_waits_history_long 表 中的wait事件记录需要对应的events_waits_historyand events_waits_history_long消费者是YES.

    • threads.HISTORY列必须是 YES.

    • 记录仅发生在那些从仪器产生的线程事件中,这些线程事件的 ENABLED列设置为 YESsetup_instruments表中。

  • 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. 当使用线程池插件时,这是典型的用户会话(请参阅 第 5.5.3 节,“MySQL 企业线程池”)。

    对于 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)

TRUNCATE TABLE不允许用于threads表。