七叶笔记 » 数据库 » 分布式文档存储数据库之MongoDB备份与恢复的实践详解

分布式文档存储数据库之MongoDB备份与恢复的实践详解

  备份所有数据库

  提示:-u用于指定用户,-p指定对应用户的密码,-h指定数据库地址,--authenticationDatabase 指定验证用户和密码对应的数据库 -o指定要存放备份文件的目录名称;

  只备份单个testdb数据库

  提示:-d用户指定要备份的数据库名称;

  只备份testdb下的test集合

  提示:-c用于指定要备份的集合(collection)名称;

  压缩备份testdb库

  提示:可以看到使用压缩,只需要加上--gzip选项即可,备份出来的数据就是.gz后缀结尾的压缩文件;

  压缩备份testdb库下的test集合

  使用mongorestore恢复数据

  在node12上删除testdb

  全量恢复所有数据库

 提示:--drop用于指定,恢复是如果对应数据库或者colleciton存在,则先删除然后在恢复,这样做的目的是保证恢复的数据和备份的数据一致;

  验证:登录192.168.0.52:27017查看对应testdb数据库是否恢复?

  恢复单个库

  删除testdb库

 使用mongorestore恢复testdb库

  恢复单个集合

  删除testdb下的test集合

  使用mongorestore恢复testdb下的test集合

 使用压缩文件恢复数据库

  删除testdb数据库

  使用mongorestore工具加载压缩文件恢复数据库

  提示:使用mongorestore恢复单个库使用-d选线指定要恢复的数据库,恢复单个集合使用-c指定集合名称即可,以及使用压缩文件恢复加上对应的--gzip选项即可,总之,备份时用的选项在恢复时也应当使用对应的选项,这个mongodump备份使用的选项没有特别的不同;

  使用mongoexport备份数据

  新建peoples数据库,并向peoples_info集合中插入数据

  使用mongoexport工具peoples库下的peoples_info集合

  提示:使用--type可以指定导出数据文件的格式,默认是json格式,当然也可以指定csv格式;这里还需要注意mongoexport这个工具导出数据必须要指定数据库和对应集合,它不能直接对整个数据库下的所有集合做导出;只能单个单个的导;

  导出csv格式的数据文件

  提示:导出指定格式为csv时,必须用-f选项指定导出的字段名称,分别用逗号隔开;

  将数据导入到node11的mongodb上

  导入json格式数据

  提示:导入数据时可以任意指定数据库以及集合名称;

  验证:查看node11上的testdb库下是否有peoples_info集合?集合中是否有数据呢?

  导入csv格式数据到node12上的testdb库下的test1集合中去

 提示:导入csv格式的数据需要明确指定类型为csv,然后使用--headerline指定不导入第一行列名,--file使用用于指定csv格式文件的名称;

  验证:登录node12的mongodb,查看testdb库下是否有test1集合?对应集合是否有数据呢?

  提示:可以看到testdb库下的test1结合就没有classes字段信息了,这是因为我们导出数据时没有指定要导出classes字段,所以导入的数据当然也是没有classes字段信息;以上就是mongodump/mongorestore和mongoexport/mongoimport工具的使用和测试;

  全量备份加oplog实现恢复mongodb数据库到指定时间点的数据

  在mongodump备份数据时,我们可以使用--oplog选项来记录开始dump数据到dump数据结束后的中间一段时间mongodb数据发生变化的日志;我们知道oplog就是用来记录mongodb中的集合写操作的日志,类似mysql中的binlog;我们可以使用oplog将备份期间发生变化的数据一起恢复,这样恢复出来的数据才是我们真正备份时的所有数据;

  模拟备份时,一边插入数据,一边备份数据

  在另外一边同时对数据做备份

  提示:可以看到现在备份就多了一个oplog.bson;

  查看oplog.bson中第一行记录的数据和第二行记录的数据

  提示:可以看到oplog中记录了id为54101-55016数据,这也就说明了我们开始dump数据时,到dump结束后,数据一致在发生变化,所以我们dump下来的数据是一个中间状态的数据;这里需要说明一点使用mongodump --oplog选项时,不能指定库,因为oplog是对所有库,而不针对某个库记录,所以--oplog只有在备份所有数据库生效;

  删除testdb数据库,然后基于我们刚才dump的数据做数据恢复

  使用mongorestore恢复数据

  提示:恢复是需要使用--oplogReplay选项来指定重放oplog.bson中的内容;从上面恢复日志可以看到从oplog中恢复了916条数据;也就是说从dump数据开始的那一刻开始到dump结束期间有916条数据发生变化;

  验证:连接数据库,看看对应的testdb库下的test3集合恢复了多少条数据?

  提示:可以看到test3集合恢复了55016条数据;刚好可以和oplog.bson中的最后一条数据的id对应起来;

  备份oplog.rs实现指定恢复到某个时间节点

  为了演示容易看出效果,我这里从新将数据库清空,关闭了认证功能

  插入数据

  同时备份数据,这次不加--oplog选项

  提示:我们在一边插入数据,一边备份数据,从上面的被日志可以看到,我们备份testdb库下的test集合16377条数据,很显然这不是testdb.test集合的所有数据;我们备份的只是部分数据;正常情况等数据插入完成以后,testdb.test集合应该有100000条数据;

  验证:查看testdb.test集合是否有100000条数据?

  模拟误操作删除testdb.test集合所有数据

  提示:现在我们不小心把testdb.test集合给删除了,现在如果用之前的备份肯定只能恢复部分数据,怎么办呢?我们这个时候可以导出oplog.rs集合,这个集合就是oplog存放数据的集合,它位于local库下;

  备份local库中的oplog.rs集合

  提示:oplog存放在local库下的oplog.rs集合中,以上操作就是备份所有的oplog;现在我们准备好一个oplog,但是现在还不能直接恢复,如果直接恢复,我们的误操作也会跟着一起重放没有任何意义,现在我们需要找到误操作的时间点,然后在恢复;

  在oplog中查找误删除的时间

  提示:我们要恢复到第一次删除前的数据,我们就选择第一条日志中的$timestamp字段中的{"t":1605490915,"i":1};这个就是我们第一次删除的时间信息;

  复制oplog.rs.bson到备份的数据目录为oplog.bson,模拟出使用--oplog选项备份的备份环境

  在使用mongorestore进行恢复数据,指定恢复到第一次删除数据前的时间点所有数据

  提示:从上面的恢复日志可以看到oplog恢复了100008条,备份的16377条数据也成功恢复;

  验证:查看testdb.test集合是否恢复?数据恢复了多少条呢?

 提示:可以看到testdb.test集合恢复了100000条数据;

  以上就是mongodb的备份与恢复相关话题的实践;

到此这篇关于分布式文档存储数据库之MongoDB备份与恢复的文章就介绍到这了,更多相关MongoDB备份与恢复内容请搜索七叶笔记以前的文章或继续浏览下面的相关文章希望大家以后多多支持七叶笔记!

相关文章