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
の結果が返ってこなかったり、