Documentation Home
MySQL 5.6 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 27.1Mb
PDF (A4) - 27.2Mb
HTML Download (TGZ) - 7.2Mb
HTML Download (Zip) - 7.2Mb


22.9.10.3 スレッドテーブル

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.PROCESSLISTSHOW 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_IDNULL であるため、値は一意ではありません。(MySQL 5.6.9 より前では、バックグラウンドスレッドの場合の値は 0 です。)

  • PROCESSLIST_USER

    フォアグラウンドスレッドに関連付けられているユーザー、バックグラウンドスレッドの場合は NULL

  • PROCESSLIST_HOST

    フォアグラウンドスレッドに関連付けられているクライアントのホスト名、バックグラウンドスレッドの場合は NULL

  • PROCESSLIST_DB

    スレッドのデフォルトのデータベース、何もない場合は NULL

  • PROCESSLIST_COMMAND

    スレッドが実行しているコマンドの種類。スレッドコマンドの説明については、セクション8.12.5「スレッド情報の検査」を参照してください。このカラムの値は、クライアント/サーバープロトコルの COM_xxx コマンドと Com_xxx ステータス変数に対応します。セクション5.1.6「サーバーステータス変数」を参照してください

  • 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 テーブル内で有効にされているインストゥルメントから生成されたスレッドイベントに対してのみ、モニタリングが行われます。


User Comments
Sign Up Login You must be logged in to post a comment.