mongodb备份每一天的数据

需求:把mongodb里面存储6个月的数据备份到本地,一天天的来备份,方便对备份管理。然后mongo保留一周的数据(优化查询速度,可以用mongo的ttl来实现,但是我的业务场景不太适合用ttl索引)。然后crontab备份每天的数据,控制备份的数据只在6个月的范围之内。

第一步:先把mongo里面6个月的数据一天天的备份出来(人工操作会累死,写个脚本)

import os
from datetime import datetime, timedelta

username = '账号'
password = '密码'
nowDate = datetime.today().date()
lastDate = nowDate - timedelta(days=185)

while nowDate != lastDate:
startDate, endDate = lastDate, lastDate + timedelta(days=1)
dirName = startDate.strftime("%Y-%m-%d")

startDate = startDate.strftime("%Y-%m-%d %H:%M:%S")
endDate = endDate.strftime("%Y-%m-%d %H:%M:%S")

lastDate += timedelta(days=1)
command = 'mongodump -d pusher -c records -q \'{\"$and\":[{\"create_time\":{\"$lt\":"%s"}},{\"create_time\":{\"$gt\":"%s"}}]}\' ' \
'--gzip --archive=/home/deploy/mongobackup/"%s".archive -u "%s" -p "%s"' %(endDate, startDate, dirName, username, password)

os.system(command)

备份完之后你的目录下面应该是这样子的

 

可以用以下命令来测试下,测试图我不上了

(1)先登录mongo, 在use相应的数据库

mongo --port 27017 -u "" -p "" --authenticationDatabase ""
use "your db"

(2)查询某一天的数据

db.dbname.find({"$and":[{"create_time":{"$gt":"2019-01-21 00:00:00"}},{"create_time":{"$lt":"2019-01-22 00:00:00"}}]})

或者直接统计:db.dbname.count({"$and":[{"create_time":{"$gt":"2019-01-21 00:00:00"}},{"create_time":{"$lt":"2019-01-22 00:00:00"}}]})

(3)删除这一天的数据

db.dbname.remove({"$and":[{"create_time":{"$gt":"2019-01-21 00:00:00"}},{"create_time":{"$lt":"2019-01-22 00:00:00"}}]})

(4)恢复某一天的数据

mongorestore -u "" -p "" --authenticationDatabase dbname --nsInclude db.collection  --gzip --archive=2019-01-21/

# db.collection  --》 数据库.表名
# 这里使用了--gzip压缩, 不压缩文件太大了, 不过压缩的话会消耗一定的性能,看个人需要

(5)测试一下数据有没有恢复(重复第二步的命令)

db.dbname.find({"$and":[{"create_time":{"$gt":"2019-01-21 00:00:00"}},{"create_time":{"$lt":"2019-01-22 00:00:00"}}]})

或者直接统计:db.dbname.count({"$and":[{"create_time":{"$gt":"2019-01-21 00:00:00"}},{"create_time":{"$lt":"2019-01-22 00:00:00"}}]})

 

第二步:写每天备份的脚本,第一步脚本一般只跑一次,这个脚本才是用来维护的。

import os
from datetime import datetime, timedelta

username = ''
password = ''

endDate = datetime.today().date()
startDate = endDate - timedelta(days=1)
dirName = startDate.strftime("%Y-%m-%d")

startDate = startDate.strftime("%Y-%m-%d %H:%M:%S")
endDate = endDate.strftime("%Y-%m-%d %H:%M:%S")

command = 'mongodump -d db -c collection -q \'{\"$and\":[{\"create_time\":{\"$lt\":"%s"}},{\"create_time\":{\"$gt\":"%s"}}]}\'   ' \
          '-o  "%s" -u "%s" -p "%s"' %(endDate, startDate, dirName, username, password)

os.system(command)

 

第三步:确保备份数据的可用性之后,我们就开始删除mongo里面的数据了,只保留最近一个星期的

 这一步可以写成脚本,contrab去每天执行

import os
from datetime import datetime, timedelta

username = ''
password = ''

queryDate = datetime.today().date() - timedelta(days=7)
queryDate = queryDate.strftime("%Y-%m-%d %H:%M:%S")

command = 'mongo dbname -u"%s" -p"%s" --eval \'db.records.remove({\"create_time\":{\"$lt\":"%s"}})\'' %(username, password, queryDate)

os.system(command)

 

总结:

1.先把第一个脚本运行一遍,生成每一天的备份文件。

2.把第二,第三个脚本整合在一起,用contrab每天执行。(mongoBackupByday.py)

import os
from datetime import datetime, timedelta

username = ''
password = ''

# 1. 先备份前一天的数据

endDate = datetime.today().date()
startDate = endDate - timedelta(days=1)
dirName = startDate.strftime("%Y-%m-%d")

startDate = startDate.strftime("%Y-%m-%d %H:%M:%S")
endDate = endDate.strftime("%Y-%m-%d %H:%M:%S")

command = 'mongodump -d dbname -c collection -q \'{\"$and\":[{\"create_time\":{\"$lt\":"%s"}},{\"create_time\":{\"$gt\":"%s"}}]}\'   ' \
          '-o  "%s" -u "%s" -p "%s"' %(endDate, startDate, dirName, username, password)

os.system(command)


# 2. 在清理7天之前的数据
queryDate = datetime.today().date() - timedelta(days=7)
queryDate = queryDate.strftime("%Y-%m-%d %H:%M:%S")
command = 'mongo dbname -u"%s" -p"%s" --eval \'db.collection.remove({\"create_time\":{\"$lt\":"%s"}})\'' %(username, password, queryDate)

os.system(command)

设置crontab

crontab -e

 

还有一个任务就是,控制备份文件的数量,contrab job不断备份,文件夹下面还是只保留6个月的备份文件

#!/bin/bash

# 定义要检测的文件夹
BACK_DIR=/home/deploy/mongobackup

# 设置要保存的文件个数
SAVE_COUNT=185

cd $BACK_DIR

# 1.判断文件个数
count=$(ls -l | grep "^-" | wc -l)

delcount=$[$count - $SAVE_COUNT]

# 2.是否进行删除
if [ $delcount -gt 0 ];then
    # 获取时间最久的文件名称
    filename=$(ls -tr | head -n $delcount)
    for each in ${filename[*]}
    do
        rm -rf $each
        echo "deling file is" $each
    done
fi

 

也加到进去crontab 里面,每周一次

 

希望这篇文章可以帮助到有需要的朋友~

转载于:https://www.cnblogs.com/Xuuuuuu/p/11193689.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值