一、需求背景 某项目中,一直出现数据库死锁的情况发生,无法从代码层面解决,此时没有办法只能通过定期清理死锁信息来尝试。二、查询死锁信息相关SQL 三、创建存储过程函数 CALL kill_long_running_processes_yl(); #手工执行一次验证四、开启event事件任务 show variables like '%sche%'; set global event_scheduler=1; #如果没有开启则手工开启 五、创建事件任务 六、开启/关闭事件任务 七、查询事件任务SHOW OPEN TABLES WHERE In_use > 0;SELECT * FROM information_schema.innodb_trxSELECT * from information_schema.`PROCESSLIST` WHERE Time > 1000AND USER = 'yl' ORDER BY TIME desc;kill 61SHOW GLOBAL VARIABLES LIKE 'innodb_lock_wait_timeout';SET GLOBAL innodb_lock_wait_timeout = 150;commit;SHOW GLOBAL VARIABLES LIKE 'innodb_lock_wait_timeout';SET GLOBAL max_connections = 2000;SHOW VARIABLES LIKE 'max_connections';SHOW STATUS LIKE 'Threads_connected';SELECT * FROM information_schema.innodb_trxCREATE DEFINER=`yl`@`%` PROCEDURE `kill_long_running_processes_yl`()BEGIN DECLARE done INT DEFAULT FALSE; DECLARE process_id INT; DECLARE cur CURSOR FOR SELECT id FROM information_schema.PROCESSLIST WHERE Time > 1000 AND USER = 'yl'; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; OPEN cur; read_loop: LOOP FETCH cur INTO process_id; IF done THEN LEAVE read_loop; END IF; -- 在这里添加额外的检查或日志 (可选) -- SELECT 'Killing process:', process_id; KILL process_id; END LOOP; CLOSE cur;END
create event if not exists LOCK_monitor on schedule every 600 second on completion preserve do call kill_long_running_processes_yl(); alter event LOCK_monitor ONCOMPLETION PRESERVE DISABLE; alter event LOCK_monitor ONCOMPLETION PRESERVE ENABLE; ###开启事件任务SHOW EVENTS; #查看全部事件SELECT * FROM INFORMATION_SCHEMA.EVENTS; ##查看事件详细信息

MySQL5.7中实现定时执行某个SQL语句/存储过程,示例:定时清理MySQL进程死锁信息【测试成功】
发布于 2025-04-02 42 次阅读
