MongoDB 數據文件備份與恢復

openkk 12年前發布 | 62K 次閱讀 MongoDB NoSQL數據庫

備份與恢復數據對于管理任何數據存儲系統來說都是非常重要的。

1、冷備份與恢復——創建數據文件的副本(前提是要停止MongoDB服務器),也就是直接copy

MongoDB將所有數據都存儲在數據目錄下,默認是/data/db/(Windows下是C:\data\db\),啟動MongoDB時也可以用--dbpath指定我們自己設置的數據存儲目錄。
備份MongoDB數據:只要簡單的創建數據存儲目錄的副本就可以了,直接copy一份。
恢復MongoDB數據:在MongoDB啟動時用--dbpath指定數據存儲目錄副本位置。

在服務器運行的情況下直接copy是有風險的,可能copy出來時,數據已經遭到破壞,這種方式下創建數據目錄的副本需要在關閉MongoDB服務器的前提下,數據目錄中存儲的就是關閉那一刻數據的快照,在服務器重新啟動之前可以復制目錄作為備份。

2、熱備份與恢復——MongoDB bin目錄下自帶的mongodump和mongorestore工具

mongodump是一種能在運行時備份的方法。該命令詳細參數如下:
MongoDB 數據文件備份與恢復

mongorestore獲取mongodump的輸出結果,并將備份的數據插入到運行的MongoDB實例中實現數據恢復。該命令詳細參數如下:
MongoDB 數據文件備份與恢復

mongodump(備份)與mongorestore(恢復)示例:
1、創建mongodb數據庫:
MongoDB 數據文件備份與恢復

2、mongodump備份mongodb數據庫:
MongoDB 數據文件備份與恢復
-d指定需要備份的數據庫,-o指定備份位置,上述表示備份mongodb數據庫到與當前mongodump命令同一位置backup目錄下
MongoDB 數據文件備份與恢復

3、mongorestore恢復mongodb數據庫,并重命名為mongodb2數據庫:
MongoDB 數據文件備份與恢復
-d指定要恢復為的數據庫,可以將備份的數據庫恢復到與原來不同名的數據庫中,這里為mongodb2,--drop表示在恢復前刪除集合(若存在)。否則,數據就會與現有集合數據合并,可能會覆蓋一些文檔。

恢復之后數據存儲目錄中的數據:
MongoDB 數據文件備份與恢復

此時在MongoDB shell下可以查看到mongodb2數據庫,及其中的mongodb集合和數據文檔。
MongoDB 數據文件備份與恢復

3、fsync和鎖方式備份

上面的1,2兩點都不能保證備份時獲取數據的實時性,因為我們在備份的時候可能還有數據在內存緩沖區中沒有寫入到磁盤,MongoDB給我們提供了fsync+lock機制就能滿足我們的需求。

fsync(注意,只支持1.3+版本):該命令會強制服務器將所有緩沖區中的內容寫入磁盤,
                                                  讓我們可以實時性獲取數據。
lock(寫入鎖):通過lock給數據庫一個寫入鎖,阻止對數據庫的進一步寫入操作,其他實例的寫入操作全部被阻
                         塞,直到釋放鎖為止。寫入鎖是讓fsync在備份時發揮作用的關鍵。

1、在shell中強制執行fsync并獲得lock(寫入鎖),在備份之前fsync并加鎖:
fsync并加鎖: db.runCommand({"fsync":1,"lock":1}),該命令用于admin db。
MongoDB 數據文件備份與恢復
該操作強制服務器將所有緩沖區中的內容寫入磁盤并對數據庫上鎖,不允許執行寫數據操作,一般在執行數據庫備份時有用。

2、db.$cmd.sys.unlock.findOne():釋放鎖,備份好了就要解鎖,該命令用于admin db。
MongoDB 數據文件備份與恢復

3、db.currentOp():查看當前鎖狀態

已經解鎖狀態:
MongoDB 數據文件備份與恢復

上鎖狀態:
MongoDB 數據文件備份與恢復
其中,fsyncLock為1表示MongoDB的fsync進程(負責將寫入改變同步到磁盤)不允許其他進程執行寫數據操作

fsync命令能非常靈活的備份,不用停掉服務器,也不用犧牲備份的實時特性。要付出的代價就是一些寫入操作被暫時阻塞了。 唯一不耽誤讀寫還能保證實時快照的備份方式就是通過“從服務器”備份。

4、從屬備份

在從服務器上備份是MongoDB推薦的備份方式

 本文由用戶 openkk 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!