• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 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: 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
         RESOURCE_GROUP: SYS_default
    ...
    *************************** 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
         RESOURCE_GROUP: USR_default
    ...
    

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

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

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

    threads名称以前缀为前缀的表列PROCESSLIST_提供的信息类似于INFORMATION_SCHEMA.PROCESSLIST表或SHOW PROCESSLIST语句中可用的信息。因此,所有三个源均提供线程监视信息。使用threads方式在以下方面与其他两个来源的使用方式不同:

    • 访问threads不需要互斥,并且对服务器性能的影响最小。INFORMATION_SCHEMA.PROCESSLIST并且SHOW PROCESSLIST由于它们需要互斥量而对性能造成负面影响。
    • threads提供每个线程的其他信息,例如它是前台线程还是后台线程,以及与该线程关联的服务器中的位置。
    • threads提供有关后台线程的信息,因此可用于监视其他线程信息源无法监视的活动。
    • 您可以启用或禁用线程监视(即,是否检测到线程执行的事件)和历史事件日志记录。要控制新前台线程的初始值INSTRUMENTEDHISTORY值,请使用该setup_actors表。要控制现有线程的这些方面,请设置表行的INSTRUMENTEDHISTORYthreads。(有关在何种条件下螺纹监测和历史事件记录发生,看到的说明的详细信息INSTRUMENTEDHISTORY列。)

    由于这些原因,使用INFORMATION_SCHEMA.PROCESSLISTSHOW PROCESSLIST希望使用该threads表进行监视的DBA 可能会使用该表进行监视。

    注意

    对于INFORMATION_SCHEMA.PROCESSLISTSHOW PROCESSLIST,仅当当前用户具有PROCESS特权时,才会显示有关其他用户的线程的信息。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与该表的列中显示的值相同。它也是在输出Id列中显示的值SHOW PROCESSLIST,以及CONNECTION_ID()将在该线程内返回的值。

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

    • PROCESSLIST_USER

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

    • PROCESSLIST_HOST

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

      不同于HOST所述的列INFORMATION_SCHEMAPROCESSLIST表或HostSHOW PROCESSLIST输出,所述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会话处于空闲状态。有关线程命令的描述,请参见“检查线程信息”。该列的值对应于客户端/服务器协议的命令和状态变量。请参见“服务器状态变量”COM_xxxCom_xxx

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

    • PROCESSLIST_TIME

      线程处于其当前状态的时间(以秒为单位)。

    • PROCESSLIST_STATE

      指示线程正在执行的操作,事件或状态。有关PROCESSLIST_STATE值的描述,请参见“检查线程信息”。如果值为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创建的表行将再次发生匹配。

      • 对于后台线程,INSTRUMENTED就是YES默认。setup_actors未咨询,因为没有关联用户使用后台线程。
      • 对于任何线程,INSTRUMENTED可以在线程的生存期内更改其值。

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

      • 表中的thread_instrumentation使用者setup_consumers必须为YES
      • threads.INSTRUMENTED列必须为YES
      • 监测只发生于从具有仪器产生的那些线程事件ENABLED列设置为YESsetup_instruments表中。
    • 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
      • 仅对在表中将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。使用线程池插件时,这通常用于用户会话(请参见“ MySQL Enterprise线程池”)。

      对于Windows,THREAD_OS_ID对应于Process Explorer(https://technet.microsoft.com/zh-cn/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当前平台或服务器配置上不支持资源组的情况(请参阅资源组限制)。

    threads表具有以下索引:

    • THREAD_ID)上的主键
    • 在(NAME)上的索引
    • 在(PROCESSLIST_ID)上的索引
    • 在(PROCESSLIST_USERPROCESSLIST_HOST)上的索引
    • 在(PROCESSLIST_HOST)上的索引
    • 在(THREAD_OS_ID)上的索引
    • 在(RESOURCE_GROUP)上的索引

    TRUNCATE TABLE不允许用于该threads表。