mongodb備份與恢復(上)

數據按期備份是很是有必要的,數據的重要性不言而喻,地球上的豬都會知道。
mongodb備份方式有三種,下面分別說到:
1. 文件快照方式
2. 複製數據文件方式
3. 使用mongodump方式 html

一. 備份單臺mongodb

1. 文件快照方式

這是最簡單的備份方法。可是,須要系統文件支持快照和mongod必須啓用journal。若是都符合這兩條要求,能夠在任什麼時候刻建立快照。

恢復時,確保沒有運行mongod,執行快照恢復操做命令,而後啓動mongod進程,mongod將重放journal日誌。 mongodb

2. 複製數據文件方式

直接拷貝數據目錄下的一切文件。可是在拷貝過程當中必須阻止數據文件發生更改。所以須要對數據庫加鎖,以防止數據寫入。

> db.fsyncLock()

上面的命令將阻塞寫入操做,並將髒數據刷新到磁盤上,確保數據一致。
而後,拷貝數據文件到備份目錄下 shell

# cp -R /data/db/* /backup

文件複製完成後,對數據庫進行解鎖,容許寫操做 數據庫

> db.fsyncUnlock()

注意: 在執行db.fsyncLock()和db.fsyncUnlock()時,不能關閉當前的shell窗口,不然可能沒法鏈接而須要從新啓動mongod服務。 json

恢復時,確保mongod沒有運行,清空數據目錄,將備份的數據拷貝到數據目錄下,而後啓動mongod 服務器

# cp -R /backup/* /data/db/
# mongod -f mongod.conf

3. 使用mongodump方式

千萬不要fsyncLock與mongodump配合使用,若是數據庫被鎖定了,mongodump將永遠掛起。
使用mongodump備份比較慢,在備份複製集時還有些問題,後續會說到。可是,用來備份單個數據庫、集合、子集合仍是比較好的方法。

# ./mongodump --help
options:
  --help                                顯示幫助信息
  -v [ --verbose ]                      打印出更多信息,如時間等等 -vvvvv
  --version                             打印版本信息
  -h [ --host ] arg                     指定鏈接的mongodb主機,複製集時設置爲<set name>/s1,s2
  --port arg                            指定mongodb端口號,也能夠這麼指定--host hostname:port
  --ipv6                                啓用支持IPv6 support
  -u [ --username ] arg                 用戶名
  -p [ --password ] arg                 密碼
  --authenticationDatabase arg          user source (defaults to dbname)
  --authenticationMechanism arg (=MONGODB-CR)
                                        authentication mechanism
  --dbpath arg                          直接訪問mongod的數據庫文件,而不是鏈接到mongodb服務器。須要鎖定數據目錄,若是mongod當前在訪問相同路徑將不能使用。也就是說,mongod運行的狀況下不能使用--dbpath,mongod未運行的狀況下能夠直接指定--dbpath
  --directoryperdb                      每一個db一個單獨的目錄,須要指定dbpath 
  --journal                             啓用journaling,須要指定dbpath
  -d [ --db ] arg                       指定數據庫
  -c [ --collection ] arg               指定集合
  -o [ --out ] arg (=dump)              指定輸出目錄,"-"表示標準輸出
  -q [ --query ] arg                    json查詢
  --oplog                               使用oplog來生產時間點快照
  --repair                              嘗試恢復崩潰的數據庫
  --forceTableScan                      強制表掃描,不使用$snapshot
# mongodump -p 27017

將在當前目錄下建立dump目錄,備份全部的數據庫,全部的數據存儲在.bson文件中,可使用mongodb提供的bsondump工具來檢索它。
mongod未運行狀況下: 架構

# mongodump --dbpath /data/db

恢復時,使用mongorestore工具恢復 app

# ./mongorestore --help   //相同部分參數意義參加上面的mongodump
  -v [ --verbose ]                      
  --version                             
  -h [ --host ] arg                     
  --port arg                            
  --ipv6                                
  -u [ --username ] arg                 
  -p [ --password ] arg                 
  --authenticationDatabase arg          
  --authenticationMechanism arg (=MONGODB-CR)
  --dbpath arg                         
  --directoryperdb                      
  --journal 
  -d [ --db ] arg  
  -c [ --collection ] arg  
  --objcheck                            在插入前驗證對象,默認啓用
  --noobjcheck                          不在插入前驗證對象
  --filter arg                          插入前過濾
  --drop                                在插入前刪除全部文檔
  --oplogReplay                         在恢復時應用oplog
  --oplogLimit arg                      include oplog entries before the 
                                        provided Timestamp (seconds[:ordinal]) 
                                        during the oplog replay; the ordinal 
                                        value is optional
  --keepIndexVersion                    don't upgrade indexes to newest version
  --noOptionsRestore                    don't restore collection options
  --noIndexRestore                      don't restore indexes
  --w arg (=0)                          minimum number of replicas per write

恢復整個數據庫: ide

# mongorestore -p 27017 dump/

恢復到特定的庫和集合: 工具

# mongorestore --db ttlsa_com --collection posts dump/old_ttlsa_com/old_posts.bson

注意: mongodump和mongorestore版本最好相匹配。

二. 備份複製集

一般狀況下,在secondary進行備份,下降primary負載,只在secondary上鎖定,以避免影響業務(假設沒有發送讀請求到secondary)。 可使用上面的任意方式進行備份,不過推薦使用文件快照方式和複製數據文件方式。
使用mongodump備份,上面提到了一個問題,那就是在mongodump備份過程當中,發生寫操做。在複製集架構環境下,要避免這種狀況發生,mongodump須要加上--oplog參數,來跟蹤備份時服務器上發生的全部操做,獲取一個pointin-time快照,不然備份的狀態將與集羣中其餘節點不匹配。在恢復時,還必須建立oplog,並指定--oplogReplay參數來應用這些操做,不然恢復的成員將不知道從何處開始同步,從而在某個時間點上與源服務器保持一致。

在備份複製集時,能夠設置mongodump鏈接"setName/s1,s2,s3", 它會自動選擇一個可用的secondary進行備份。

備份複製集:

# mongodump -h "ttlsa/10.1.1.155,10.1.1.156,10.1.1.157" --oplog -o /backup/mongodbbackup/

恢復複製集步驟:

1. 將複製集中要恢復的成員移除集羣

2. 運行mongorestore --oplogReplay命令

# mongorestore --oplogReplay dump/

3. 建立oplog

> use local
> db.createCollection("oplog.rs", {"capped" : true, "size" : 10000000})

4. 恢復oplog

# mongorestore -d local -c oplog.rs dump/oplog.bson

注意:oplog.bson不位於dump/local/oplog.rs.bson, oplog.bson記錄mongodump過程當中發生的操做。

5. 將該節點添加到複製集集羣中

複製集的相關操做參見 http://www.ttlsa.com/html/1679.html

三. 備份分片

在分片集羣下,不可能在一個時間點上獲得一個完整集羣狀態的快照。當集羣愈來愈大時,從備份恢復整個架構的概率愈來愈小的。 所以,對於分片集羣的備份,只需獨自備份config server和複製集。
在對分片集羣進行備份與恢復操做前,要關閉balancer。

對於比較小的分片集羣,能夠直接從mongos來備份與恢復。

在大多數狀況下,咱們只須要恢復集羣中的某個節點。 若是須要恢復整個集羣,那你夠倒黴的了,整個集羣數據丟失可能性比較小的。備份時,直接鏈接分片集羣的mongod而不是經過mongos。

對於比較小型的分片集羣,能夠直接經過mongodump鏈接到mongos進行備份,備份的文件將包含config服務器的元數據信息和實際數據。

對於大型的分片集羣,備份步驟以下:

1. 關閉balancer

注意:鏈接到mongos而不是config server實例。

> sh.setBalancerState(false) 或
> sh.stopBalancer() 或
> use config
> db.settings.update( { _id: "balancer" }, { $set : { stopped: true } } , true );

2. 備份集羣元數據

使用mongodump備份任意一臺config server。

能夠直接鏈接任意一臺的config mongod實例,也能夠經過mongos鏈接。

# mongodump --db config

3. 備份shard集羣內各個replica set

可並行執行。

4. 啓用balancer

注意:鏈接到mongos而不是config server實例。

> sh.setBalancerState(true) 或
> sh.startBalancer() 或
> use config
> db.settings.update( { _id: "balancer" }, { $set : { stopped: false } } , true );

下篇《mongodb備份與恢復(下)》將提供一個線上的備份腳本(適用於mongodb任何架構)以及增量備份的實現方法。

如需轉載請註明出處:mongodb備份與恢復(上)  http://www.ttlsa.com/html/1938.html

相關文章
相關標籤/搜索