threads
テーブルは各サーバースレッドの行を格納します。各行は、スレッドに関する情報を格納し、それに対するモニタリングが有効にされているかどうかを示します。
mysql> SELECT * FROM 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
...
*************************** 4. row ***************************
THREAD_ID: 51
NAME: thread/sql/one_connection
TYPE: FOREGROUND
PROCESSLIST_ID: 34
PROCESSLIST_USER: paul
PROCESSLIST_HOST: localhost
PROCESSLIST_DB: performance_schema
PROCESSLIST_COMMAND: Query
PROCESSLIST_TIME: 0
PROCESSLIST_STATE: Sending data
PROCESSLIST_INFO: SELECT * FROM threads
PARENT_THREAD_ID: 1
ROLE: NULL
INSTRUMENTED: YES
...
threads
テーブルの初期の内容は、パフォーマンススキーマの初期化が行われるときに、存在しているスレッドに基づきます。その後、サーバーがスレッドを作成するたびに新しい行が追加されます。
スレッドの終了時に、threads
テーブルからの行の削除が行われます。クライアントセッションに関連付けられたスレッドでは、セッションの終了時に削除が行われます。クライアントの自動再接続が有効にされており、セッションが切断後に再接続した場合、そのセッションは異なる PROCESSLIST_ID
値を持つ threads
テーブル内の新しい行に関連付けられます。新しいスレッドの初期 INSTRUMENTED
値は元のスレッドの値と異なることがあります。その間に setup_actors
テーブルが変更されている可能性があり、元のスレッドの INSTRUMENTED
値が初期化後に変更されている場合、その変更は新しいスレッドに持ち越されません。
PROCESSLIST_
のプリフィクスのある名前を持つ threads
テーブルカラムは、INFORMATION_SCHEMA.PROCESSLIST
テーブルまたは SHOW PROCESSLIST
ステートメントから入手できるものに似た情報を提供します。そのため、これらのすべてのソースはスレッドモニタリング情報を提供します。threads
の使用は、次の点で、ほかの 2 つのソースの使用と異なります。
threads
へのアクセスには相互排他ロックは必要なく、サーバーパフォーマンスへの影響は最小です。INFORMATION_SCHEMA.PROCESSLIST
とSHOW PROCESSLIST
では相互排他ロックが必要になるため、パフォーマンスの低下につながります。threads
は、スレッドがフォアグラウンドスレッドかバックグラウンドスレッドか、およびスレッドに関連付けられているサーバー内の場所などの、各スレッドの追加情報を提供します。threads
はバックグラウンドスレッドに関する情報を提供するため、ほかのスレッド情報ソースでは不可能なアクティビティーのモニターに使用できます。スレッドモニタリングを有効または無効にできます (つまり、スレッドによって実行されるイベントがインストゥルメントされるかどうか)。既存のスレッドのモニタリングを制御するには、
threads
テーブルのINSTRUMENTED
カラムを設定します。新しいフォアグラウンドスレッドの初期INSTRUMENTED
値を制御するには、setup_actors
テーブルを使用します。(スレッドモニタリングが行われる状況の詳細については、INSTRUMENTED
カラムの説明を参照してください。)
これらの理由で、INFORMATION_SCHEMA.PROCESSLIST
または SHOW PROCESSLIST
を使用して、サーバーモニタリングを実行する DBA は、代わりに threads
を使用してモニターしたいと考える場合があります。
INFORMATION_SCHEMA.PROCESSLIST
および SHOW PROCESSLIST
では、ほかのユーザーのスレッドに関する情報は、現在のユーザーに PROCESS
権限がある場合にのみ表示されます。これは 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
であるため、値は一意ではありません。(MySQL 5.6.9 より前では、バックグラウンドスレッドの場合の値は 0 です。) -
PROCESSLIST_USER
フォアグラウンドスレッドに関連付けられているユーザー、バックグラウンドスレッドの場合は
NULL
。 -
PROCESSLIST_HOST
フォアグラウンドスレッドに関連付けられているクライアントのホスト名、バックグラウンドスレッドの場合は
NULL
。 -
PROCESSLIST_DB
スレッドのデフォルトのデータベース、何もない場合は
NULL
。 -
PROCESSLIST_COMMAND
スレッドが実行しているコマンドの種類。スレッドコマンドの説明については、セクション8.12.5「スレッド情報の検査」を参照してください。このカラムの値は、クライアント/サーバープロトコルの
COM_
コマンドとxxx
Com_
ステータス変数に対応します。セクション5.1.6「サーバーステータス変数」を参照してくださいxxx
-
PROCESSLIST_TIME
スレッドが現在の状態になってからの秒数。
-
PROCESSLIST_STATE
スレッドが行なっていることを示すアクション、イベント、または状態。
PROCESSLIST_STATE
値の説明については、セクション8.12.5「スレッド情報の検査」を参照してください。ほとんどの状態がきわめてすばやい操作に対応します。スレッドが何秒間も特定の状態にとどまっている場合は、問題が発生している可能性があり、調査が必要です。
-
PROCESSLIST_INFO
スレッドが実行しているステートメント、またはそれがどのステートメントも実行していない場合は
NULL
。このステートメントは、サーバーに送信されるステートメント、またはこのステートメントがほかのステートメントを実行する場合は、もっとも内側のステートメントである可能性があります。たとえば、CALL
ステートメントがSELECT
ステートメントを実行しているストアドプロシージャーを実行する場合、PROCESSLIST_INFO
値にはSELECT
ステートメントが示されます。 -
PARENT_THREAD_ID
このスレッドがサブスレッド (別のスレッドによって生成される) である場合、これは生成されるスレッドの
THREAD_ID
値です。スレッドの生成は、INSERT DELAYED
ステートメントからの行の挿入を処理するためなどに発生します。 -
ROLE
使用されません。
-
INSTRUMENTED
スレッドがインストゥルメントされるかどうか。これは、スレッドの
threads
テーブル行に影響せず、スレッドによって実行されるイベントがインストゥルメントされるかどうかに影響します。-
フォアグラウンドスレッドでは、初期
INSTRUMENTED
値は、スレッドに関連付けられているユーザーアカウントがsetup_actors
テーブル内の任意の行に一致するかどうかによって決定されます。照合はPROCESSLIST_USER
およびPROCESSLIST_HOST
カラムの値に基づきます。スレッドがサブスレッドを生成する場合、そのサブスレッドに対して照合が再度行われます。
バックグラウンドスレッドの場合、
INSTRUMENTED
はデフォルトでYES
です。バックグラウンドスレッドに関連付けられたユーザーはないため、setup_actors
は参照されません。どのスレッドでも、スレッドの有効期間の間にその
INSTRUMENTED
値が変更されることがあります。これは、唯一の変更可能なthreads
テーブルカラムです。
スレッドによって実行されるイベントのモニタリングが行われる場合、これらのことが当てはまる必要があります。
setup_consumers
テーブル内のthread_instrumentation
コンシューマはYES
である必要があります。thread.INSTRUMENTED
カラムはYES
である必要があります。setup_instruments
テーブル内で有効にされているインストゥルメントから生成されたスレッドイベントに対してのみ、モニタリングが行われます。
-