MySQL5.7中实现定时执行某个SQL语句/存储过程,示例:定时清理MySQL进程死锁信息【测试成功】

艺帆风顺 发布于 2025-04-02 14 次阅读


一、需求背景    某项目中,一直出现数据库死锁的情况发生,无法从代码层面解决,此时没有办法只能通过定期清理死锁信息来尝试。二、查询死锁信息相关SQL

    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_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

      CALL kill_long_running_processes_yl();  #手工执行一次验证四、开启event事件任务

      show variables like '%sche%';

      set global event_scheduler=1;  #如果没有开启则手工开启

      五、创建事件任务

        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;  ##查看事件详细信息
          select * from information_schema.events where status = 'enabled';   ###查看所有开启的事件SELECT * FROM mysql.event;    ###使用mysql.event表来查看事件