06.09.2010 09:56Автоматически убиваем долгие запросы
Данный способ позволяет отслеживать все запросы которые длятся больше заданного количества секунд и "убивать" их.
Процедура `kill_run_aways` убивает все запросы, за исключением запущенных с правами супер пользователя, время выполнения которых превышает runtime секунд:
MySQL:
-
DELIMITER //
-
CREATE PROCEDURE `kill_run_aways` ( IN runtime TINYINT UNSIGNED )
-
LANGUAGE SQL
-
NOT DETERMINISTIC
-
BEGIN
-
DECLARE done INT DEFAULT 0;
-
DECLARE connid INT UNSIGNED;
-
DECLARE cur1 CURSOR FOR SELECT ID FROM information_schema.PROCESSLIST
-
WHERE CONCAT ("'", USER, "'@'", SUBSTRING_INDEX(HOST,':',1), "'") IN
-
( SELECT `USER_PRIVILEGES`.`GRANTEE` AS `GRANTEE` FROM `information_schema`.`USER_PRIVILEGES`
-
WHERE NOT(`USER_PRIVILEGES`.`GRANTEE` IN
-
(SELECT GRANTEE FROM `information_schema`.`USER_PRIVILEGES`
-
WHERE `USER_PRIVILEGES`.`PRIVILEGE_TYPE` = 'SUPER' GROUP BY `USER_PRIVILEGES`.`GRANTEE`)))
-
AND COMMAND ='Query'
-
AND TIME>= runtime;
-
-
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
-
-
OPEN cur1;
-
-
REPEAT
-
FETCH cur1 INTO connid;
-
IF NOT done THEN
-
KILL connid;
-
END IF;
-
UNTIL done END REPEAT;
-
CLOSE cur1;
-
END//
-
DELIMITER ;
Добавляем в расписание выполнение нашей функции каждые две секунды с максимальным временем запроса в две секунды:
MySQL:
-
SET GLOBAL event_scheduler=ON;
-
-
CREATE EVENT IF NOT EXISTS `kill_run_aways`
-
ON SCHEDULE EVERY 2 SECOND
-
ON COMPLETION PRESERVE ENABLE
-
DO CALL kill_run_aways(2);
Данный метод работает начиная с версии MySQL 5.1