この記事は公開されてから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で大きく違います。
- MySQL :: MySQL 5.7 Reference Manual :: 20.16 The INFORMATION_SCHEMA PROCESSLIST Table
- Information Schema PROCESSLIST Table - MariaDB Knowledge Base
さいごに
プロセスのKillはMySQL、MariaDB共にmysql.rds_killで実行可能ですが、プロセスではなくクエリ(スレッド)単位でkillする場合には別のシステムストアドプロシージャを使わなくてはならないことに注意してください。