數據按期備份是很是有必要的,數據的重要性不言而喻,地球上的豬都會知道。
mongodb備份方式有三種,下面分別說到:
1. 文件快照方式
2. 複製數據文件方式
3. 使用mongodump方式 html
恢復時,確保沒有運行mongod,執行快照恢復操做命令,而後啓動mongod進程,mongod將重放journal日誌。 mongodb
> 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
# ./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版本最好相匹配。
在備份複製集時,能夠設置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/
恢復複製集步驟:
# mongorestore --oplogReplay dump/
> use local > db.createCollection("oplog.rs", {"capped" : true, "size" : 10000000})
# mongorestore -d local -c oplog.rs dump/oplog.bson
注意:oplog.bson不位於dump/local/oplog.rs.bson, oplog.bson記錄mongodump過程當中發生的操做。
複製集的相關操做參見 http://www.ttlsa.com/html/1679.html
對於比較小的分片集羣,能夠直接從mongos來備份與恢復。
在大多數狀況下,咱們只須要恢復集羣中的某個節點。 若是須要恢復整個集羣,那你夠倒黴的了,整個集羣數據丟失可能性比較小的。備份時,直接鏈接分片集羣的mongod而不是經過mongos。
對於比較小型的分片集羣,能夠直接經過mongodump鏈接到mongos進行備份,備份的文件將包含config服務器的元數據信息和實際數據。
對於大型的分片集羣,備份步驟以下:
注意:鏈接到mongos而不是config server實例。
> sh.setBalancerState(false) 或 > sh.stopBalancer() 或 > use config > db.settings.update( { _id: "balancer" }, { $set : { stopped: true } } , true );
使用mongodump備份任意一臺config server。
能夠直接鏈接任意一臺的config mongod實例,也能夠經過mongos鏈接。
# mongodump --db config
注意:鏈接到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