mongodb 备份压缩及清除指定日期前的数据

#!/usr/bin/bash

#define:Mongodb data backup regularly, delete data before the specified time

#date:2016-12-20

curr_dir=`pwd`
back_dir="/data/bak/mongodb_bak"
mongo_comm="/usr/local/mongodb/bin/mongo"
mongo_dump="/usr/local/mongodb/bin/mongodump"
mongo_data="
robot
engine
edi"

####rsync同步信息
rsync_user=***
rsync_passwd=****
echo "$rsync_passwd" > $curr_dir/rsync_passwd
passwd="$curr_dir/rsync_passwd"
rsync_server=****
rsync_module=mongo_com

#####mongodb各库需要保存的天数
#robot_delete_day=`date -d "25 days ago" +"%Y-%m-%d %H:%M:%S"`
robot_delete_day=`date -d "24 days ago" +"%Y-%m-%d"`
#engine_delete_day=`date -d "60 days ago" +"%Y-%m-%d %H:%M:%S"`
engine_delete_day=`date -d "13 days ago" +"%Y-%m-%d"`
#edi_delete_day=`date -d "16 days ago" +"%Y-%m-%d %H:%M:%S"`
edi_delete_day=`date -d "52 days ago" +"%Y-%m-%d"`
today=`date +"%Y%m%d"`
transferr_data_dir="/data/bak/mongo_data_back/$today"

id_dir="/data/bak/mongo_id/$today"
[[ -d $id_dir ]]|| mkdir -p $id_dir

logdir="/data/log/mongodb_delete_log"          #日志路径
log=$logdir/log"$today".log                            #日志文件 
is_font=1                                      #终端是否打印日志: 1打印 0不打印 
is_log=1                                       #是否记录日志: 1记录 0不记录
[[ -d $logdir ]]||mkdir -p $logdir             #确保日志目录存在


datef(){
    date "+%Y-%m-%d %H:%M:%S"
}

print_log(){
    if [[ $is_log -eq 1  ]];then
        [[ -d $logdir ]] || mkdir -p $logdir
        echo -e "[ $(datef) ] $1" >> $log
    fi
    if [[ $is_font -eq 1  ]];then
        echo -e "[ $(datef) ] $1"
    fi
}

####mongodb数据定期备份、压缩、同步至大数据存储
mongodb_back_regualy() {
for data in $mongo_data
do
    print_log "判断备份目录是否存在"
    [[ -d $back_dir/$today/$data ]]|| mkdir -p $back_dir/$today/$data
    while true
    do
        print_log "$data 开始备份"
        $mongo_dump -d $data  -o $back_dir/$today/$data
        if [[ $? -eq 0 ]];then
            print_log "$data 备份成功"
            break
        else
            print_log "$data 备份失败,继续"
        fi
    done
    cd $back_dir/$today/$data 
    while true
    do
        print_log "$data 开始压缩"
        [[ -d $transferr_data_dir ]]|| mkdir -p $transferr_data_dir
        tar -zcf $transferr_data_dir/"$data"_"$today".tar.gz "$data"
        if [[ $? -eq 0 ]];then
            print_log  "'$data'_'$today' 压缩成功"
            break
        else
            print_log "'$data'_'$today' 压缩失败,继续压缩"
        fi
    done
    while true
    do
        print_log "'$data'_'$today'.tar.gz 开始传输"
        #####rsync传输,传输目录变量待修改
        #rsync -avzr --password-file=$passwd $transferr_data_dir $rsync_user@$rsync_server::$rsync_module
        if [[ $? -eq 0 ]];then
            print_log "'$data'_'$today'.tar.gz 传输成功"
            break
        else
            print_log "'$data'_'$today'.tar.gz 传输失败"
        fi
    done

    
done
}


mongo_robot_delete() {
    print_log "开始统计robot库总条数"
    mongo_sql_sum='db.robotTask.find().count()'
    mongo_sql_sum_cal=`echo "$mongo_sql_sum"|$mongo_comm $data --shell|grep ^[0-9]`
    print_log "robot库总条数为------$mongo_sql_sum_cal-------"
    #print_log "开始统计robot库要删除的条数"    
    while true 
    do
        mongo_sql_count='db.robotTask.find({"startTime":{$lt:ISODate("'$robot_delete_day'")}}).count()'
        mongo_sql_count_cal=`echo "$mongo_sql_count"|$mongo_comm $data --shell`
        need_delete_total=`echo "$mongo_sql_count_cal"|grep ^[0-9]`
        if [[ $need_delete_total -le 0 ]];then
            print_log "robot 删除完毕"
            break
        else
            print_log "robot库需要删除的条数为 $need_delete_total --------------------------"
            mongo_data_delete='db.robotTask.remove({"startTime":{$lt:ISODate("'$robot_delete_day'")}})'
            echo "$mongo_data_delete" | $mongo_comm $data --shell
        fi
    done
}

mongo_engine_delete() {
    print_log "开始统计engine库总条数"
    mongo_sql_sum='db.rulemessage.find().count()'
    mongo_sql_sum_cal=`echo "$mongo_sql_sum"|$mongo_comm $data --shell|grep ^[0-9]`
    print_log "engine库总条数为--------$mongo_sql_sum_cal---------"
    #print_log "开始统计engine库要删除的条数"
    while true
    do
        mongo_sql_count='db.getCollection("rulemessage").find({"lastUpdated":{$lte:new Date("'$engine_delete_day'").getTime()}}).count()'
        mongo_sql_count_cal=`echo "$mongo_sql_count"|$mongo_comm $data --shell`
        need_delete_total=`echo "$mongo_sql_count_cal"|grep ^[0-9]`
        if [[ $need_delete_total -le 0 ]];then
            print_log "engine 删除完毕"
            break
        else
            print_log "engine库需要删除的条数为 $need_delete_total --------------------------"
            mongo_data_delete='db.rulemessage.remove({"lastUpdated":{$lte:new Date("'$engine_delete_day'").getTime()}})'
            echo "$mongo_data_delete" | $mongo_comm $data --shell
        fi
    done
}


mongo_edi_delete() {
    print_log "开始统计edi库总条数"
    mongo_sql_sum='db.action_log.find().count()'
    mongo_sql_sum_cal=`echo "$mongo_sql_sum"|$mongo_comm $data --shell |grep ^[0-9]`
    print_log "edi库总条数为-------$mongo_sql_sum_cal---------"
    #print_log "开始统计edi库要删除的条数"
    while true 
    do
        mongo_sql_count='db.action_log.find({"sendTime":{$lt:ISODate("'$edi_delete_day'")}}).count()'
        mongo_sql_count_cal=`echo "$mongo_sql_count"|$mongo_comm $data --shell`
        need_delete_total=`echo "$mongo_sql_count_cal"|grep ^[0-9]`
        if [[ $need_delete_total -le 0 ]];then
            print_log "edi 删除完毕"
            break
        else
            print_log "edi库需要删除的条数为 $need_delete_total --------------------------"
            mongo_data_delete='db.action_log.remove({"sendTime":{$lt:ISODate("'$edi_delete_day'")}})'
            echo "$mongo_data_delete" | $mongo_comm $data --shell
        fi
    done
}


data_delete(){
    cd $id_dir
    print_log "删除各库10天以前的id数据"
    find ./ -mtime +10 |xargs rm -rf 
    print_log "删除各库备份两天以前的数据"
    cd $back_dir
    find ./ -mtime +1 |xargs rm -rf
    print_log "删除各库压缩4天以前的数据"
    cd $transferr_data_dir
    find ./ -mtime +3 |xargs rm -rf 
        


}

mongodb_back_regualy

for data in $mongo_data
do
    case $data in
    robot)
        mongo_robot_delete
    ;;
    engine)
        mongo_engine_delete
    ;;
    edi)
        mongo_edi_delete
    ;;
    *)
        echo "$1"
        echo "Usage:集合不存在"
    ;;
    esac

done

data_delete

转载于:https://my.oschina.net/u/2343310/blog/813821

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值