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_ID
はNULL
であるため、値は一意ではありません。 -
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_
ステータス変数に対応します。 セクション5.1.10「サーバーステータス変数」を参照してくださいxxx
バックグラウンドスレッドはクライアントのかわりにコマンドを実行しないため、このカラムは
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_ID
はgettid()
関数の値に対応します。 この値は、たとえば、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_USER
、PROCESSLIST_HOST
) のインデックス(
PROCESSLIST_HOST
) のインデックス(
THREAD_OS_ID
) のインデックス(
RESOURCE_GROUP
) のインデックス
TRUNCATE TABLE
は、threads
テーブルに対して許可されていません。