需求:把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, timedeltausername = ''
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, timedeltausername = ''
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, timedeltausername = ''
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=185cd $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[*]}dorm -rf $eachecho "deling file is" $eachdone
fi

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

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

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

mongodb备份每一天的数据相关推荐

  1. MongoDB数据备份还原,及docker中MongoDB备份还原

    一: MongoDB数据备份 在Mongodb中我们使用mongodump命令来备份MongoDB数据.该命令可以导出所有数据到指定目录中. mongodump命令可以通过参数指定导出的数据量级转存的 ...

  2. 拆分命令_在MongoDB分片集群中拆分数据块chunks

    MongoDB Manual (Version 4.2)> Sharding > Data Partitioning with Chunks > Split Chunks in a ...

  3. 【MongoDB】MongoDB备份方法

    2019独角兽企业重金招聘Python工程师标准>>> MongoDB备份方法 On this page Back Up with MongoDB Cloud Manager or ...

  4. mongodb 备份压缩_MongoDB 如何实现备份压缩

    背景及原理 数据库的备份是灾难恢复的最后一道屏障,不管什么类型的数据库都需要设置数据库备份,MongoDB也不例外.MongoDB 3.0 后 ,数据库可以采用Wiredtiger存储引擎后(3.2 ...

  5. mongodb 备份mysql_MongoDB备份与恢复

    本章将介绍如何在MongoDB中创建备份,以及如何恢复数据. 导出转储MongoDB数据 要在MongoDB中创建数据库备份,应该使用 mongodump 命令. 此命令将导出转储服务器的整个数据到转 ...

  6. mongodb备份oplog_MongoDB 备份(mongodump)与恢复(mongorestore)

    MongoDB 备份(mongodump)与恢复(mongorestore) MongoDB数据备份 在Mongodb中我们使用mongodump命令来备份MongoDB数据.该命令可以导出所有数据到 ...

  7. MongoDB,还有一个角度看数据

    传智-玄痛(传智播客北京校区C/C++学院技术指导老师) MongoDB的起源 几年前 10gen 公司做了 SaaS 方面的研发,由于公司一个 MongoDB 产品存储接口的易用性,用户评价很好,公 ...

  8. mongodb 备份压缩_MongoDB的备份与恢复

    1.1 MongoDB的常用命令 mongoexport /mongoimport mongodump/ mongorestore 有以上两组命令在备份与恢复中进行使用. 1.1.1 导出工具mong ...

  9. mongodb备份与还原

    mongodb备份与还原 mongodb数据备份和恢复主要分为二种:一种是针对库的mongodump和mongorestore,一种是针对库中表的mongoexport和mongoimport. 一. ...

最新文章

  1. Android下载文件(一)下载进度断点续传
  2. python列表按照指定顺序排序-Python常见排序操作示例【字典、列表、指定元素等】...
  3. 确定活动的热点垃圾收集器
  4. 将ostream 对象转换成字符串流输出
  5. 【洛谷 P3299】 [SDOI2013]保护出题人 (凸包,三分,斜率优化)
  6. linux免采集卡直播ps4,ps4免采集卡直播方法
  7. 图解TCPIP---第六章---传输层TCPUDP
  8. android刷机工具 原理,Android 设备刷机教程
  9. ubuntu下安装FoxitReader pdf阅读器
  10. NAS 和 SAN 服务器概述
  11. 关于Iphone的手势识别
  12. IPMI用户名密码忘记了怎么处理?
  13. mysql 是否支持Unix系统_在UNIX系统下安装MySQL
  14. 若说耳机世界里有一股清流,那这款QCY耳机肯定是其中之一
  15. 自定义Switch(秒懂)
  16. CSDN写博客出现浏览器“不支持隐私模式,需用普通模式访问”处理
  17. 使用redis实现缓存_用下一个js实现一个简单的redis缓存
  18. python0x452_python at 0x
  19. python统计代码行数_python实现统计代码行数的方法
  20. 显示器6抖8,8抖10

热门文章

  1. mysql 时间 本周 本月_不要再等了,储蓄国债发行又被取消,本周还有两批国债能不能买...
  2. mysql5.7.23主主重制_MySQL-23(主从复制)
  3. 如何确定oracle进程,Oracle DBWR进程的工作流程以及和其他进程的协调工作!
  4. 隐藏窗口 java swing_Java简单实现贪吃蛇经典小游戏(附源代码)
  5. java downloadfile_FileDownload.java:文件下载工具类
  6. php 付款,php – 接受付款最佳做法
  7. Linux编辑firmware的文件,Linux中request_firmware 的用法
  8. html 转盘游戏开发,【scratch】简单的大转盘小游戏
  9. centso7.5 安装postman(实测)
  10. MLP多层感知机(人工神经网络)原理及代码实现