MongoDB备份恢复

备份

MongoDB 逻辑备份 物理备份
备份效率 低 数据库接口读取数据 高 拷贝物理文件
恢复效率 低 下载备份集 + 导入数据 + 建立索引 高 下载备份集 + 启动进程
备份影响 大 直接与业务争抢资源
备份集大小 比原库小 无需备份索引数据 与原库相同
兼容性 兼容绝大部分版本 可跨存储引擎 依赖存储布局
方式一:对服务器进行备份
  • 文件系统快照,满足两个条件
    1. 文件系统本身支持快照技术
    2. 运行mongo时必须开启日志系统,恢复时需确保mongod停止】
  • 复制数据文件:⚠️如果启用身份验证,调用锁定和解锁命令期间不要关闭shell,断开可能导致无法重新链接必须重启,重启后锁定失效。
  • 锁定所有数据库,禁止任何写入:
    1. db.fsyncLock()
      //同步刷新脏页到磁盘以确保数据目录中文件最新且不会更改
    2. cp -R /data/db/* /backup/
      //复制数据目录所有文件
    3. db.fsyncUnlock()
      //解锁数据库正常处理写入操作
  • 停止数据库后复制数据目录下所有文件:
    1. cp -R /backup/* /data/db/
      //恢复数据库时需要确保数据库处于停止状态,且待恢复的数据目录为空
    2. mongod -f mongod.conf
      //可以使用这种方式备份单个数据库,复制所有名为myDB.*的文件,再复制到数据目录中即可【需要确保上一次数据库正常关闭】

#######方式二:mongodump
备份和恢复速度较慢,可用于备份单独的数据库、集合、集合中的子集

#mongodump -u=root -p=passwd --port 27017
2019-05-27T15:13:31.126+0800    writing admin.system.users to 
2019-05-27T15:13:31.152+0800    done dumping admin.system.users (1 document)
2019-05-27T15:13:31.152+0800    writing admin.system.version to 
2019-05-27T15:13:31.176+0800    done dumping admin.system.version (2 documents)
2019-05-27T15:13:31.176+0800    writing company.devlop to 
2019-05-27T15:13:31.204+0800    done dumping company.devlop (4 documents)

#ll ./dump/
drwxr-xr-x 2 root root 128 May 27 15:13 admin
drwxr-xr-x 2 root root  53 May 27 15:13 company

#ll ./dump/company/
-rw-r--r-- 1 root root 147 May 27 15:13 devlop.bson
-rw-r--r-- 1 root root 128 May 27 15:13 devlop.metadata.json

#bsondump ./dump/company/devlop.bson
{"_id":{"$oid":"5ce7b5000b9b328bb52320fb"},"name":"chun"}
{"_id":{"$oid":"5ce7bad70b9b328bb52320fc"},"name":"miao"}
{"_id":{"$oid":"5ce7bae10b9b328bb52320fd"},"name":"zhao"}
{"_id":{"$oid":"5ce7baea0b9b328bb52320fe"},"name":"min"}
2019-05-27T15:15:11.993+0800    4 objects found

副本集备份

推荐使用文件系统快照或复制数据文件方式备份,在应用于副本集备份节点时无需做修改
使用mongodump备份,需要在备份时使用--oplog得到基于某时间点的快照,否则备份状态不会和任何其他集群成员状态吻合,恢复时也必须创建oplog,否则被恢复的成员不知道应该同步到哪里。

分片集群备份

通常单独备份配置服务器和副本集;
如果给mongodump一个副本集连接字串,会自动选择一个备份节点进行转储;
对分片集群进行备份和恢复操作之前需要关闭均衡器;

  1. 备份恢复整个集群
    备份1:关闭均衡器,通过mongos运行mongodump,在mongodump运行的机器上建立所有分片的备份
    恢复1:关闭均衡器,运行mongorestore并连接到一个mongos
    备份2:关闭均衡器,使用文件系统快照或复制数据目录方式备份配置服务器和每一个分片【不可能在完全相同的时刻得到备份可能会造成问题】
  2. 备份恢复单独分片
    1 单独服务器备份恢复方式进行备份恢复
    2 假设3天前对集群进行了备份,某一分片磁盘损坏,几天里新数据块移动到该分片上,备份中不包含新增的数据块,可以通过使用配置文件服务器的备份找到新增数据块在3天前的位置,过程比较复杂,多数情况下忽略新增数据块。

恢复

恢复
mongorestore -h <:port> -d dbname
如果转储数据库时使用--oplog 恢复时必须使用--oplogReplay
如果在运行的服务器上进行数据替换,可以使用--drop选项,在恢复一个集合之前先删除

⚠️备份过程中,系统继续写入情况:要保证得到的备份数据与备份完成时一致,需要在运行mongod时使用--replset选项 ,mongodump添加--oplog 选项,这样会将转储过程中服务器进行的操作记录下来,恢复时会重新执行这些操作,这样就可以得到原服务器上某一时间点的数据快照。
⚠️尽量使用同版本mongodump和mongorestore --version查看版本

你可能感兴趣的:(MongoDB备份恢复)