mysql利用存储过程删除数据库历史的过期数据

最近遇到老板一个任务,要求我删除我们生产数据库产生的流水表的历史的数据,总共大约有2千万条数据。由于流水表正在使用,如果直接删除2千万条这么多的数据会造成卡死,甚至锁表,影响业务。我也考虑过新建一个表,把要保留的数据导入新表,然后再删除旧表,但是由于这个表正在使用,所以这个方案不太合适。后来就查找资料,想到用存储过程的方式,创建一个存储过程,每次删除1万条数据,每次删除都sleep 5秒的时间,这样数据库不会有太大的压力,不会造成锁表。

我决定采用存储过程的方式去删除,在mysql命令行执行,过程如下:

delimiter $$
DROP PROCEDURE IF EXISTS proc_batch_delete;
CREATE PROCEDURE proc_batch_delete()
BEGIN
    DECLARE tcount BIGINT;
    #这步骤是将要删除的历史数据行数保存在变量tcount中
    SELECT COUNT(0) INTO tcount FROM t_test WHERE 'Date' <= '20211231';
    SELECT tcount
    WHILE tcount>0 DO
    #每次删1万条
    DELETE FROM t_test WHERE 'Date' <= '20211231' LIMIT 10000;
    #每次删完tcount减去10000
    SET tcount=tcount-10000
    commit;
    #为防止锁表,睡眠5秒
    SELECT sleep(5);
    SELECT tcount;
    END WHILE;
END $$
delimiter ;
#调用存储过程
CALL proc_batch_delete;

这样写,每次删完都会输出还剩多少行,比较直观清楚

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值