長時間実行されているSELECTを強制終了するストアドプロシージャを次に示します
DELIMITER $$
DROP PROCEDURE IF EXISTS `test`.`Kill_Long_Running_Selects` $$
CREATE PROCEDURE `test`.`Kill_Long_Running_Selects` (time_limit INT,display INT)
BEGIN
DECLARE ndx,lastndx INT;
DROP TABLE IF EXISTS test.LongRunningSelects;
CREATE TABLE test.LongRunningSelects
(
id INT NOT NULL AUTO_INCREMENT,
idtokill BIGINT,
PRIMARY KEY (id)
) ENGINE=MEMORY;
INSERT INTO test.LongRunningSelects (idtokill)
SELECT id FROM information_schema.processlist
WHERE user<>'system user' AND info regexp '^SELECT' AND time > time_limit;
SELECT COUNT(1) INTO lastndx FROM test.LongRunningSelects;
SET ndx = 0;
WHILE ndx < lastndx DO
SET ndx = ndx + 1;
SELECT idtokill INTO @kill_id
FROM test.LongRunningSelects WHERE id = ndx;
CALL mysql.rds_kill(@kill_id);
END WHILE;
IF lastndx > 0 THEN
IF display = 1 THEN
SELECT GROUP_CONCAT(idtokill) INTO @idlist FROM test.LongRunningSelects;
SELECT @idlist IDs_KIlled;
SELECT CONCAT('Processes Killed : ',lastndx) Kill_Long_Running_Selects;
END IF;
END IF;
END $$
30秒より長く実行しているSELECTを強制終了するには、これを実行します
CALL test.Kill_Long_Running_Selects(30,0);
強制終了されている接続を確認する場合は、これを実行します
CALL test.Kill_Long_Running_Selects(30,1);
おそらく、このストアドプロシージャを毎分呼び出すMySQLイベントを作成できます。
AmazonがEVENT権限を許可しない場合は、EC2サーバーで外部シェルスクリプトを作成してDBに接続し、ストアドプロシージャを実行する必要があります。そのシェルスクリプトはcrontabに入れることができます。
AmazonでPROCESSおよびSUPER権限を許可されていない場合、DBをRDSからMySQLを実行している別のEC2インスタンスに移動して、これを実行する必要がある場合があります。その後、Amazonのホスティング制限なしでMySQLイベントを作成できます。