暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MongoDB全量/增量的备份/恢复

数据库笔记 2020-07-22
5409

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


                      文章转载自数据库笔记,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                      评论