みなさんはMySQLを運用していくうえで、
KILL構文
MySQLでは、
KILL構文は、KILL CONNECTION <processlist_
、KILL QUERY <processlist_
で実施することができます。この両者の違いは
- KILL CONNECTIONは接続を終了する
- KILL QUERYは実行中のステートメントは終了するが接続自体は残る
となっています。
KILL QUERY
ではステートメントは終了されますがトランザクションは終了しません。そこで原則KILL CONNECTION
を利用するようにしましょう。
KILL <processlist_
と入力した場合はKILL CONNECTION
と同じ構文となります。processlist idはSHOW PROCESSLIST
を実行するか、SELECT SLEEP(100)
を10件流した状態でSHOW PROCESSLIST
を実行してKILL構文を流してみます。
mysql> SHOW PROCESSLIST; +----+------+-----------+------+---------+------+------------+--------------------+ | Id | User | Host | db | Command | Time | State | Info | +----+------+-----------+------+---------+------+------------+--------------------+ | 88 | root | localhost | NULL | Query | 6 | User sleep | select sleep (100) | | 89 | root | localhost | NULL | Query | 6 | User sleep | select sleep (100) | | 90 | root | localhost | NULL | Query | 6 | User sleep | select sleep (100) | | 91 | root | localhost | NULL | Query | 6 | User sleep | select sleep (100) | | 92 | root | localhost | NULL | Query | 6 | User sleep | select sleep (100) | | 93 | root | localhost | NULL | Query | 6 | User sleep | select sleep (100) | | 94 | root | localhost | NULL | Query | 6 | User sleep | select sleep (100) | | 95 | root | localhost | NULL | Query | 6 | User sleep | select sleep (100) | | 96 | root | localhost | NULL | Query | 6 | User sleep | select sleep (100) | | 97 | root | localhost | NULL | Query | 6 | User sleep | select sleep (100) | | 98 | root | localhost | NULL | Query | 0 | starting | SHOW PROCESSLIST | +----+------+-----------+------+---------+------+------------+--------------------+ 11 rows in set (0.00 sec) mysql> KILL QUERY 88; sleep (100) 1 Query OK, 0 rows affected (0.00 sec) mysql> SHOW PROCESSLIST; +----+------+-----------+------+---------+------+------------+--------------------+ | Id | User | Host | db | Command | Time | State | Info | +----+------+-----------+------+---------+------+------------+--------------------+ | 89 | root | localhost | NULL | Query | 20 | User sleep | select sleep (100) | | 90 | root | localhost | NULL | Query | 20 | User sleep | select sleep (100) | | 91 | root | localhost | NULL | Query | 20 | User sleep | select sleep (100) | | 92 | root | localhost | NULL | Query | 20 | User sleep | select sleep (100) | | 93 | root | localhost | NULL | Query | 20 | User sleep | select sleep (100) | | 94 | root | localhost | NULL | Query | 20 | User sleep | select sleep (100) | | 95 | root | localhost | NULL | Query | 20 | User sleep | select sleep (100) | | 96 | root | localhost | NULL | Query | 20 | User sleep | select sleep (100) | | 97 | root | localhost | NULL | Query | 20 | User sleep | select sleep (100) | | 98 | root | localhost | NULL | Query | 0 | starting | SHOW PROCESSLIST | +----+------+-----------+------+---------+------+------------+--------------------+ 10 rows in set (0.00 sec) mysql> KILL CONNECTION 90; Query OK, 0 rows affected (0.00 sec) mysql> ERROR 2013 (HY000) at line 1: Lost connection to MySQL server during query ERROR 2006 (HY000) at line 1: MySQL server has gone away ERROR 2006 (HY000) at line 1: MySQL server has gone away mysql> SHOW PROCESSLIST; +----+------+-----------+------+---------+------+------------+--------------------+ | Id | User | Host | db | Command | Time | State | Info | +----+------+-----------+------+---------+------+------------+--------------------+ | 89 | root | localhost | NULL | Query | 36 | User sleep | select sleep (100) | | 91 | root | localhost | NULL | Query | 36 | User sleep | select sleep (100) | | 92 | root | localhost | NULL | Query | 36 | User sleep | select sleep (100) | | 93 | root | localhost | NULL | Query | 36 | User sleep | select sleep (100) | | 94 | root | localhost | NULL | Query | 36 | User sleep | select sleep (100) | | 95 | root | localhost | NULL | Query | 36 | User sleep | select sleep (100) | | 96 | root | localhost | NULL | Query | 36 | User sleep | select sleep (100) | | 97 | root | localhost | NULL | Query | 36 | User sleep | select sleep (100) | | 98 | root | localhost | NULL | Query | 0 | starting | SHOW PROCESSLIST | +----+------+-----------+------+---------+------+------------+--------------------+ 9 rows in set (0.00 sec)
processlist_
InnoDBを利用している場合は、
複数のクエリをまとめて強制終了する場合は、KILL <process_
のprocesslist_
mysqladminコマンドを使ってクエリを強制終了する
mysqladminコマンドを使ってKILL構文を実施することも可能です。その場合はmysqladimin processlist
で現在の一覧を取得した後、mysqladmin kill <processlist_
で実施します。これはKILL CONNECTION
と同じ事になります。
$ /usr/local/mysql/bin/mysqladmin --defaults-file=/etc/my.cnf -u root -p processlist Enter password: +-----+------+-----------+----+---------+------+------------+--------------------+ | Id | User | Host | db | Command | Time | State | Info | +-----+------+-----------+----+---------+------+------------+--------------------+ | 135 | root | localhost | | Query | 9 | User sleep | select sleep (100) | | 136 | root | localhost | | Query | 9 | User sleep | select sleep (100) | | 137 | root | localhost | | Query | 9 | User sleep | select sleep (100) | | 138 | root | localhost | | Query | 0 | starting | show processlist | +-----+------+-----------+----+---------+------+------------+--------------------+ $ /usr/local/mysql/bin/mysqladmin --defaults-file=/etc/my.cnf --defaults-file=/etc/my.cnf -u root -p kill 136 Enter password:
pt-killを使ってみる
PERCONA社が公開しているPercona Toolkitの中に、
こちらは特定の条件をもとにクエリを強制終了したい時などに便利な多彩なオプションが用意されています。こちらを利用すれば、
ここでいくつかオプションを紹介します。
--print/--kill/--kill-query
--kill
の場合はKILL <processlist_
を実行します。--kill-query
とすることでKILL QUERY構文に変更することができます。また--print
とすると、
--busy-time
整数値を超えたクエリを強制終了します。下記例では、
pt-kill --defaults-file=/etc/my.cnf -u root -p '*****' --kill --busy-time 2 --victims=all
--match-command
SHOW PROCECSSLIST
を実施した際の、
--victims
oldest、
--match-info
正規表現に合った全てのクエリを強制終了します。たとえば、
pt-kill --defaults-file=/etc/my.cnf -u root -p '****' --kill --victims all --match-info "^(select|SELECT)"
--interval
killを実行する間隔を指定します。デフォルトは30秒になります。
--group-by
SHOW PROCESSLIST
の結果をgroup-byします。group-byされた結果をもとに、--query-count
などの条件をつけてクエリを絞り込むことができます。
$ pt-kill --defaults-file=/etc/my.cnf -u root -p '****' --print --interval=2 --group-by=Info --busy-time=3 --victims=all --query-count 3 # 2017-12-19T11:37:16 KILL 543 (Query 3 sec) select sleep (100) # 2017-12-19T11:37:16 KILL 542 (Query 3 sec) select sleep (100) # 2017-12-19T11:37:16 KILL 541 (Query 3 sec) select sleep (100) # 2017-12-19T11:37:16 KILL 540 (Query 3 sec) select sleep (100) # 2017-12-19T11:37:16 KILL 539 (Query 3 sec) select sleep (100) # 2017-12-19T11:37:16 KILL 538 (Query 3 sec) select sleep (100) # 2017-12-19T11:37:16 KILL 537 (Query 3 sec) select sleep (100) # 2017-12-19T11:37:16 KILL 536 (Query 3 sec) select sleep (100)
クエリ強制終了する時に気をつけたいこと
クエリを強制終了する際に、
まとめ
今回は、
クエリの強制終了は極力実施したくはないですが、