一、需求背景 某项目中,一直出现数据库死锁的情况发生,无法从代码层面解决,此时没有办法只能通过定期清理死锁信息来尝试。二、查询死锁信息相关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_trx
SELECT * from information_schema.`PROCESSLIST` WHERE Time > 1000
AND USER = 'yl' ORDER BY TIME desc;
kill 61
SHOW 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_trx
CREATE 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 ON
COMPLETION PRESERVE DISABLE;
alter event LOCK_monitor ON
COMPLETION PRESERVE ENABLE; ###开启事件任务
SHOW EVENTS; #查看全部事件
SELECT * FROM INFORMATION_SCHEMA.EVENTS; ##查看事件详细信息
MySQL5.7中实现定时执行某个SQL语句/存储过程,示例:定时清理MySQL进程死锁信息【测试成功】
发布于 2025-04-02 14 次阅读