需求:把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 里面,每周一次

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

mongodb备份每一天的数据的更多相关文章

  1. 一次生产环境下MongoDB备份还原数据

    最近开发一个版本的功能当中用到了MongoDB分页,懒于造数据,于是就研究了下从生产环境上导出数据到本地来进行测试. 研究了一下,发现MongoDB的备份还原和MySQL语法还挺类似,下面请看详细介绍 ...

  2. MongoDB 备份(mongodump)与恢复(mongorestore)

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

  3. mongodb 备份 还原 导出 导入

    张映 发表于 2013-12-03 分类目录: nosql 标签:mongodb, 备份, 导入, 导出, 还原 mongodb数据备份和还原主要分为二种,一种是针对于库的mongodump和mong ...

  4. MongoDB 备份(mongodump)恢复(mongorerstore) 导出 (Mongoexport) 导入( Mongoimport)

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

  5. MongoDB 备份方法

    翻译自 http://docs.mongodb.org/manual/core/backups/ 有以下几种方法来备份MongoDB群集: 通过复制底层数据文件来备份 通过mongodump来备份 通 ...

  6. centos下mongodb备份(dump)与还原(restore)

    数据服务器,数据库采用mongodb数据库 安装:通过增加配置安装mongodb-org,版本为3.0.7,yum安装            yum install mongodb-org 数据备份与 ...

  7. MongoDB 备份(mongodump)与恢复(mongorestore)

    MongoDB  备份(mongodump)与恢复(mongorestore) 备份:使用mongodump命令导出所有数据库到指定目录 参数说明: --host:MongoDB所在服务器IP. -- ...

  8. MongoDB 备份与还原 mongodump、mongorestore

    目录 MongoDB 备份与还原 一. MongoDB 备份 1.mongodump 2 .cp 或者rsync 3.单节点意外关闭后,如何恢复数据 4.查看备份数据 二.MongoDB 还原 1.m ...

  9. mongodb 备份

    本篇文章来自于阿里云技术专家郑涔(明俨)在2018年<Redis.MongoDB.HBase大咖直播大讲堂>技术直播峰会中的分享,该分享整体由四个部分构成: 1.MongoDB备份恢复 2 ...

随机推荐

  1. Qt编写自定义控件47-面板区域控件

    一.前言 在很多web网页上,经常可以看到一个设备对应一个面板,或者某种同等类型的信息全部放在一个面板上,该面板还可以拖来拖去的,这个控件首次用在智能访客管理平台中,比如身份证信息一个面板,访客信息一 ...

  2. confluent kafka connect remote debugging

    1. Deep inside of kafka-connect start up To begin with, let's take a look at how kafka connect start ...

  3. transition css3 渐变效果

    div { width:100px; transition: width 2s; -moz-transition: width 2s; /* Firefox 4 */ -webkit-transiti ...

  4. Tools - 笔记记录方法Markdown

    Markdown 简介 轻量级标记语言,使用易读易写的纯文本格式和类似HTML的标记语法来编写具有一定的格式的文档. 语法简洁直观,易学易用,可以使用任何喜爱的文本编辑器来阅读和写作. 可精- 确控制 ...

  5. git 提交大小超过100M

    #MsnDialog.ad, #MyMoveAd, #QQ_Full, #ad-SNSSplashAd, #ad6cn, #adBody07, #adLeftFloat, #adRightFloat, ...

  6. docker 概念

    前言: docker是一个开源的应用容器引擎,让开发这可以打包他们的应用以及依赖包到一个可以移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化.容器是完全使用沙箱机制,互相之间不会有 ...

  7. 【VS开发】【CUDA开发】如何在MFC中调用CUDA

    如何在MFC中调用CUDA 有时候,我们需要在比较大的项目中调用CUDA,这就涉及到MFC+CUDA的环境配置问题,以矩阵相乘为例,在MFC中调用CUDA程序.我们参考罗振东iylzd@163.com ...

  8. 【miscellaneous】GStreamer下的音视频播放

    Gst-launch命令: gst-launch filesrc location=*.* ! demux name=demux demux.video_00 ! queue ! decoder ! ...

  9. Android SDK目录说明

    在SDK目录下有很多文件夹,了解这个文件夹都包含哪些内容,更有利于Android的开发,也是作为Android开发者应该了解的.本文就SDK目录进行说明. SDK目录如下: add-ones:Goog ...

  10. [转帖]linux下查找文件及查找包含指定内容的文件常用命令。

    linux下查找文件及查找包含指定内容的文件常用命令. https://blog.csdn.net/yangyu19910407/article/details/18266821 最简单的查找 fin ...