定期删除表数据

有几张表想做定期清理,删除过期数据;
有以下限制:
1、6.5的TTL因为是实验特性,领导不让用;
2、表是很早之前从MySQL迁移过来的,当时设计时没考虑用分区表,现在表很多地方都用到,领导怕重构分区表对各方面的影响,也不愿意做。

表的数据量基本在千万级,个别表是亿级的
有什么好的办法处理吗?

可以自己写个脚本按时间区间分批删除

delete + crontab 吗?大佬有木有更好的方法

把领导换了 :nerd_face:

定期清理没想到什么其他的好方法;你可以在脚本里面控制偏移量,比如每次删除一个小时的范围;低峰操作就可以了

1.升级版本ttl,2.做成分区表,3.写脚本定期跑,4.换领导。顺序也可以倒过来处理

delete删了,通过主键where条件控制范围,拆分多个sql跑,一次别删除太多,10万左右

不搞分区表,大表删除数据效率不高啊,定时批量删除搞吧

:thinking:我们是加的日终任务去处理的,可以通过kettle、程序这些方式去处理。

加个任务定时删了

关键你要清理的目的是什么?节省空间吗?那你定时删除也没用啊。。。先让sql变得快一点,那删除数据其实效果也一般,如果要删的数据很多的话(比保留的数据还要多),建议不如直接重新建表反插,顺便改造成分区表。。。

分区表,定期删分区

分区表,定期清理

假如我是领导:
一、6.5的TTL肯定不允许用,数据无价,何况是删数据呢;
二、分区表的确对没加时间的筛选会有影响,扫描量可能指数级上升,肯定也不能直接重构,除非有充足的测试,不过可以对特定业务表新建一套来替换原来未分区的;
三、大家说的做定时任务避开高峰期删除,虽然也会有log量较大浮动,磁盘不能及时收缩,但胜在简单风险低。

假如所有业务只用该表的近期数据,比如1周,1个月或者3个月,你可以尝试这个表新建一个空表,将近期数据逐步导入到该空表,然后停机窗口互换表名。 或者使用同步工具迁移。

新表与旧表互换后,旧表就是历史表,慢慢处理就行。

1,参考:https://docs.pingcap.com/zh/tidb/stable/dev-guide-delete-data#非事务批量删除
2,升级版本,使用TTL功能:ALTER TABLE t1 TTL = created_at + INTERVAL 1 MONTH;

如果不能使用分区表,那要删除数据,就似乎只能弄一个定时任务,最好是可以匹配出主键进行小批量的delete,部署到生产业务之前先测试delete的执行效率