文件首頁
MySQL 9.0 參考手冊
相關文件 下載本手冊
PDF (美式信紙) - 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 連線的連接埠號碼。若要從 Performance Schema 取得此資訊,請啟用 Socket 檢測(預設為未啟用),並檢查 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 表格列再次進行比對。

    • 對於背景執行緒,預設情況下 INSTRUMENTEDYES。由於背景執行緒沒有相關聯的使用者,因此不會查詢 setup_actors

    • 對於任何執行緒,其 INSTRUMENTED 值都可以在執行緒的生命週期內變更。

    若要監控執行緒執行的事件,必須符合以下條件:

    • setup_consumers 表格中的 thread_instrumentation 消費者必須為 YES

    • threads.INSTRUMENTED 欄位必須為 YES

    • 只有在 setup_instruments 表格中,其 ENABLED 欄位設定為 YES 的檢測產生執行緒事件時,才會進行監控。

  • HISTORY

    是否記錄執行緒的歷史事件。值為 YESNO

    • 對於前景執行緒,初始 HISTORY 值取決於與執行緒相關聯的使用者帳戶是否符合 setup_actors 表格中的任何列。比對是根據 PROCESSLIST_USERPROCESSLIST_HOST 欄位的值。

      如果執行緒產生子執行緒,則會針對為子執行緒建立的 threads 表格列再次進行比對。

    • 對於背景執行緒,預設情況下 HISTORYYES。由於背景執行緒沒有相關聯的使用者,因此不會查詢 setup_actors

    • 對於任何執行緒,其 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 線程池」)。

    對於 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) 的 man 頁面。

  • RESOURCE_GROUP

    資源群組標籤。如果目前的平台或伺服器設定不支援資源群組,則此值為 NULL (請參閱資源群組限制)。

  • EXECUTION_ENGINE

    查詢執行引擎。該值為 PRIMARYSECONDARY。適用於 HeatWave Service 和 HeatWave,其中 PRIMARY 引擎是 InnoDB,而 SECONDARY 引擎是 HeatWave (RAPID)。對於 MySQL 社群版伺服器、MySQL 企業版伺服器(本地部署)和不含 HeatWave 的 HeatWave Service,該值永遠為 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