轉載請附原文鏈接:http://www.cnblogs.com/wingsless/p/5672057.html mongodb現在為止還是沒有像XtraBackup這樣好用的備份工具,因此一般來說會有兩種備份辦法:拷貝文件和mongodump。拷貝文件這招在MySQL里經常用,但是必須要停掉寫入服 ...
轉載請附原文鏈接: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