MongoDB本身不支持增量备份,所以这里介绍几种我找到的,或者是自己使用代码实现的方法:
我的环境:集群环境,
如果是分片集群,只好各【分片集群】和【配置服务器集群】分开备份处理,因为使用了Oplog
所以不适合单机环境

一、 Delay server + Oplog replay(延迟节点+Oplog 重现)

【MongoDB The.Definitive.Guide 2nd.pdf】P363中介绍的使用mongooplog 工具来做增量备份的方法

应该 也属于此类方法。

二、使用mongosync 同步工具,    它的功能有:

1.    全量同步
    2.    增量同步
    3.    全量和增量同步,实时同步
    4.    可批量同步某个库/表
    优点:
        切换快,(如果使用了增量备份,那备份机必须是集群,因为用到oplog )
    (url: http://www.tuicool.com/articles/iei6n2)
    下载链接:http://pan.baidu.com/s/1qXrpbDa 密码:yybn

三、使用开源代码: Wordnik MongoDB Admin Tools 进行增量备份。

具体操作可以看git:  https://github.com/reverb/wordnik-oss/blob/master/modules/mongo-admin-utils/README.md
    下面有打包好的文件:
        链接:http://pan.baidu.com/s/1bogjYVH 密码:i82e
    我测试下来,增量备份速度不太理想,也有可能是和测试环境有关系。

这里我把我使用python 代码实现 oplog 增量备份及恢复的罗列如下:

1. Delay server + Oplog replay(延迟节点+Oplog 重现)
使用Oplog replay 的优点是:可以在恢复时,具体恢复到某一个时间点

步骤如下:
    1、在集群中添加一个延迟节点,比如延迟设置成10小时;
    2、另外找一台MongoDB 实例(可以是集群,也可以是单机)使用代码同步local.oplog.rs 表数据到
    备份库中(不要选择local库,因为local 库中的表你无法修改表结构,表索引,比如我新建立的表库名:oplog_bak)
    代码如下(python):

 '''Author: tangDate: 2016/03/07MongoDB Incremental Backup oplog.rs to other serverDB'''import timeimport jsonimport pymongoimport datetimeimport osimport sysimport bsondef init_back_database(p_db_name):'''init back desc db'''dest_conn.get_database(p_db_name).create_collection('oplog.rs',autoIndexId=False)dest_conn.get_database(p_db_name).get_collection('oplog.rs').create_index([("ts",pymongo.ASCENDING)],unique=True)dest_conn.get_database(p_db_name).get_collection('oplog.rs').create_index([('ns',pymongo.ASCENDING)])dest_conn.get_database(p_db_name).get_collection('oplog.rs').insert({"ts":bson.timestamp.Timestamp(0,1)})def inc_oplog(p_db_name):"""copy source server oplog to backup db""" #get last_timestamprow_count = dest_conn.get_database(p_db_name).get_collection('oplog.rs').count()if row_count==0:init_back_database(p_db_name)last_timestamp = bson.timestamp.Timestamp(int(time.time())-24*3600,1)     else:   cur_oplog_rs = dest_conn.get_database(p_db_name).get_collection('oplog.rs').find({},{"ts":1}).sort([("ts",-1)]).limit(1)for row in cur_oplog_rs:last_timestamp = row["ts"]#copy oplogcur_oplog = source_conn.get_database('local').get_collection('oplog.rs').find({"ts":{"$gt":last_timestamp},"op":{"$in":['i','d','u']}}).limit(100000)for row in cur_oplog:#insertrow_data = row#change dist2str save, bypass: field name not start $if row_data.has_key('o'):row_data['o'] = str(row_data['o'])if row_data.has_key('o2'):row_data['o2'] = str(row_data['o2'])  #print row_data dest_conn.get_database(p_db_name).get_collection('oplog.rs').insert(row_data)#end copy oplog  #end inc_oplog  def replay_oplog(p_db_name,p_tb_name,p_start_ts,p_end_ts):'''use oplog log row,replay data to every collections'''#copy oplogcur_oplog = source_conn.get_database(p_db_name).get_collection('oplog.rs').find({"ts":{"$gt":p_last_ts}}) for row in cur_oplog:db_name = row["ns"].split('.')[0]tbl_name = row["ns"].split('.')[1]#insert       if row['op']=='i':document_dist = eval(row['o'])dest_conn.get_database(db_name).get_collection(tbl_name).insert(document_dist)#updateif row.has_key('b'):muli_flg = row['b']else:muli_flg = False        if row['op']=='u':document_dist = eval(row['o'])if row.has_key('o2'):document2_dist = eval(row['o2'])dest_conn.get_database(db_name).get_collection(tbl_name).update(document2_dist,document_dist,multi=muli_flg)else:dest_conn.get_database(db_name).get_collection(tbl_name).update({},document_dist,multi=muli_flg)#deleteif row['op']=='d':document_dist = eval(row['o'])dest_conn.get_database(db_name).get_collection(tbl_name).remove(document_dist,multi=muli_flg)#end def replay_oplog               if __name__=='__main__':btype = sys.argv[1]source_host = sys.argv[2]desc_host = sys.argv[3]desc_dbname = sys.argv[4]last_ts = sys.argv[5]  source_conn = pymongo.MongoClient(['mongodb://%s'%source_host])dest_conn = pymongo.MongoClient(['mongodb://%s'%desc_host])if btype in ['b','back','bak']:inc_oplog(desc_dbname)if btype in ['r','rest','restore']:replay_oplog(desc_dbname, last_ts)

【MongoDB The.Definitive.Guide 2nd.pdf】P363:

Creating Incremental Backups with mongooplog

All of the backup methods outlined must make a full copy of the data, even if very little
of it has changed since the last backup. If you have data that is very large relative to the
amount that is being written, you may want to look into incremental backups.
Instead of making full copies of the data every day or week, you take one backup and
then use the oplog to back up all operations that have happened since the backup. This
technique is much more complex than the ones described above, so prefer them unless
incremental backups are absolutely necessary.
This technique requires two machines, A and B, running mongod. A is your main
machine (probably a secondary) and B is your backup machine:
1. Make a note of the latest optime in A’s oplog:
> op = db.oplog.rs.find().sort({$natural: -1}).limit(1).next();
> start = op['ts']['t']/1000
Keep this somewhere safe—you’ll need it for a later step.
2. Take a backup of your data, using one of the techniques above to get a point-intime backup. Restore this backup to the data directory on B.
3. Periodically add any operations that have happened on A to B’s copy of the data.
There is a special tool that comes with MongoDB distributions that makes this easy:
mongooplog (pronounced mon-goop-log) which copies data from the oplog of one
server and applies it to the data set on another. On B, run:
$ mongooplog --from A --seconds 1234567
--seconds should be passed the number of seconds between the start variable
calculated in step 1 and the current time, then add a bit (better to replay operations
a second time than miss them).
This keeps your backup relatively up-to-date with your data. This technique is sort of
like keeping a secondary up-to-date manually, so you may just want to use a slavedelayed secondary instead

MongoDB 增量备份方案相关推荐

  1. BorgBackup —— 增量备份方案

    BorgBackup -- 增量备份方案 by wzyboy on 2017-12-17 生活在电子时代,人们每天都在产生数据.写过的文字,拍过的照片,收集过的网络内容,都是数据.对于程序员们来说,写 ...

  2. mongo数据增量备份php,python mongodb增量备份脚本

    python mongodb增量备份脚本 首先,需要搭建mongodb副本集,才能进行增量备份,此过程略过 本人的构想是每天进行一次备份,这次备份是全量备份还是增量备份取决于最后一次全量备份的时间节点 ...

  3. mongodb 增量备份

    mongodb增量备份需要搭建mongo副本集集群.通过hidden节点同步主节点的数据并生成oplog操作日志:全量备份+增量oplog备份实现任意时间点还原.其中hidden节点只负责备份数据不会 ...

  4. kettle定时备份->mysql+mongoDB增量备份

    1. *简介* ETL(Extract-Transform-Load的缩写,即数据抽取.转换.装载的过程),对于企业或行业应用来说,我们经常会遇到各种数据的处理,转换,迁移,所以了解并掌握一种etl工 ...

  5. VMware 虚拟化编程(11) — VMware 虚拟机的全量备份与增量备份方案

    目录 目录 前文列表 全量备份数据的获取方式 增量备份数据的获取过程 前文列表 VMware 虚拟化编程(1) - VMDK/VDDK/VixDiskLib/VADP 概念简析 VMware 虚拟化编 ...

  6. mysql的增量备份方法_mySQL 增量备份方案(转)

    1.在 /etc/my.cnf 下面设置开启bin-log 编辑 vim /etc/my.cnf [mysqld] binlog_format       = MIXED                ...

  7. Mysql 增量备份和全量备份

    在日常运维工作中,对mysql数据库的备份是万分重要的,以防在数据库表丢失或损坏情况出现,可以及时恢复数据. 线上数据库备份场景: 每周日执行一次全量备份,然后每天下午1点执行MySQLdump增量备 ...

  8. 全备份、增量备份与差量备份

    基本概念: 全备份:做的一个完整备份: 差量备份:以上一次的全备份为基本做的备份: 增量备份:以上一次全备份或增量备份为基本做的备份. 看了概念以后是不是还是一头雾水?呵呵,正常!不过没关系,下面会举 ...

  9. 企业级MySQL数据库备份方案:增量备份、全量备份、逻辑备份

    一份好的备份方案无非包括以下几点: 为什么需要备份? 备份的方式有哪些? 某几种备份方式的区别在哪? 备份实战操作概述 恢复实战操作概述 其它备注信息 那么,此文将从以上几个角度,结合一些实际的实战经 ...

最新文章

  1. Office 365管理员指引 9 ——Lync 自定义会议邀请
  2. 神级总结:七种功能强大的聊天机器人平台
  3. 油价新年首涨:“五连跌”终结 一箱油多花4元
  4. loadrunner之java协议脚本编写
  5. Baumer相机Error Codes
  6. POJ NOI0107-06 合法 C 标识符【文本处理】
  7. [转载] Python中产生随机数
  8. 楚留香冰最新服务器,楚留香3.30更新公告 新增雕像功能
  9. html5开发wp8,WP7几则消息(HTML5,Sliverlight,WP8)
  10. 惩罚宝宝十个科学方法
  11. Python双均线策略回测(2021-10-12)
  12. 人喜欢音乐的部分原因:形成期望,不确定性
  13. eNSP搭建路由两侧客户PC端,打通链接,路由及客户PC里面的配置信息
  14. tensorflow安装过程-(windows环境下)---详解
  15. 解决 ArchLinux 下中文 Chinese 不能输入 couldnt input 的问题
  16. css3 新属性的兼容性之--transform
  17. 双十一十周年以后 电商行业这些未来趋势和机会不容错过
  18. JetBrains开发者日见闻(一)之Kotlin/Native 尝鲜篇
  19. Android基础篇-五大存储方式之一数据库存储
  20. 建立一个带头结点的线性链表,用以存放输入的二进制数,链表的每一个节点的data域存放一个二进制位。并在此链表上实现对二进制数加1的运算;

热门文章

  1. 1126 求递推序列的第N项 (Fnb + mod + 思维)
  2. CentOS安装Chrome
  3. 阿里云ECS服务器挂载磁盘
  4. 关于CacheLookup一个有趣的问题
  5. 动窗口的制作暨CSizingControlBar类的使用说明
  6. 课程设计个人报告——基于ARM实验箱的捕鱼游戏的设计与实现
  7. 【Flask】sqlalchemy 排序
  8. Python操作Excel表格
  9. 【例4-4】最小花费
  10. 0040 Java学习笔记-多线程-线程run()方法中的异常