Amazon RDS for MariaDBで実行中のクエリをkillする

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

MariaDBはMySQLの派生なので共通的に使える機能は多々ありますが、一部に相違があります。RDS for MariaDBもRDS for MySQLと同じように使えるところと違うところがあります。その一つがシステムストアドプロシージャです。RDS for MySQLで用意されているシステムストアドプロシージャは全てRDS for MariaDBで使うことができますが、さらに追加で以下2つのシステムストアドプロシージャが用意されています。

mysql.rds_set_external_master_gtidについてはRDS for MariaDBへのレプリケーション #reinventをご覧下さい。

今回はmysql.rds_kill_query_idを使って、Amazon RDS for MariaDBで実行中のクエリをkillしてみました!

やってみた

RDS for MariaDBで以下のストアドプロシージャを作成します。延々とループでスリープし続けるだけのものです。

mysql> delimiter $$
mysql> create procedure test_sleep(in x int)
    -> begin
    ->   loop
    ->     set x = 1;
    ->     select sleep(360);
    ->   end loop;
    -> end
    -> $$
Query OK, 0 rows affected (0.01 sec)

mysql> delimiter ;

このストアドプロシージャを実行します。

mysql> call test_sleep(1);

別のセッションでRDS for MariaDBに接続します。INFORMATION_SCHEMA.PROCESSLISTからQueryIDを確認します。

mysql> SELECT USER, HOST, COMMAND, TIME, STATE, INFO, QUERY_ID FROM INFORMATION_SCHEMA.PROCESSLIST ;
+----------+---------------------+---------+------+----------------------+---------------------------------------------------------------------------------------------+-----------+
| USER     | HOST                | COMMAND | TIME | STATE                | INFO                                                                                        | QUERY_ID  |
+----------+---------------------+---------+------+----------------------+---------------------------------------------------------------------------------------------+-----------+
| dbadmin  | 172.31.14.208:43392 | Query   |    2 | User sleep           | select sleep(360)                                                                           | 202624612 |
| dbadmin  | 172.31.14.208:43360 | Query   |    0 | Filling schema table | SELECT USER, HOST, COMMAND, TIME, STATE, INFO, QUERY_ID FROM INFORMATION_SCHEMA.PROCESSLIST | 202624613 |
| rdsadmin | localhost:14846     | Sleep   |    4 |                      | NULL                                                                                        | 202624605 |
+----------+---------------------+---------+------+----------------------+---------------------------------------------------------------------------------------------+-----------+
3 rows in set (0.00 sec)

今sleepしているQueryIDが202624612だということがわかりました。 RDS for MySQLではmysql.rds_kill_queryを使ってスレッドをkillする仕組みだったのですが、RDS for MariaDBではmysql.rds_kill_query_idを使ってクエリをkillします。

mysql> CALL mysql.rds_kill_query_id(202624612);
Query OK, 0 rows affected (0.01 sec)

確認、sleepしているQueryIDが202624612から202624623に変わってます。クエリがKillされた為に、次のループが実行されたからです。

mysql> SELECT USER, HOST, COMMAND, TIME, STATE, INFO, QUERY_ID FROM INFORMATION_SCHEMA.PROCESSLIST ;
+----------+---------------------+---------+------+----------------------+---------------------------------------------------------------------------------------------+-----------+
| USER     | HOST                | COMMAND | TIME | STATE                | INFO                                                                                        | QUERY_ID  |
+----------+---------------------+---------+------+----------------------+---------------------------------------------------------------------------------------------+-----------+
| dbadmin  | 172.31.14.208:43392 | Query   |    1 | User sleep           | select sleep(360)                                                                           | 202624623 |
| dbadmin  | 172.31.14.208:43360 | Query   |    0 | Filling schema table | SELECT USER, HOST, COMMAND, TIME, STATE, INFO, QUERY_ID FROM INFORMATION_SCHEMA.PROCESSLIST | 202624624 |
| rdsadmin | localhost:14846     | Sleep   |   13 |                      | NULL                                                                                        | 202624605 |
+----------+---------------------+---------+------+----------------------+---------------------------------------------------------------------------------------------+-----------+
3 rows in set (0.00 sec)

ちなみに、INFORMATION_SCHEMA.PROCESSLISTテーブルの構造もMySQLとMariaDBで大きく違います。

さいごに

プロセスのKillはMySQL、MariaDB共にmysql.rds_killで実行可能ですが、プロセスではなくクエリ(スレッド)単位でkillする場合には別のシステムストアドプロシージャを使わなくてはならないことに注意してください。