1.为什么要清理数据?
硬盘的空间不会无限大,数据库的数据也不可能一直增长,为了保证系统的运行,需要让数据量保持在一个区间内可控。
2.清理什么样的数据?
清理数据的策略主要有两个方面:一个是数据库的数据,一个是硬盘数据(缓存数据也算)
3.如何清理?
清理数据的方法有很多,如果系统已经上线了,那么数据清理是作为该系统的一部分的。
最开始上线的时候,我们采用定期清理,只让系统保存最近一个月(或者一周)的数据,这时把数据清理单独作为一个模块,加入服务器的任务管理器,定期执行。
可是,随着系统不断扩大,数据越来越多,现在一天的数据量是原先的几十倍甚至上百倍,这个时候定期清理有两个弊端:
一是清理时间长,尤其是数据库的数据,执行sql的时间长,极易造成数据库事务未提交,占用数据库lock
Error querying database. Cause: java.sql.SQLException: Lock wait timeout exceeded; try restarting
二是删除的数据量大,容易超出数据库的限制max_binlog_cache_size
Multi-statement transaction required more than 'max_binlog_cache_size' bytes of storage
上面两个问题是可以通过数据库操作和修改配置解决的,但是我们不能保证以后的数据库量会不会更大,所以不能再用定期清理的策略,改用持续小批量清理,对缓存的利用,比如redis,通常用完即删除临时数据,参考这个思路,持续清理数据有两种方法:
一:跟redis的利用一样,在新增数据的模块也删除一些数据,加一条删一条,这样的思路代码实现起来最方便,改动最小,但是又增又删,反复操作数据库,也会增加性能上的开销。
二:数据的清理还是使用单独模块,缩短定时时间,这样每次删除的数据都不会很大,或者把数据切分,先不要一起删除,而是切分出来(例如100条记录一组)删除,保证数据量不会超出数据库相应配置的限制。