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 |