需求:把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  -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=)
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=)
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 = '' # . 先备份前一天的数据 endDate = datetime.today().date()
startDate = endDate - timedelta(days=)
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) # . 在清理7天之前的数据
queryDate = datetime.today().date() - timedelta(days=)
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= cd $BACK_DIR # .判断文件个数
count=$(ls -l | grep "^-" | wc -l) delcount=$[$count - $SAVE_COUNT] # .是否进行删除
if [ $delcount -gt ];then
# 获取时间最久的文件名称
filename=$(ls -tr | head -n $delcount)
for each in ${filename[*]}
do
rm -rf $each
echo "deling file is" $each
done
fi

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

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

最新文章

  1. (42) Aeroo 模板实战
  2. Mybatis错误(一)org.apache.ibatis.exceptions.PersistenceException
  3. linq 实现查询字符串拼接 : And 和 OR 两种方式
  4. 在Ubuntu 14.04中安装最新版Eclipse
  5. jQuery 复合选择器的几个例子
  6. Python中 if __name__ == '__main__': 详解
  7. Razor与ASPX语法比较
  8. Python算法之---冒泡,选择,插入排序算法
  9. 51单片机C语言学习笔记8:单片机C51编程规范
  10. 如何使用for循环连续的实例化多个对象!
  11. 通过配置Windows 防火墙允许使用TCP/IP协议远程访问数据库
  12. module.exports与exports
  13. LeetCode(114): 二叉树展开为链表
  14. java泛型的理解
  15. NLP去特殊字符
  16. 火兰hillstone与fortigate之ipsec v.p.n连接实践
  17. Bootstrap(1) 概述与环境搭建
  18. 《倾国倾城》全套源代码:client+服务端+资源,歧视复制帖子
  19. select 语句的执行顺序
  20. org.apache.hadoop.yarn.exceptions.InvalidAuxServiceException: The auxService: mapreduce_shuffle do

热门文章

  1. APP 抓包-fiddler
  2. LeetCode_67. Add Binary
  3. Spring Cloud(7):事件驱动(Stream)分布式缓存(Redis)及消息队列(Kafka)
  4. 【Leetcode_easy】700. Search in a Binary Search Tree
  5. Infos - 通过搜索引擎获取信息与数据
  6. AWS 云上安全最佳实践
  7. socket 一个websocke对应一个socketclient对象
  8. 【数据库开发】is not allowed to connect to this MySQL server解决办法
  9. 20175316 盛茂淞 2018-2019-2 《Java程序设计》实验五 《网络安全与编程》 实验报告
  10. wireguard使用方法