三种Mongodb数据清理方案
在数据库的日常运维和性能优化中,数据库表数据的生命周期管理是一个常见且重要的工作场景。Mongodb的数据生命周期管理可利用自身的功能特性实现,下面将对几种数据清理方案进行描述。

一、TTL索引
TTL(timetolive)索引是MongoDB中一种特殊的索引,是一种在除_id外的时间字段上创建的单列索引(复合索引无法拥有TTL属性)。在创建TTL索引后,后台线程将根据字段值再指定的秒数后自动删除数据。例如:db.Record.createIndex({“timestamp”:1},{expireAfterSeconds:2678400,background:true})表示根据timestamp字段时间的31天后过期删除数据。如果字段值是一个数组,则以数组的最小时间为准。如果要修改TTL索引的数据过期时间,无需重建索引,可通过如下命令修改:db.runCommand({collMod:”test”,index:{name:”lastModifiedDate_1″,expireAfterSeconds:60}})
注意在复制集架构中,如果集合数据量较大,并且修改减少数据保留时间,命令执行完成后,后台线程会缓慢删除数据,此过程中会产生大量的oplog,需关注系统配置的oplogsize,确保有足够的空间存放Oplog,以便于在存在延迟从节点或者从节点IO性能较差的情况下,不至于出现主节点的oplog被覆盖丢失从而引起同步异常的情况。并且在大量数据被删除后,会出现集合碎片,类似oracle的高水位,空间再集合中可重用,但是不会释放给操作系统,需进行compact操作,此操作可导致库级锁,可以在进行主从切换的情况下,滚动在从节点操作。
二、capped集合
capped集合是mongodb中的一种特殊的集合,其大小是固定的,数据写入是有序的,当存储的数据超过大小限制时,将采取先入先出的原则,自动清理旧数据。在限制集合大小的同时,capped集合还可以限制文档数量,当存储数据未达到文档数量限制但是达到大小限制,也会自动清理数据。oplog.rs就是一个固定集合。由于capped集合的大小是固定的,数据是有序的,所以其插入和查询的性能都优于普通集合。例如:db.createCollection(“log”,{capped:true,size:10737418240})表示创建10GB的固定集合,db.createCollection(“log”,{capped:true,size:10737418240,max:50000000})表示创建最大10GB,且不超过5千万行的固定集合。注意:固定集合无法手工删除数据,且无法进行分片。
三、通过_id删除陈旧历史数据
在一个集合中,若存在时间字段时,可通过时间字段定位并删除历史数据,但是如果没有时间字段,怎么定位历史数据呢?在mongodb中,每个集合会默认创建一个_id字段,并且该字段上默认创建了主键索引,该字段类型为ObjectId。ObjectId是一个12字节的BSON类型字符串。按照字节顺序,依次代表:4字节:UNIX时间戳3字节:表示运行MongoDB的机器2字节:表示生成此_id的进程3字节:由一个随机数开始的计数器生成的值通过js代码将时间值转换为objectid,按时间范围清理历史数据。利用objectid的有序性和唯一索引过滤,快速清理目标数据,避免清理条件字段无索引时产生低效的全表扫描。详细方法:1.获取时间条件时间范围转换为objectidObjectId(Math.floor((newDate(2019/8/9))/1000).toString(16)+”0000000000000000″)ObjectId(“5b6b13800000000000000000″)2.将转换后的时间与objectid比较,按照objectid删除varobjIdMin=ObjectId(Math.floor((newDate(2019/8/9))/1000).toString(16)+”0000000000000000″)varobjIdMax=ObjectId(Math.floor((newDate(2018/9/11))/1000).toString(16)+”0000000000000000”)db.test.remove({_id:{$gt:objIdMin,$lt:objIdMax}})
原创文章,作者:小编小本本,如若转载,请注明出处:https://www.benjiyun.com/yunzhujiyunwei/vps-yunwei/5874.html
