天天看點

MongoDB 資料檔案備份與恢複

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

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推薦的備份方式