最近遇到老板一个任务,要求我删除我们生产数据库产生的流水表的历史的数据,总共大约有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;
这样写,每次删完都会输出还剩多少行,比较直观清楚