mongodb的備份


    轉載請附原文鏈接:http://www.cnblogs.com/wingsless/p/5672057.html

    mongodb現在為止還是沒有像XtraBackup這樣好用的備份工具,因此一般來說會有兩種備份辦法:拷貝文件和mongodump。拷貝文件這招在MySQL里經常用,但是必須要停掉寫入服務,這種辦法一般只會用於要進行機器遷移之類的情景,或者停機維護聲明發表以后。那么mongodump算是一種比較推薦的辦法。

    《mongodb權威指南》這本書上指出,mongodump這種辦法比較慢,它會把數據dump成BSON文件存儲起來。備份一般分為全備和增備兩種辦法,下面分別說明。

   全量備份

     全量備份只需要指定--out(-o)參數,即指定備份存儲路徑即可。基本上這個沒什么可說的,《mongodb權威指南》指出,這個工具不是一個快照備份,如果備份過程中仍然有服務對數據進行了更新操作,比如delete,那么可能備份出來的數據中會有根本不應該存在的數據,恢復的時候也會出現莫名其妙的一條數據。其實這個,並不是一個問題。請看下面的增量備份。

   增量備份

    mongodb自己並沒有提供增量備份工具,但是沒有問題,mongodb自己有個oplog的東西,這個東西很像MySQL的binlog,記錄了所有的操作,而且這個oplog有個特點,叫做冪等性,簡單地說就是這個oplog回放多少次效果都是一樣的,不會出現數據重復等問題。

    

{
    "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的特點,就可以利用這個東西來做增量備份了。

     首先在全量備份之前,我們需要得到現在的oplog的ts。Timestamp里分別是unix時間戳和序列號。記錄下這個ts之后,就可以進行全量備份了。下面還是利用mongodump,只不過這次需要加上兩個參數"-d local"和"-c oplog.rs",分別是數據庫和collection。另外還有一個很重要的參數,就是"--query",加上一個查詢條件即可,下面是一個例子:

     

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

     1468323972, 18就是我們上面全備之前記錄的時間戳和位置。這個命令會將該時間戳之后的所有數據導出來:

     

    增備應該是每天進行的,因此每天都需要將該命令執行一遍,基於第一次的全備即可。

    閑話

      最近玩了一個工具,叫做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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM