MySQLはOracle DatabaseやPostgreSQLなどのデータベースと違い、ps等を使用することで、
MySQLは、
MySQLのスレッドの確認方法
一般的にMySQLのスレッド状態は、SHOW PROCESSLISTで表示することが多いと思います。このコマンドでわかるのは、SHOW PROCESSLISTとinformation_テーブルは、
運用ではこれらが示す情報が分かれば十分なのですが、performance_のthreadsテーブルはフォアグラウンドスレッドとバッググラウンドスレッド両方を確認することができます。バックグラウンドスレッドにはパージスレッドやページクリーナスレッドなどのInnoDB関連のスレッドがあります。
そして、SHOW PROCESSLISTは実行するとmutexロックを取得するため高負荷時は結果がなかなか返ってこないこともありますが、threadsテーブルへのアクセスはmutexロックを取得しないのでパフォーマンスの影響は少なくなります。
threadsテーブル
MySQL5.
| カラム名 | 説明 |
|---|---|
| THREAD_ | 一意のスレッド識別子 |
| NAME | 実行している処理 |
| TYPE | FOREGROUND または BACKGROUND |
| PROCESSLIST_ | SHOW PROCESSLISTのIdカラムに表示される値 |
| PROCESSLIST_ | 接続元のユーザー名 |
| PROCESSLIST_ | 接続元のホスト名 |
| PROCESSLIST_ | スレッドのデフォルトのデータベース |
| PROCESSLIST_ | 実行しているコマンドの種類 |
| PROCESSLIST_ | 現在の状態になってからの秒数 |
| PROCESSLIST_ | SHOW PROCESSLISTのStateカラムに表示される値 |
| PROCESSLIST_ | 実行しているステートメント |
| PARENT_ | 親スレッドID |
| ROLE | 未使用 |
| INSTRUMENTED | スレッドが統計情報を取得されるかどうか |
| HISTORY | スレッドの履歴イベントを記録するかどうか |
| CONNECTION_ | TCP/ |
| THREAD_ | OSで管理されているスレッドID |
threadsテーブルの中身を見てみましょう。
mysql> SELECT * FROM performance_schema.threads;
+-----------+----------------------------------------+------------+----------------+------------------+------------------+--------------------+---------------------+------------------+--------------------------------------------------------+------------------------------------------+------------------+------+--------------+---------+-----------------+--------------+
| THREAD_ID | NAME | TYPE | PROCESSLIST_ID | PROCESSLIST_USER | PROCESSLIST_HOST | PROCESSLIST_DB | PROCESSLIST_COMMAND | PROCESSLIST_TIME | PROCESSLIST_STATE | PROCESSLIST_INFO | PARENT_THREAD_ID | ROLE | INSTRUMENTED | HISTORY | CONNECTION_TYPE | THREAD_OS_ID |
+-----------+----------------------------------------+------------+----------------+------------------+------------------+--------------------+---------------------+------------------+--------------------------------------------------------+------------------------------------------+------------------+------+--------------+---------+-----------------+--------------+
| 1 | thread/sql/main | BACKGROUND | NULL | NULL | NULL | NULL | NULL | 11142 | NULL | NULL | NULL | NULL | YES | YES | NULL | 142210 |
| 2 | thread/sql/thread_timer_notifier | BACKGROUND | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | 1 | NULL | YES | YES | NULL | 142211 |
| 3 | thread/innodb/io_ibuf_thread | BACKGROUND | NULL | NULL | NULL | NULL | NULL | NULL | NULL
| 19 | thread/innodb/srv_purge_thread | BACKGROUND | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | YES | YES | NULL | 142231 |
(一部割愛)
| 32 | thread/sql/slave_io | FOREGROUND | 7 | root | localhost | NULL | Connect | 11121 | Waiting for master to send event | NULL | 31 | NULL | YES | YES | NULL | 142769 |
| 34 | thread/sql/one_connection | FOREGROUND | 9 | root | localhost | NULL | Sleep | 9483 | NULL | NULL | NULL | NULL | YES | YES | Socket | 142721 |
| 38 | thread/sql/slave_sql | FOREGROUND | 13 | root | localhost | NULL | Connect | 159 | Slave has read all relay log; waiting for more updates | NULL | 37 | NULL | YES | YES | NULL | 152871 |
+-----------+----------------------------------------+------------+----------------+------------------+------------------+--------------------+---------------------+------------------+--------------------------------------------------------+------------------------------------------+------------------+------+--------------+---------+-----------------+--------------+
NAMEカラムは実行している処理を表し、thread/はIO_thread/はsql_thread/はユーザ接続スレッドです。
PROCESSLIST_*のカラムはSHOW PROCESSLISTに表示されている内容で、
SHOW PROCESSLISTのIdカラムはTHREAD_カラムではなく、PROCESSLIST_カラムと紐付いています。
INSTRUMENTEDカラムとHISTORYカラムはフォアグラウンドスレッドの場合、setup_テーブルのユーザー名とホスト名に一致していればYESとなり、
setup_テーブルはフォアグラウンドスレッドのモニタリングを有効にしたいユーザー名とホスト名を格納します。デフォルトではすべてのユーザ名とホスト名に対して有効です。
また、HISTORYカラムとCONNECTION_カラムはMySQL5.THREAD_カラムはMySQL5.
gdbを使用して特定のスレッドにアタッチする
gdbとはLinuxで使用されるデバッガです。さまざまな言語に対してプロセスの状態を見たり、
そして、threadsテーブルにMySQL5.THREAD_カラムの値を使用して特定のスレッドのみに対してアタッチすることもできます。たとえば、
sql_threadのOSIDを確認する
GTIDを使用したマスタースレーブ構成のMySQLを用意して、thread/のものがsql_THREAD_を取得します。
mysql> SELECT thread_os_id FROM performance_schema.threads WHERE name ='thread/sql/slave_sql'; +--------------+ | thread_os_id | +--------------+ | 142770 | +--------------+
IDが142770であることがわかりました。そのIDに対してgdbを実行します。
# gdb -p 142770
GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-80.el7
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Attaching to process 142770
warning: process 142770 is a cloned process
(一部割愛)
(gdb)
この状態でsql_SHOW SLAVE STATUSを確認してみます。
mysql> show slave status\G
(一部割愛)
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Seconds_Behind_Master: 0
Retrieved_Gtid_Set: b93409b3-d7d6-11e6-9ad9-fa163e3796a9:1-303
Executed_Gtid_Set: b93409b3-d7d6-11e6-9ad9-fa163e3796a9:1-4
このように、Slave_はYESでSeconds_は0のため問題ないように思えますが、Retrieved_は1-303と進んでもExecuted_は1-4と、STOP SLAVE SQL_コマンドで可能なため、
まとめ
今回は、SHOW PROCESSLISTの結果が返ってこなかったり、