点击上方“IT那活儿”公众号--专注于企业全栈运维技术分享,不管IT什么活儿,干就完了!!!
巡检发现雅典娜大屏xxx.xxx.110.72/78MySQL存在主从延迟的情况。经排查发现是由于从库执行主从复制delete语句阻塞导致,进一步了解业数据库使用情况,业务数据用于大屏展示,数据保留近7天,表较大(两千万级别的表),且表未创建索引。
根据业务使用场景分析,并给出创建索引,分批删除数据,根据创建时间设计分区表优化建议,考虑到改成分区表业务改动较大,使用创建索引,分批删除优化后,延迟问题解决。
2.1 问题定位


delete from app_big_screen_kpi_data_day where create_time < '20240506'




2.2 问题处理
1)创建索引
2)分批删除
DELIMITER $
-- PROCEDURE 如存在先删除
DROP PROCEDURE IF EXISTS bigscreen.delete_large_data $
-- 分批删除
CREATE DEFINER=`bigscreen`@`%` PROCEDURE `bigscreen`.`delete_large_data`(in `p_table_conditions` varchar(255))
BEGIN
DECLARE limit_value INT;
SET limit_value = 5000; -- 每次删除数据条数
SET @stmt_count = NULL;
SET @stmt = NULL;
SET @stmt_count = CONCAT('SELECT count(*) INTO @row_count FROM ', p_table_conditions);
SET @stmt = CONCAT('DELETE FROM ', p_table_conditions, ' LIMIT ', limit_value);
PREPARE s_count FROM @stmt_count;
PREPARE s_del FROM @stmt;
EXECUTE s_count;
select @row_count;
WHILE @row_count > 0 DO
EXECUTE s_del;
COMMIT; -- 提交
SET @row_count = @row_count - limit_value; -- 更新数据总条数
END WHILE;
DEALLOCATE PREPARE s_count; -- 释放游标
DEALLOCATE PREPARE s_del; -- 释放游标
END $
DELIMITER ;
-- app_big_screen_kpi_data_day 清理超过7天数据
call bigscreen.delete_large_data('screendata.app_big_screen_kpi_data_day where create_time < STR_TO_DATE("20240603", "%Y%m%d")');
-- sys_lx_msg_result 清理超过30天数据
call bigscreen.delete_large_data('screendata.sys_lx_msg_result where stat_date < date_format(DATE_ADD( NOW(), INTERVAL -30 DAY ), "%Y%m%d")');
3)验证


本文作者:符 海(上海新炬中北团队)
本文来源:“IT那活儿”公众号

文章转载自IT那活儿,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




