mongodb定期清理与备份历史数据

问题

数据一直在快速增长,由于磁盘容量问题与历史数据的不经常使用,需要对历史数据进行定期备份到磁盘当中,另外还需要删除掉原来历史数据

1、历史数据备份

2、历史数据删除

方法

一、要求

1)能够备份出阶段性的数据

2)能够使用备份数据恢复到db中,继续提供查询操作

二、方案

1)使用mongobackup

网上常用方法,可好像对新版不可用

2)使用mongodump自写程序备份

第一步,编写清理历史数据的程序,定期清理指定数据库mydatabase各表指定时间点之前的数据

lang=js,lines=20,name=remove.js

function getLastDay(){
    var dt = new Date();
    dt.setDate(1);
    dt.setMonth(dt.getMonth()-4);
    return dt;
}

function tran_val(val){
    if(parseInt(val)<10){
        val="0" +val;
    }
    return val;
}

function stamp2str(paymentTime){
   var datenew = new Date(parseInt(paymentTime)); 
   var year=datenew.getFullYear();    
   var month=tran_val(datenew.getMonth()+1);
   var date=tran_val(datenew.getDate()); 
   var hour=tran_val(datenew.getHours());
   var minute=tran_val(datenew.getMinutes()); 
   var second=tran_val(datenew.getSeconds());
   var datestr=year+"-"+month+"-"+date+" "+hour+":"+minute+":"+second; 
   return datestr;
}

function toStamp(dateStr){
    var nowMs = Date.now();
    if(dateStr!=undefined){
        var date = new Date(dateStr); 
        nowMs=date.getTime();
    }
    return Math.ceil(nowMs/1000);
}

//删除两个collection中的history data
function start(db, days){
    var date = getLastDay();
    var stamp = toStamp();
    var ds = db.getMongo().getDB('mydatabase');
    if(db == 'my_table'){
        ds.my_table.remove({'start' : {"$lt" : stamp-days*86400}});
    }
}

第二步,先写程序定期备份每天的数据,并压缩保存起来

lang=bash,lines=25,name=crontab_remove.sh
#!/bin/bash
#增量备份

MONGO_HOME=/data1/mongodb-3.2.6
BACKUP_DIR=$MONGO_HOME/backup
NOW_DATE=$(date "+%Y-%m-%d %H:%M")
NOW_DAY=$(date "+%Y%m%d")
PRE_DAY=$(date +%Y%m%d -d "1 day ago")
NOW_DAY_STAMP=$(date -d $NOW_DAY +%s)
let PRE_DAY_STAMP=$NOW_DAY_STAMP-86400

TBS="my_table"
BK_DAYS=30
HOST=10.1.1.81
PORT=20000

for tb in $TBS
do

bk_out=$BACKUP_DIR/$tb/$PRE_DAY/

# 打开--gzip压缩,这样可以减少非常多的磁盘
$MONGO_HOME/bin/mongodump --host $HOST --port $PORT --gzip -d mydatabase -c $tb -q "{start:{\$gte: $PRE_DAY_STAMP, \$lt: $NOW_DAY_STAMP}}" -o $bk_out

#如果需要清理数据请打开
#$MONGO_HOME/bin/mongo --eval "load('$MONGO_HOME/remove.js'); start('$tb', $BK_DAYS)" >> $MONGO_HOME/logs/mongo.log

done

第三步,添加脚本到crontab中,每天晚上执行一次

# 执行备份与清除mongo数据
5 3 * * * /bin/bash  /data1/mongodb-3.2.6/crontab_remove.sh

至此完结!