06.09.2010 09:56Автоматически убиваем долгие запросы

Данный способ позволяет отслеживать все запросы которые длятся больше заданного количества секунд и "убивать" их.

Процедура `kill_run_aways` убивает все запросы, за исключением запущенных с правами супер пользователя, время выполнения которых превышает runtime секунд:

MySQL:
  1. DELIMITER //
  2. CREATE PROCEDURE `kill_run_aways` ( IN runtime TINYINT UNSIGNED )
  3. LANGUAGE SQL
  4. NOT DETERMINISTIC
  5. BEGIN
  6. DECLARE done INT DEFAULT 0;
  7. DECLARE connid INT UNSIGNED;
  8. DECLARE cur1 CURSOR FOR SELECT ID FROM information_schema.PROCESSLIST
  9. WHERE CONCAT ("'", USER, "'@'", SUBSTRING_INDEX(HOST,':',1), "'") IN
  10. ( SELECT `USER_PRIVILEGES`.`GRANTEE` AS `GRANTEE` FROM `information_schema`.`USER_PRIVILEGES`
  11. WHERE NOT(`USER_PRIVILEGES`.`GRANTEE` IN
  12. (SELECT GRANTEE FROM `information_schema`.`USER_PRIVILEGES`
  13. WHERE `USER_PRIVILEGES`.`PRIVILEGE_TYPE` = 'SUPER' GROUP BY `USER_PRIVILEGES`.`GRANTEE`)))
  14. AND COMMAND ='Query'
  15. AND TIME>= runtime;
  16.  
  17. DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
  18.  
  19. OPEN cur1;
  20.  
  21. REPEAT
  22. FETCH cur1 INTO connid;
  23. IF NOT done THEN
  24. KILL connid;
  25. END IF;
  26. UNTIL done END REPEAT;
  27. CLOSE cur1;
  28. END//
  29. DELIMITER ;

Добавляем в расписание выполнение нашей функции каждые две секунды с максимальным временем запроса в две секунды:

MySQL:
  1. SET GLOBAL event_scheduler=ON;
  2.  
  3. CREATE EVENT IF NOT EXISTS `kill_run_aways`
  4. ON SCHEDULE EVERY 2 SECOND
  5. ON COMPLETION PRESERVE ENABLE
  6. DO CALL kill_run_aways(2);

Данный метод работает начиная с версии MySQL 5.1

Похожие записи:

Комментариев нет | Рубрики: MySQL, tips

Post Your Comment

Немного о себе




Комментарий

*