MySQL 8.0 リファレンスマニュアル


27.12.19.10 スレッドテーブル

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 テーブルが生成されます。 その後、サーバーがスレッドを作成するたびに新しい行が追加されます。

新しいスレッドの INSTRUMENTED および HISTORY カラムの値は、setup_actors テーブルの内容によって決まります。 setup_actors テーブルを使用してこれらのカラムを制御する方法の詳細は、セクション27.4.6「スレッドによる事前フィルタリング」 を参照してください。

スレッドの終了時に、threads テーブルからの行の削除が行われます。 クライアントセッションに関連付けられたスレッドでは、セッションの終了時に削除が行われます。 クライアントで自動再接続が有効になっていて、切断後にセッションが再接続された場合、セッションは異なる PROCESSLIST_ID 値を持つ threads テーブルの新しい行に関連付けられます。 新しいスレッドの INSTRUMENTED および HISTORY の初期値は、元のスレッドの値と異なる場合があります: 一方、setup_actors テーブルは変更された可能性があり、行の初期化後に元のスレッドの INSTRUMENTED または HISTORY の値が変更された場合、変更は新しいスレッドに引き継がれません。

スレッドモニタリング (スレッドによって実行されるイベントがインストゥルメントされているかどうか) および履歴イベントロギングを有効または無効にできます。 新しいフォアグラウンドスレッドの INSTRUMENTED および HISTORY の初期値を制御するには、setup_actors テーブルを使用します。 既存のスレッドのこれらの側面を制御するには、threads テーブルの行の INSTRUMENTED および HISTORY カラムを設定します。 (スレッドモニタリングおよび履歴イベントロギングが発生する条件の詳細は、INSTRUMENTED および HISTORY のカラムの説明を参照してください。)

接頭辞が PROCESSLIST_の名前と他のプロセス情報ソースとの threads テーブルのカラムの比較は、プロセス情報のソース を参照してください。

重要

threads テーブル以外のスレッド情報ソースの場合、他のユーザーのスレッドに関する情報は、現在のユーザーが PROCESS 権限を持っている場合にのみ表示されます。 これは threads テーブルには当てはまりません。テーブルの SELECT 権限を持つすべてのユーザーに、すべての行が表示されます。 threads テーブルにアクセスして他のユーザーのスレッドを表示できないようにするユーザーには、そのユーザーに対する SELECT 権限を付与しないでください。

threads テーブルにはこれらのカラムがあります。

  • THREAD_ID

    一意のスレッド識別子。

  • NAME

    サーバーのスレッドインストゥルメンテーションコードに関連付けられている名前。 たとえば、thread/sql/one_connection はユーザー接続の処理を担当するコード内のスレッド関数に対応し、thread/sql/main はサーバーの main() 関数を表します。

  • TYPE

    FOREGROUND または BACKGROUND のスレッドの種類。 ユーザー接続スレッドはフォアグラウンドスレッドです。 内部サーバーアクティビティーに関連付けられているスレッドはバックグラウンドスレッドです。 たとえば、内部 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。 スレッドコマンドの説明については、セクション8.14「サーバースレッド (プロセス) 情報の確認」を参照してください。 このカラムの値は、クライアント/サーバープロトコルの COM_xxx コマンドと Com_xxx ステータス変数に対応します。 セクション5.1.10「サーバーステータス変数」を参照してください

    バックグラウンドスレッドはクライアントのかわりにコマンドを実行しないため、このカラムは NULL である可能性があります。

  • PROCESSLIST_TIME

    スレッドが現在の状態になってからの秒数。 レプリカ SQL スレッドの場合、この値は、最後にレプリケートされたイベントのタイムスタンプとレプリカホストのリアルタイムの間の秒数です。 セクション17.2.3「レプリケーションスレッド」を参照してください。

  • PROCESSLIST_STATE

    スレッドが行なっていることを示すアクション、イベント、または状態。 PROCESSLIST_STATE 値の説明については、セクション8.14「サーバースレッド (プロセス) 情報の確認」を参照してください。 値が NULL の場合、スレッドはアイドルクライアントセッションに対応しているか、スレッドが実行している作業がステージでインストゥルメントされていません。

    ほとんどの状態がきわめてすばやい操作に対応します。 スレッドが何秒間も特定の状態にとどまっている場合は、問題が発生している可能性があり、調査が必要です。

  • PROCESSLIST_INFO

    スレッドが実行しているステートメント。ステートメントを実行していない場合は NULL。 このステートメントは、サーバーに送信されるステートメント、またはこのステートメントがほかのステートメントを実行する場合は、もっとも内側のステートメントである可能性があります。 たとえば、CALL ステートメントが SELECT ステートメントを実行しているストアドプロシージャーを実行する場合、PROCESSLIST_INFO 値には SELECT ステートメントが示されます。

  • PARENT_THREAD_ID

    このスレッドがサブスレッド (別のスレッドによって生成される) である場合、これは生成されるスレッドの THREAD_ID 値です。

  • ROLE

    使用されません。

  • INSTRUMENTED

    スレッドによって実行されるイベントがインストゥルメントされるかどうか。 値は YES または NO です。

    • フォアグラウンドスレッドでは、初期 INSTRUMENTED 値は、スレッドに関連付けられているユーザーアカウントが setup_actors テーブル内の任意の行に一致するかどうかによって決定されます。 照合は PROCESSLIST_USER および PROCESSLIST_HOST カラムの値に基づきます。

      スレッドがサブスレッドを生成すると、そのサブスレッドに対して作成された threads テーブルの行に対して照合が再度行われます。

    • バックグラウンドスレッドの場合、INSTRUMENTED はデフォルトで YES です。バックグラウンドスレッドに関連付けられたユーザーはないため、setup_actors は参照されません。

    • どのスレッドでも、スレッドの有効期間の間にその INSTRUMENTED 値が変更されることがあります。

    スレッドによって実行されるイベントのモニタリングが行われる場合、これらのことが当てはまる必要があります。

    • setup_consumers テーブル内の thread_instrumentation コンシューマは YES である必要があります。

    • threads.INSTRUMENTED カラムは YES である必要があります。

    • 監視は、setup_instruments テーブルで ENABLED カラムが YES に設定されているインストゥルメントから生成されたスレッドイベントに対してのみ行われます。

  • HISTORY

    スレッドの履歴イベントをログに記録するかどうか。 値は YES または NO です。

    • フォアグラウンドスレッドの場合、初期 HISTORY 値は、スレッドに関連付けられたユーザーアカウントが setup_actors テーブルのいずれかの行と一致するかどうかによって決まります。 照合は PROCESSLIST_USER および PROCESSLIST_HOST カラムの値に基づきます。

      スレッドがサブスレッドを生成すると、そのサブスレッドに対して作成された threads テーブルの行に対して照合が再度行われます。

    • バックグラウンドスレッドの場合、HISTORY はデフォルトで YES です。バックグラウンドスレッドに関連付けられたユーザーがないため、setup_actors は参照されません。

    • どのスレッドでも、その HISTORY 値はスレッドの存続期間中に変更できます。

    スレッドの履歴イベントロギングを実行するには、次のことが当てはまる必要があります:

    • setup_consumers テーブルの適切な履歴関連コンシューマを有効にする必要があります。 たとえば、events_waits_history および events_waits_history_long テーブルの待機イベントロギングでは、対応する events_waits_history および events_waits_history_long コンシューマが YES である必要があります。

    • threads.HISTORY カラムは YES である必要があります。

    • ロギングは、setup_instruments テーブルで ENABLED カラムが YES に設定されているインストゥルメントから生成されたスレッドイベントに対してのみ発生します。

  • 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.6.3「MySQL Enterprise Thread Pool」 を参照)。

    Windows の場合、THREAD_OS_ID はプロセスエクスプローラ (https://technet.microsoft.com/en-us/sysinternals/bb896653.aspx) に表示されるスレッド ID に対応します。

    Linux の場合、THREAD_OS_IDgettid() 関数の値に対応します。 この値は、たとえば、perf または ps -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 テーブルに対して許可されていません。


関連キーワード:  テーブル, PROCESSLIST, パフォーマンス, スキーマ, カラム, イベント, setup, threads, ユーザー, events