1. 程式人生 > >MongoDB的資料庫如何備份和恢復?

MongoDB的資料庫如何備份和恢復?

MongoDB資料庫如何備份?恢復MongoDB資料庫應如何操作?最近資料庫多災多難,這些問題也成為開發者關注的重點。2016年12月爆出MongoDB資料庫安全問題(見MongoDB黑客贖金事件解讀及防範)。2017年1月又被爐石傳說資料庫故障給刷屏了。作為一個數據庫行業從業人員,看到這個新聞是不是還應該乾點什麼?恩,很有必要再重新審視一下我們的資料庫有沒有做好容災,藉此機會給大家普及一下MongoDB資料庫的備份和恢復手段。

MongoDB備份手段

全量邏輯備份/恢復

Mongodump/Mongorestore

對於資料量比較小的場景,使用官方的mongodump/mongorestore

工具進行全量的備份和恢復就足夠了。mongodump可以連上一個正在服務的mongod節點進行邏輯熱備份。其主要原理是遍歷所有集合,然後將文件一條條讀出來,支援併發dump多個集合,並且支援歸檔和壓縮,可以輸出到一個檔案(或標準輸出)(對原理感興趣可以參見兩篇文章Mongodumparchive(歸檔)模式原理解析以及Mongorestorearchive(歸檔)模式恢復原理解析)。同樣,mongorestore則是連上一個正在服務的mongod節點進行邏輯恢復。其主要原理是將備份出來的資料再一條條寫回到資料庫中。

效能的影響

mongodump執行過程由於會遍歷所有資料,因此會對MongoDB效能有影響,最好在備節點執行(最好是hidden,需檢查備節點資料同步是否正常)。

取一致的據快照

在mongodump執行過程中由於資料庫還有新的修改,直接執行dump出來的結果不是一個一致的快照,需要使用一個『--oplog』的選項來將這個過程中的oplog也一塊dump下來(使用mongorestore進行恢復時對應要使用--oplogReplay選項對oplog進行重放)。而由於MongoDB的oplog是一個固定大小的特殊集合,當oplog集合達到配置的大小時舊的oplog會被滾掉以為新的oplog騰出空間。在使用『--oplog』選項進行dump時,mongodump會在dump集合資料前獲取當時最新的oplog時間點,並在集合資料dump完畢之後再次檢查這個時間點的oplog是否還在,如果dump過程很長,oplog空間又不夠,oplog被滾掉就會dump失敗。因此在dump前最好檢查一下oplog的配置大小以及目前oplog的增長情況(可結合業務寫入量及oplog平均大小進行粗略估計),確保dump不會失敗。目前我們阿里雲MongoDB服務針對oplog做了彈性擴縮容的優化,能夠確保在邏輯備份過程中oplog不被滾掉,一定能夠備份成功。

索引的備份和恢復

對於集合資料,mongodump出來的結果是一個個bson檔案。而對於集合的索引,則是描述在一個metadata的json檔案裡,裡面還包含建立集合時所使用的選項。在使用mongorestore進行恢復時,會在集合資料恢復完畢之後進行對應的索引建立。

全量物理備份/恢復

對於資料量很大的場景,如果使用mongodump/mongorestore進行備份和恢復,需要的時間可能會很長。對於備份來說,最主要的問題就是備份所需時間越長,oplog被滾掉的機率就越大,備份失敗的機率也就越大。而對於恢復來說,由於恢復過程還涉及到索引的建立,如果除了資料量大,還有很多索引,所需花費的時間就更長了。遇到像爐石這種資料災難,恢復時間當然是越短越好,畢竟在遊戲行業分分鐘的流水都很可觀。這時候就需要物理備份出場了,物理備份,顧名思義就是通過物理拷貝資料檔案實現備份。在恢復時可以直接使用物理備份拷貝出來的資料檔案,直接啟動mongod。物理備份最大的好處是速度快,恢復時也不需要再建索引。

實施方法

物理備份通過拷貝資料檔案來實現,這要求所有被拷貝的資料檔案必須是一個一致的資料快照。因此物理備份的實施方法和MongoDB採用的儲存引擎有關,並且,根據是否配置MongoDB打開了Journal,在實施的細節上會有一些不同,具體可參考官方文件。不管使用何種儲存引擎,在3.2版本之後,都可以用以下方法實現物理備份:

1.    通過mongoshell執行以下命令以確保所有的寫操作都flush到磁碟並禁止新的寫入:

db.fsyncLock();

2.    利用底層檔案系統層或邏輯卷的快照功能對MongoDB的資料目錄做快照,或直接通過cp、scp、tar等命令拷貝資料目錄。

3.    還是在剛才的mongoshell上(這裡需要保證和剛剛是同一個連線),執行以下命令以重新允許新的寫入:

db.fsyncUnLock();

由於執行db.fsyncLock()會加資料庫的全域性寫鎖,這時資料庫會處於一個不可訪問的狀態,因此物理備份最好也在備節點上執行(最好是hidden,注意同樣需要確保物理備份完成之後節點的oplog能追上主節點)。目前我們阿里雲MongoDB團隊已經研發出了無需停寫服務的物理熱備份手段,相信很快就可以讓大家用上,盡請期待!

增量備份

MongoDB的增量備份可以通過持續抓取oplog來實現,這個目前沒有現成的工具可以利用,需要自己程式碼實現。抓取oplog主要的難題也和使用mongodump進行全量備份一樣,需確保要抓取的oplog不被滾掉。目前我們阿里雲MongoDB服務實現了自動增量備份的功能,結合全量備份可以實現任意時間點恢復功能。

Sharding的備份/恢復

爐石是不分服的,因此它後面也有可能是使用分散式資料庫。對於分散式資料庫來說,備份和恢復比單機資料庫更加複雜。分散式資料庫包含多個節點,並且通常包含不同角色的節點。以MongoDB的Sharding叢集為例,它包含一個儲存元資料的config server以及若干個儲存資料的shard。其中最主要的元資料就是資料在shard之間的分佈情況。對於多個節點的備份,其中一個難題是保證所有節點備份的資料是同一個時間點的,常規採用的手段是停止外部寫入後進行備份,這在網際網路服務中顯然不可接受。退而求其次,可以在停止接受同步的備節點上進行備份,這樣可以得到一個時間大致接近的備份。另外一個難題是各資料節點之間通常存在資料遷移,而資料遷移就涉及到起碼2個以上資料節點的資料修改以及元資料節點的資料修改,如果在備份過程中發生資料遷移,很難保證備份出來的資料和元資料是一個一致的狀態。因此通常在備份過程中需要關閉資料遷移。MongoDB官方的文件指導步驟就是採用這個思路,先關閉負責資料遷移的balancer,然後依次在config server和各個shard的備節點上進行備份。關閉資料遷移最大的問題是關閉期間叢集無法實現資料均衡,除了會影響叢集的訪問效能外,還造成資源的浪費,這在資料量較大,所需備份時間較長時可能造成比較大的影響。

針對這兩大難題,阿里云云資料庫MongoDB團隊研發了不需要停外部寫,並且無需關資料遷移的Sharding備份手段,能夠實現『任意』時間點恢復。

阿里云云資料庫MongoDB備份服務

阿里云云資料庫MongoDB服務提供自動備份/恢復功能,預設每天為資料進行全量備份,並且自動抓取oplog進行增量備份。使用者可以在控制檯自定義備份策略以及進行恢復。

恢復時可以選擇某一個備份集或某一個時間點克隆出一個新的例項,可以在新例項上進行資料校驗,等校驗沒問題後切換到新例項。此外,全量備份的資料還提供下載功能,使用者也可以選擇下載備份集到本地後恢復到一個臨時例項進行資料校驗。

以上資訊可以幫助大家對MongoDB的備份/恢復手段有一個大概的認識。從省心的角度考慮,還是建議直接使用阿里云云資料庫MongoDB服務,我們有自動化的備份/恢復服務,靈活的備份策略,只需點點滑鼠就能實現任意時間點恢復、物理熱備份、Sharding備份/恢復,從此不再為資料庫容災發愁。


原文連結

相關推薦

mongoDB備份恢復資料庫的命令

部分恢復:mongorestore -h 192.168.88.88 -d dris D:\MongoDB\dataBak\88\cmlib\dris_digital.bson 匯出資料表dris_digital到dris中

[實驗-視訊過程]oracle熱備份-整個資料庫-備份恢復操作演示

先檢視資料版本和資料檔案所在位置 10g以上版本支援整體表空間熱備份 select * from v$version; select name from v$datafiles; 確認是否為歸檔模式 archive log list; 如果不是改成歸檔模

Ubuntu 16.04 MongoDB資料庫備份恢復

1、切換到/usr/bin目錄下 cd /usr/bin 2、備份資料庫 mongodump -h ip:port -d 庫名 -o 備份目錄 例如:mongodump -h 127.0.0.1:27017 -d test -o /home/test 3、恢復資料庫

MySQL資料庫備份恢復方案小結

這兩天在調研MySQL資料庫的備份和恢復方案,備份物件是對大量Innodb表,或者加上少量的MyISAM表。   InnoDB備份常見問題: 檔案一致性:資料檔案、快取、日誌檔案必須保持嚴格一致。加鎖的方法沒法保證一致性,因為InnoDB後臺重新整理資料是非同步進行的。

MySQL 資料庫備份恢復探討(全量mysqldump 增量mysqlbinlog)

背景介紹: 在開發、測試以及生產環境中,每次修改MySQL資料庫,嚴格上來說,都應該事先備份資料庫,以便修改錯誤後導致資料庫掛掉或者不能用,能夠及時還原為修改前的資料庫;另外,在實際使用中也可能因為不正確的使用MySQL資料庫,導致資料庫不可用。因此,做好MySQL資料庫的備份和恢復具有重要的意

MongoDB操作-備份恢復

Mongodb資料庫操作-備份 恢復 匯出 匯入 mongodb資料備份和恢復主要分為二種:一種是針對庫的mongodump和mongorestore,一種是針對庫中表的mongoexport和mongoimport。 一、 mongodump備份資料庫 1. 常

MongoDb 資料備份恢復

1.本機備份     開啟cmd,切換到mongodb安裝目錄的bin目錄下     mongodump      一個命令搞定 2.將非本機資料備份到本機       mo

mongodb資料庫備份利用shell指令碼編寫

1、指令備份 MongoDB提供了備份工具,mongodump.exe,在bin目錄下,其用法如下: mongodump.exe-hlocalhost-ddatabase_name -u use

MongoDB資料備份恢復

MongoDB資料備份和恢復 1 MongoDB資料庫備份 1、語法: mongodump -h dbhost -d dbname -o dbdirectory 引數說明: -h: MongDB所在伺服器地址,例如:127.0.0.1,當然也可以指定埠號:127.0.0.

mongodb資料庫備份恢復

資料庫的操作 mongodump -h 192.168.10.3 --port 27017 --oplog -o /var/data/ mongorestore -h 192.168.10.57:27017 --authenticationDatabase admin  /

SQL Server資料庫備份恢復措施

 一、備份資料庫 1、開啟SQL企業管理器,在控制檯根目錄中依次點開Microsoft SQL Server 2、SQL Server組-->雙擊開啟你的伺服器-->雙擊開啟資料庫目錄 3、選擇你的資料庫名稱(如論壇資料庫Forum)-->然後點上面選單中的工具-->選擇備份資料庫

mysql資料庫備份恢復

</pre><pre name="code" class="plain">#備份某個資料庫 [email protected]'s linux:~/baidu_shell/bop$ mysqldump [-–add-drop-table | –no-data][-h${hos

DB2資料庫備份恢復

資料庫備份(離線): C:\Documents and Settings\quanlun>db2 backup db sample to 'E:\bk\test' 備份成功。此備份映像的時間戳記是:20101207095857 C:\Documents and Set

MongoDB 資料庫備份恢復

使用mongodump命令備份資料庫 這裡備份下來的是json和bson檔案 其中json儲存元資料,bson儲存具體資料 直接寫 mongodump命令,客戶端會連線到ip為 127.0.0

使用mongoDB必須要知道的備份恢復資料庫的命令

部分恢復:mongorestore -h 192.168.88.88 -d dris D:MongoDBdataBak88cmlibdris_digital.bson 匯出資料表dris_digital到dris中

MongoDB資料庫如何備份恢復

MongoDB資料庫如何備份?恢復MongoDB資料庫應如何操作?最近資料庫多災多難,這些問題也成為開發者關注的重點。2016年12月爆出MongoDB資料庫安全問題(見MongoDB黑客贖金事件解讀及防範)。2017年1月又被爐石傳說資料庫故障給刷屏了。作為一個數據庫行業從業人員,看到這個新聞是不是還應

mongodb備份恢復整個資料庫

1、備份 mongodump -h <hostname>:<port> -d <dbname> -o <dbdirectory> 解釋:db

SqlServer資料庫備份恢復措施

一、備份資料庫 1、開啟SQL企業管理器,在控制檯根目錄中依次點開Microsoft SQL Server2、SQL Server組-->雙擊開啟你的伺服器-->雙擊開啟資料庫目錄3、選擇你的資料庫名稱(如論壇資料庫Forum)-->然後點上面選單中的工具-->選擇備份資料庫

非歸檔模式下如何手工備份恢復整個oracle資料庫

非歸檔模式下如何手工備份和恢復oracle資料庫? 1.確定資料庫處於非歸檔模式 2.一致性關閉資料庫後,手工copy備份資料檔案、聯機重做日誌檔案、控制檔案 3.啟動資料庫,操作一段時間後,模擬資料檔案、聯機重做日誌檔案、控制檔案全部丟失 4.關閉資料庫後,手工copy備份

如何使用Mysqldump備份恢復MySQL資料庫

如何使用mysqldump備份和恢復MySQL資料庫 本教程介紹如何使用mysqldump實用程式從命令列備份和還原MySQL或MariaDB資料庫。 mysqldump實用程式建立的備份檔案基本上是一組可用於重新建立原始資料庫的SQL語句。 如果不備份資料庫,則軟體錯誤或硬碟驅動器故