mongodb的备份

    转载请附原文连接:http://www.cnblogs.com/wingsless/p/5672057.htmlhtml

    mongodb如今为止仍是没有像XtraBackup这样好用的备份工具,所以通常来讲会有两种备份办法:拷贝文件和mongodump。拷贝文件这招在MySQL里常常用,可是必需要停掉写入服务,这种办法通常只会用于要进行机器迁移之类的情景,或者停机维护声明发表之后。那么mongodump算是一种比较推荐的办法。python

    《mongodb权威指南》这本书上指出,mongodump这种办法比较慢,它会把数据dump成BSON文件存储起来。备份通常分为全备和增备两种办法,下面分别说明。git

   全量备份

     全量备份只须要指定--out(-o)参数,即指定备份存储路径便可。基本上这个没什么可说的,《mongodb权威指南》指出,这个工具不是一个快照备份,若是备份过程当中仍然有服务对数据进行了更新操做,好比delete,那么可能备份出来的数据中会有根本不该该存在的数据,恢复的时候也会出现莫名其妙的一条数据。其实这个,并非一个问题。请看下面的增量备份。github

   增量备份

    mongodb本身并无提供增量备份工具,可是没有问题,mongodb本身有个oplog的东西,这个东西很像MySQL的binlog,记录了全部的操做,并且这个oplog有个特色,叫作幂等性,简单地说就是这个oplog回放多少次效果都是同样的,不会出现数据重复等问题。mongodb

    

{
    "ts": Timestamp(1468323972, 37),
    "t": NumberLong(1),
    "h": NumberLong("-9013437047635619317"),
    "v": 2,
    "op": "i",
    "ns": "test1.testone",
    "o": {
        "_id": ObjectId("5784d8849fea750f2cce73c7"),
        "name": 35
    }
}

     上面就是oplog的内容,其中"o"中的内容就是document自己了。能够看到我是在test1数据库的testone集合中插入了该document。数据库

     根据oplog的特色,就能够利用这个东西来作增量备份了。ruby

     首先在全量备份以前,咱们须要获得如今的oplog的ts。Timestamp里分别是unix时间戳和序列号。记录下这个ts以后,就能够进行全量备份了。下面仍是利用mongodump,只不过此次须要加上两个参数"-d local"和"-c oplog.rs",分别是数据库和collection。另外还有一个很重要的参数,就是"--query",加上一个查询条件便可,下面是一个例子:app

     

mongodump -d local -c oplog.rs --query "{"ts":{$gte:Timestamp(1468323972, 18)}}" -o F:\data\test

     1468323972, 18就是咱们上面全备以前记录的时间戳和位置。这个命令会将该时间戳以后的全部数据导出来:less

     

    增备应该是天天进行的,所以天天都须要将该命令执行一遍,基于第一次的全备便可。工具

    闲话

      最近玩了一个工具,叫作mongo-oplog-backup的,是一个用ruby写的工具,在github上开源了,支持全备和增备,也是基于mongodump的,只是在恢复的时候,这个工具还能完成增量备份的bson文件和全量备份的bson的合并。可是ruby是我不会的语言,所以最近也在借鉴人家的思想用python写一个本身的工具,但愿能成功吧。

      这里附上这个工具的地址,还挺好用的:https://github.com/journeyapps/mongo-oplog-backup

      转载请附原文连接:http://www.cnblogs.com/wingsless/p/5672057.html

相关文章
相关标签/搜索