业务场景描述:
某产品存在很多日志表,这些日志表保留太长时间没有什么现实意义。所以要定期去删除。
数据库设计时把各种日志表表名(table_name)都存在log_master表中。
删除日志时,先从log_master中取出日志表的表名,然后动态删除各个日志表的数据。
解决方案:写一个存储过程,在mysql端设计一个定时任务,每小时执行一次该存储过程。
存储过程:
DROP PROCEDURE IF EXISTS del_log_proc;
CREATE PROCEDURE del_log_proc()
BEGIN
DECLARE tableName VARCHAR(100);
DECLARE dosql VARCHAR(100);
// 声明游标退出循环的变量
DECLARE done INT DEFAULT FALSE;
// 声明游标
DECLARE curlogMaster CURSOR FOR SELECT table_name FROM log_master;
// 设定游标退出循环的条件
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
// 打开游标
OPEN curlogMaster;
// 循环获取日志表表名
read_loop: LOOP
FETCH curlogMaster INTO tableName;
IF done THEN
LEAVE read_loop;
END IF;
// 执行动态sql
SET dosql= CONCAT('DELETE FROM ', tableName, ' WHERE create_time < DATE_SUB(NOW(), INTERVAL 1 DAY)');
SET @sqlstr=dosql;
PREPARE stmt from @sqlstr;
EXECUTE stmt;
deallocate prepare stmt;
END LOOP;
// 关闭游标
CLOSE curlogMaster;
END
定时任务:
SET GLOBAL event_scheduler = ON;
DROP EVENT IF EXISTS Del_log_1h;
CREATE EVENT Del_log_1h
ON SCHEDULE EVERY 1 HOUR STARTS '2017-03-15 21:00:00'
ON COMPLETION PRESERVE
ENABLE
DO
call del_log_proc();