Mongodb 備份與還原
文件快照
利用Linux LVM 邏輯卷管理,制作快照后,將快照映像掛載到文件系統上並從快照復制數據。生成的備份包含所有數據的完整副本,從而達到備份數據庫。
注意:Mongodb數據與日志目錄需要啟動在邏輯卷掛載到目錄中
快照備份
db.fsyncLock(); # 鎖定數據庫
vgcreate vg01 /dev/sdb # 創建卷組
lvcreate --size 1G --name mongodb_bak /dev/vg01 # 創建快照
umount /dev/vg01/mongodb_bak # 卸載
dd if=/dev/vg01/mongodb_bak | gzip > bak/20210817.gz # 壓縮歸檔
db.fsyncUnlock(); # 解鎖數據庫
快照直接還原
db.fsyncLock(); # 鎖定數據庫
umount /dev/vg01/mongodb_01 # 卸載lv
lvcreate --size 1G --name mongodb_restore /dev/vg01 # 創建lv
mkfs.ext4 /dev/vg01/mongodb_restore # 格式化ext4,不然還原后掛載不了
dd if=/dev/vg01/mongodb_bak of=/dev/vg01/mongodb_restore # 復制文件到新快照
mount /dev/vg01/mongodb_new /mongodb # 掛載新的快照到數據目錄
db.fsyncUnlock(); # 解鎖數據庫
從壓縮文件還原
umount /dev/vg01/mongodb_bak # 卸載lv
lvcreate --size 1G --name mdb-new vg0 # 創建lv
gzip -d -c 20210817.gz | dd of=/dev/vg0/mdb-new # 解壓並復制到新lv
mount /dev/vg01/mdb-new /mongodb # 掛載
優缺點
優點
- 快速
- 支持時間點的快照備份
- 提供增量備份
缺點
- 需要文件系統支持時間點快照(LVM)
- 需要開啟日志功能
- 快照創建整個磁盤的鏡像,因此將數據文件,配置,日志放在一個邏輯磁盤上節約空間
復制文件
備份文件
service mongod stop # 停止mongod
echo `date +%Y%m%d%H%M%S` | xargs -I {} sh -c 'mkdir ./bak/{}; cp -a /mongodb/data ./bak/{}' # 按日期格式歸檔
service mongod restart # 重新啟動mongodb
從文件還原
service mongod stop # 停止mongod
echo bak_`date +%Y%m%d%H%M%S` | xargs -I {} sh -c 'mkdir ./bak/{};mv /mongodb/data ./bak/{}' # 備份當前文件
cp -a bak/20210818025815/data /mongodb # 使用備份數據還原
service mongod restart # 重新啟動mongodb
優缺點
優點
- 無需文件系統支持快照功能
缺點
- 備份拷貝前必須停止所有的對mongod的寫操作,否則將是一個無效的備份
- 不支持副本集時間點級(point in time recovery)恢復,並且很難管理大型分片集群
- 備份文件占有更多的空間(包括索引以及重復的底層文件填充和碎片)
mongodump
mongodump備份
mongodump --uri="mongodb://127.0.0.1:27017" # 導出整個實例
mongodump --uri="mongodb://127.0.0.1:27017/database" --out=/dump/`date +%Y%m%d` # 導出指定數據庫並指定位置
mongodump --uri="mongodb://127.0.0.1:27017/database" --gzip --out=/dump/`date +%Y%m%d` # 導出指定數據庫並壓縮
mongodump --uri="mongodb://127.0.0.1:27017" --oplog # 導出oplog ,需要開啟副本集
mongodump --uri="mongodb://127.0.0.1:27017/database" --excludeCollection=users # 排除指定集合
mongodump --uri="mongodb://127.0.0.1:27017/database" --archive=`date +%Y%m%d`.archive # 導出歸檔文件
mongodump還原
mongorestore --uri="mongodb://127.0.0.1:27017/" --db=database /dump/20210818/database/ # 還原指定數據庫
mongorestore --uri="mongodb://127.0.0.1:27017/" --db=database --collection=collection /dump/20210818/database/collection.bson # 還原指定集合
mongorestore --uri="mongodb://127.0.0.1:27017/" --archive=20210818.archive # 從歸檔文件還原
mongorestore --uri="mongodb://127.0.0.1:27017/" --archive=20210818.archive --dryRun --verbose # 嘗試還原
mongorestore --uri="mongodb://127.0.0.1:27017/" --gzip # 從壓縮文件中還原
mongorestore --uri="mongodb://127.0.0.1:27017/" --gzip --nsInclude=db1.user* --nsInclude=test.* # 還原指定數據庫/集合
優缺點
優點
- 備份恢復小型mongoDB集群更簡單和效率,備份文件占有的空間更少(只備份文檔,不備份索引)
- 備份過程中應用可以繼續修改數據(記錄oplog,通過--oplog選項達到數據狀態一致)
缺點
- 備份的數據庫中不包含local數據庫,只備份數據庫的文檔不備份數據庫索引,因此恢復后必須重建索引
- 備份恢復大型mogoDB集群不理想(效率不高)
- 備份時會影響運行中的mongod的性能(產生網絡流量)
- 備份的數據比系統內存大時,查詢操作會引起頁錯誤
- mongodump不同版本的格式不能兼容,不要使用新版本的mongodump備份老版本的數據
問題及解決方法
錯誤信息 | 解決方法 |
---|---|
Implicit TCP FastOpen unavailable. If TCP FastOpen is required | rm -f /tmp/mongodb-27017.sock && service mongod restart |