備份與恢復數據對於管理任何數據存儲系統來講都是很是重要的。mongodb
一、冷備份與恢復——建立數據文件的副本(前提是要中止MongoDB服務器),也就是直接copy
MongoDB將全部數據都存儲在數據目錄下,默認是/data/db/(Windows下是C:\data\db\),啓動MongoDB時也能夠用--dbpath指定咱們本身設置的數據存儲目錄。
備份MongoDB數據:只要簡單的建立數據存儲目錄的副本就能夠了,直接copy一份。
恢復MongoDB數據:在MongoDB啓動時用--dbpath指定數據存儲目錄副本位置。
在服務器運行的狀況下直接copy是有風險的,可能copy出來時,數據已經遭到破壞,這種方式下建立數據目錄的副本須要在關閉MongoDB服務器的前提下,數據目錄中存儲的就是關閉那一刻數據的快照,在服務器從新啓動以前能夠複製目錄做爲備份。shell
二、熱備份與恢復——MongoDB bin目錄下自帶的mongodump和mongorestore工具數據庫
mongodump是一種能在運行時備份的方法。該命令詳細參數以下:
服務器
mongorestore獲取mongodump的輸出結果,並將備份的數據插入到運行的MongoDB實例中實現數據恢復。該命令詳細參數以下:
mongodump(備份)與mongorestore(恢復)示例:
一、建立mongodb數據庫:
二、mongodump備份mongodb數據庫:
-d指定須要備份的數據庫,-o指定備份位置,上述表示備份mongodb數據庫到與當前mongodump命令同一位置backup目錄下
工具
三、mongorestore恢復mongodb數據庫,並重命名爲mongodb2數據庫:
-d指定要恢復爲的數據庫,能夠將備份的數據庫恢復到與原來不一樣名的數據庫中,這裏爲mongodb2,--drop表示在恢復前刪除集合(若存在)。不然,數據就會與現有集合數據合併,可能會覆蓋一些文檔。
恢復以後數據存儲目錄中的數據:
spa
此時在MongoDB shell下能夠查看到mongodb2數據庫,及其中的mongodb集合和數據文檔。
三、fsync和鎖方式備份.net
上面的1,2兩點都不能保證備份時獲取數據的實時性,由於咱們在備份的時候可能還有數據在內存緩衝區中沒有寫入到磁盤,MongoDB給咱們提供了fsync+lock機制就能知足咱們的需求。rest
fsync(注意,只支持1.3+版本):該命令會強制服務器將全部緩衝區中的內容寫入磁盤,
讓咱們能夠實時性獲取數據。
lock(寫入鎖):經過lock給數據庫一個寫入鎖,阻止對數據庫的進一步寫入操做,其餘實例的寫入操做所有被阻
塞,直到釋放鎖爲止。寫入鎖是讓fsync在備份時發揮做用的關鍵。進程
一、在shell中強制執行fsync並得到lock(寫入鎖),在備份以前fsync並加鎖:
fsync並加鎖: db.runCommand({"fsync":1,"lock":1}),該命令用於admin db。
該操做強制服務器將全部緩衝區中的內容寫入磁盤並對數據庫上鎖,不容許執行寫數據操做,通常在執行數據庫備份時有用。內存
二、db.$cmd.sys.unlock.findOne():釋放鎖,備份好了就要解鎖,該命令用於admin db。
三、db.currentOp():查看當前鎖狀態
上鎖狀態:
其中,fsyncLock爲1表示MongoDB的fsync進程(負責將寫入改變同步到磁盤)不容許其餘進程執行寫數據操做
fsync命令能很是靈活的備份,不用停掉服務器,也不用犧牲備份的實時特性。要付出的代價就是一些寫入操做被暫時阻塞了。 惟一不耽誤讀寫還能保證明時快照的備份方式就是經過「從服務器」備份。
四、從屬備份
在從服務器上備份是MongoDB推薦的備份方式