MongoDB现有备份恢复方案:
1. mongodump/mongorestore(BSON)
2. mongoexport/mongoimport(JSON,CSV)
3. MongoDB cloud service Atlas(incremental backup/snapshot)
4. Filesystem Snapshots(lvm,Amazon’s EBS storage system for EC2)
5. cp or rsync(lock database)
6 Percona Backup MongoDB
其中支持全量+增量备份,恢复的工具为mongodump/mongorestore。虽然mongodump/mongorestore为逻辑备份,在大型MongoDB系统中,备份/恢复效率较差,但是却具备增量备份/恢复的功能。这次进行一下全量+增量备份,恢复的测试
环境准备:
本次测试基于MongoDB副本集:
centos 7.3:
192.168.56.108 primary
192.168.56.109 secondary
192.168.56.110 arbiter
192.168.56.111 nfs server
MongoDB server:4.2.7
MongoDB client:4.0.19(4.2.x版本在增量备份时对特殊字符的支持有变动)
数据准备:
全量备份:
可在副本集任一节点执行,最好在从库: PS:mongodump备份时不需要锁库,可以通过--oplog参数将备份时段的变更记录以日志形式一起备份出来(单实例不支持oplog)
/usr/local/mongo/bin/mongodump -u admin -p 123456 -h localhost --port 27017 --authenticationDatabase admin --oplog -o var/lib/mongobak/mongodump_`date +%Y-%m-%d_%H:%M:%S`
mongodump全量备份会转储admin库下的users和version,所有的用户库和备份时段内的oplog
转储格式为bson格式的数据文件和json格式的元数据文件
全量备份单实例不能加--oplog,oplog只有在集群初始化时才会创建,用于复制。单实例没有oplog,指定--oplog会报错
增量备份(日志备份):
只有副本集可以增量备份,单实例没有oplog无法增备
根据全量备份时段备份的的oplog,获取全量备份完成的时间戳:
bsondump oplog.bson
可以得出时间戳为(1593309601,1),后期可以通过脚本解析json直接获取
这里说明一下:
MongoDB中的时间戳为(timestamp,i)的形式,其中timestamp为十位时间戳,精确到秒,i表示累增序数,记录着该时间戳内有多少并发操作。
主库插入两条记录:
基于时间戳的增量备份:
/usr/local/mongo/bin/mongodump -u admin -p 123456 -h localhost --port 27017 --authenticationDatabase admin -d local -c oplog.rs --query '{ts:{$gt:Timestamp(1593309601,1)}}' -o var/lib/mongobak/mongodump_oplog_`date +%Y-%m-%d_%H:%M:%S`
全量恢复:
mongorestore恢复时,需要服务开启且停止业务写入,防止数据恢复时写入导致数据错乱
同机(副本集)全量恢复
同副本集的恢复,需要指定主库ip,在主库上做恢复,通过oplog同步给从库
/usr/local/mongo/bin/mongorestore -h 192.168.56.108 -u admin -p 123456 --authenticationDatabase admin --oplogReplay --dir var/lib/mongobak/mongodump_2020-06-28_10\:06\:02/
PS:mongorestore只针对insert做恢复,不会恢复update。对于同一个_id的文档,mongorestore会认定为重复并跳过。
可以使用--drop,在import前先删除collection:
/usr/local/mongo/bin/mongorestore -h 192.168.56.108 -u admin -p 123456 --authenticationDatabase admin --oplogReplay --dir var/lib/mongobak/mongodump_2020-06-28_10\:06\:02/
异机单实例全量恢复
新建虚机:192.168.56.112,挂载NFS拉取上述副本集的备份
/usr/local/mongo/bin/mongorestore -h localhost -u admin -p 123456 --authenticationDatabase admin --oplogReplay --dir var/lib/mongobak/mongodump_2020-06-28_10\:06\:02/
可以正常恢复
增量恢复:
同机(副本集)增量恢复
/usr/local/mongo/bin/mongorestore -h 192.168.56.108 -u admin -p 123456 --authenticationDatabase admin --oplogReplay --dir /var/lib/mongobak/mongodump_oplog_2020-06-28_16:06:00
异机单实例增量恢复
在192.168.56.112上基于上面全量恢复后的增量恢复
/usr/local/mongo/bin/mongorestore -h localhost -u admin -p 123456 --authenticationDatabase admin --oplogReplay --dir /var/lib/mongobak/mongodump_oplog_2020-06-28_16:06:00