|
|
51CTO旗下网站
|
|
移动端

MySQL数据库小项目日志表定期删除实现方案

最近需要对一个对数据表做清理的操作,这个环境是一个线上业务,因为各种原因,表中的数据比较臃肿,而磁盘空间又比较小,所以经常导致磁盘空间爆满,和业务确认后对数据做定时删除,实现方式如下,以下针对小项目。

作者:波波说运维来源:今日头条|2019-12-26 07:25

最近需要对一个对数据表做清理的操作,这个环境是一个线上业务,因为各种原因,表中的数据比较臃肿,而磁盘空间又比较小,所以经常导致磁盘空间爆满,和业务确认后对数据做定时删除,实现方式如下,以下针对小项目。

1. 开启事件调度器

  1. set global event_schedulerON;             show variables like '%event_scheduler%';#my.cnf增加参数event_scheduler = on 

2. 创建日志删除记录表

  1. CREATE TABLE IF NOT EXISTS mq_log( name VARCHAR(400) NOT NULL COMMENT '删除信息', row INT COMMENT '删除行数', del_time TIMESTAMP COMMENT '删除时间') COMMENT = '日志删除记录表'

3. 创建日志删除存储过程

这里主要用了异常记录、影响行数记录、事务处理几个特点

  1. drop procedure if exists del_mq_log;DELIMITER // create procedure del_mq_log()BEGIN    DECLARE  affect_rows INT;       DECLARE  affect_rows2 INT;       DECLARE  affect_rows3 INT;       declare v_commit int default 2; -- 定义事务用,1为正常,-10为失败    declare msg text;-- 记录错误信息    -- 异常的时候msg捕获报错信息    declare continue handler for sqlexception     begin get diagnostics condition 1  msg = message_text;set v_commit = -10; end ;        start transaction;    -- 设置事务    delete from lcp_mq_record where last_update_date < DATE_SUB(CURDATE(),INTERVAL 30 DAY);    select ROW_COUNT() into @affect_rows;    delete from lcp_dd_service_record where last_update_date < DATE_SUB(CURDATE(),INTERVAL 30 DAY);    select ROW_COUNT() into @affect_rows2;    delete from lcp_api_service_record where last_update_date < DATE_SUB(CURDATE(),INTERVAL 30 DAY);    select ROW_COUNT() into @affect_rows3;    insert into mq_log values('删除lcp_mq_record成功',@affect_rows,now()),('删除lcp_dd_service_record成功',@affect_rows2,now()),('删除lcp_api_service_record 成功',@affect_rows3,now()); -- 记录删除情况    -- 异常回滚且记录日志    if v_commit = -10 then           ROLLBACK;        insert into mq_log values(msg,0,now());    end if ;END//DELIMITER ; 

mysql数据库小项目日志表定期删除实现方案

4. 创建一个每天凌晨1点执行存储过程的定时任务

  1. DROP event IF EXISTS e_del_mqlog;     CREATE EVENT e_del_mqlog     ON SCHEDULE   EVERY 1 DAY STARTS DATE_ADD(DATE_ADD(CURDATE(), INTERVAL 1 DAY), INTERVAL 1 HOUR)  DO call del_mq_log(); 

5. 第一次删除需做回收

  1. alter table lcp_mq_record engine=innodb;alter table lcp_dd_service_record engine=innodb;alter table lcp_api_service_record engine=innodb

mysql数据库小项目日志表定期删除实现方案

【编辑推荐】

  1. MySQL索引八大法则之上篇
  2. 详解Oracle数据库LRU算法:LRU链、脏块与脏LRU链
  3. 面试官:MySQL的可重复读级别能解决幻读问题吗?
  4. 一文搞懂各种数据库SQL执行计划:MySQL、Oracle等
  5. 一文总结MySQL数据库事件--定时任务实现方式
【责任编辑:赵宁宁 TEL:(010)68476606】

点赞 0
分享:
大家都在看
猜你喜欢

订阅专栏+更多

一步到位玩儿透Ansible

一步到位玩儿透Ansible

Ansible
共17章 | 骏马金龙1

52人订阅学习

云架构师修炼手册

云架构师修炼手册

云架构师的必备技能
共3章 | Allen在路上

24人订阅学习

Devops之监控神器Prometheus

Devops之监控神器Prometheus

监控主流
共22章 | 小罗ge11

172人订阅学习

视频课程+更多

强哥带你学习docker

强哥带你学习docker

讲师:周玉强7991人学习过

华为下一代防火墙NGFW技术视频课程

华为下一代防火墙NGFW技术视频课程

讲师:谢斌26921人学习过

强哥带你精通OpenStack私有云

强哥带你精通OpenStack私有云

讲师:周玉强49989人学习过

读 书 +更多

Java网络编程精解

本书结合大量的典型实例,详细介绍了用Java来编写网络应用程序的技术。本书的范例都基于最新的JDK 1.5版本,书中内容包括:Java网络编程的...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊

51CTO服务号

51CTO官微