MongoDB備份方式詳細介紹

chenfeng發表於2015-12-28
mongodb備份方式有三種:
1. 檔案快照方式
2. 複製資料檔案方式
3. 使用mongodump方式

一. 備份單臺mongodb

1. 檔案快照方式

這是最簡單的備份方法。但是,需要系統檔案支援快照和mongod必須啟用journal。如果都符合這兩條要求,可以在任何時刻建立快照。

恢復時,確保沒有執行mongod,執行快照恢復操作命令,然後啟動mongod程式,mongod將重放journal日誌。

2. 複製資料檔案方式

直接複製資料目錄下的一切檔案。但是在複製過程中必須阻止資料檔案發生更改。因此需要對資料庫加鎖,以防止資料寫入。
?
1
> db.fsyncLock()

上面的命令將阻塞寫入操作,並將髒資料重新整理到磁碟上,確保資料一致。
然後,複製資料檔案到備份目錄下

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

檔案複製完成後,對資料庫進行解鎖,允許寫操作

?
1
> db.fsyncUnlock()

注意: 在執行db.fsyncLock()和db.fsyncUnlock()時,不能關閉當前的shell視窗,否則可能無法連線而需要重新啟動mongod服務。

恢復時,確保mongod沒有執行,清空資料目錄,將備份的資料複製到資料目錄下,然後啟動mongod

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


3. 使用mongodump方式

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


?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# ./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
?
1
# mongodump -p 27017

將在當前目錄下建立dump目錄,備份所有的資料庫,所有的資料儲存在.bson檔案中,可以使用mongodb提供的bsondump工具來檢索它。
mongod未執行情況下:

?
1
# mongodump --dbpath /data/db

恢復時,使用mongorestore工具恢復

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# ./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

恢復整個資料庫:

?
1
# mongorestore -p 27017 dump/

恢復到特定的庫和集合:

?
1
# 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進行備份。

備份複製集:

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

恢復複製集步驟:

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

2. 執行mongorestore --oplogReplay命令


?
1
# mongorestore --oplogReplay dump/

3. 建立oplog

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

4. 恢復oplog

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

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

5. 將該節點新增到複製集叢集中

三. 備份分片

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


對於比較小的分片叢集,可以直接從mongos來備份與恢復。

在大多數情況下,我們只需要恢復叢集中的某個節點。 如果需要恢復整個叢集,那你夠倒黴的了,整個叢集資料丟失可能性比較小的。備份時,直接連線分片叢集的mongod而不是透過mongos。

對於比較小型的分片叢集,可以直接透過mongodump連線到mongos進行備份,備份的檔案將包含config伺服器的後設資料資訊和實際資料。

對於大型的分片叢集,備份步驟如下:

1. 關閉balancer

注意:連線到mongos而不是config server例項。

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

2. 備份叢集後設資料

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

可以直接連線任意一臺的config mongod例項,也可以透過mongos連線。

?
1
# mongodump --db config


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

可並行執行。


4. 啟用balancer

注意:連線到mongos而不是config server例項。

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

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/15498/viewspace-1965793/,如需轉載,請註明出處,否則將追究法律責任。

相關文章