轉載請附原文連接: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