mongodump备份工具

  • mongodump能够在Mongodb运行时进行备份,它的工作原理是对运行的Mongodb做查询,然后将所有查到的文档写入磁盘。
  • mongodump的参数与mongoexport的参数基本一致

正文

1.1 mongodump关键参数如下所示:

mongodump --help 查看帮助命令

  • -h,--host :代表远程连接的数据库地址,默认连接本地Mongo数据库;
  • --port:代表远程连接的数据库的端口,默认连接的远程端口27017;
  • -u,--username:代表连接远程数据库的账号,如果设置数据库的认证,需要指定用户账号;
  • -p,--password:代表连接数据库的账号对应的密码;
  • -d,--db:代表连接的数据库;
  • -c,--collection:代表连接数据库中的集合;
  • -o, --out:代表导出的文件输出目录;
  • -q, --query:代表查询条件;
  • -j,--numParallelCollections =要并行转储的集合数(默认为4)
  • --gzip,使用Gzip压缩存档;
  • --oplog,使用oplog进行时间点快照;
  • --authenticationDatabase,指定用户鉴定库

1.2 mongodump参数实践

全库备份

mongodump -u -p --port 28020 --authenticationDatabase admin -o /tmp/backup

备份指定的库,test库

mongodump -u -p --port 28020 --authenticationDatabase admin -d test -o /tmp/backup

备份test库下的customer集合

mongodump -u -p --port 28020 --authenticationDatabase admin -d test -c customer -o /tmp/backup

压缩备份

压缩备份单库
mongodump -u -p --port 28020 --authenticationDatabase admin -d test -o /tmp/backup --gzip压缩备份单表
mongodump -u -p --port 28020 --authenticationDatabase admin -d test -c customer -o /tmp/backup --gzip

2.mongorestore恢复工具

2.1 mongorestore关键参数如下所示:

mongodump --help 查看帮助命令

  • -h,--host :代表远程连接的数据库地址,默认连接本地Mongo数据库;
  • --port:代表远程连接的数据库的端口,默认连接的远程端口27017;
  • -u,--username:代表连接远程数据库的账号,如果设置数据库的认证,需要指定用户账号;
  • -p,--password:代表连接数据库的账号对应的密码;
  • -d,--db:代表连接的数据库;
  • -c,--collection:代表连接数据库中的集合;
  • -o, --out:代表导出的文件输出目录;
  • --dir = <目录名称>输入目录
  • --drop导入前删除数据库中集合;
  • --gzip,解压Gzip压缩存档还原;
  • --oplog,重放oplog以基于时间点还原;
  • --oplogFile = <文件名>指定重播oplog的oplog文件
  • --authenticationDatabase,指定用户鉴定库

2.2 mongorestore参数实践

单库恢复

mongorestore -u -p --port 28018 --authenticationDatabase admin -d test /tmp/backup/test

复制

恢复test库下的customer集合

mongorestore -u -p --port 28018 --authenticationDatabase admin -d test -c customer /tmp/backup/test/customer.bson

复制

--drop参数实践恢复

恢复的时候,先删除当前数据,然后恢复备份的数据。就是说,备份后添加修改的数据都会被删除,谨慎使用!!!

# 恢复单库
mongorestore -u -p --port 28018 --authenticationDatabase admin -d test --drop /tmp/backup/test# 恢复单表
mongorestore -u -p --port 28018 --authenticationDatabase admin -d test -c customer --drop /tmp/backup/test/customer.bson

--gzip参数实践恢复

mongorestore -u -p --port 28018 --authenticationDatabase admin --gzip /tmp/backup

3.MongoDB中的oplog

3.1 什么是oplog

  • 当Primary进行写操作的时候,会将这些写操作记录写入Primary的Oplog中,而后Secondary会将Oplog 复制到本机并应用这些操作,从而实现Replication的功能。
  • 同时由于其记录了Primary上的写操作,故还能将其用作数据恢复。
  • 可以简单的将其视作Mysql中的binlog。
  • oplog为replica set或者master/slave模式专用(standalone模式运行mongodb并不推荐)--新消息频道

3.2 oplog相关的操作

  • 在replica set中oplog是一个定容集合(capped collection),它的默认大小是磁盘空间的5%(可以通过--oplogSizeMB参数修改)
  • 其中记录的是整个mongod实例一段时间内数据库的所有变更(插入/更新/删除)操作。当空间用完时新记录自动覆盖最老的记录。

oplog的位置:

oplog在local库: local.oplogmaster/slave 架构下:local.oplog.$main;replica sets 架构下:local.oplog.rs

oplog时间窗口覆盖时间

easydb:PRIMARY> rs.printReplicationInfo()
configured oplog size:   2048MB   <--集合大小
log length start to end: 524592secs (145.72hrs)  <--预计窗口覆盖时间
oplog first event time:  Fri Jan 08 2021 18:30:18 GMT+0800 (CST)
oplog last event time:   Thu Jan 14 2021 20:13:30 GMT+0800 (CST)
now:                     Thu Jan 14 2021 20:13:35 GMT+0800 (CST)

查看oplog内容

easydb:PRIMARY> use local
easydb:PRIMARY> db.oplog.rs.find().pretty()
{"ts" : Timestamp(1610101818, 1),"h" : NumberLong("-124421688313536398"),"v" : 2,"op" : "n","ns" : "","wall" : ISODate("2021-01-08T10:30:18.329Z"),"o" : {"msg" : "initiating set"}
}

3.3 oplog数据结构

下面来分析一下oplog中字段的含义,通过下面的命令取出一条oplog:

db.oplog.rs.find().skip(1).limit(1).toArray()

easydb:PRIMARY> use local
switched to db local
easydb:PRIMARY> db.oplog.rs.find().skip(1).limit(1).toArray()
[{"ts" : Timestamp(1610101831, 1),"t" : NumberLong(1),"h" : NumberLong("-5190685117971188188"),"v" : 2,"op" : "n","ns" : "","wall" : ISODate("2021-01-08T10:30:31.356Z"),"o" : {"msg" : "new primary"}}
]
  • ts: 8字节的时间戳,由4字节unix timestamp + 4字节自增计数表示。这个值很重要,在选举(如master宕机时)新primary时,会选择ts最大的那个secondary作为新primary
  • op:1字节的操作类型
    • "i": insert
    • "u": update
    • "d": delete
    • "c": db cmd
    • "db":声明当前数据库 (其中ns 被设置成为=>数据库名称+ '.')
    • "n": no op,即空操作,其会定期执行以确保时效性
  • ns:操作所在的namespace
  • o:操作所对应的document,即当前操作的内容(比如更新操作时要更新的的字段和值)
  • o2: 在执行更新操作时的where条件,仅限于update时才有该属性

3.4 --oplog参数说明

mongodump --oplog参数说明

  • 该参数的主要作用是在导出的同时生成一个oplog.bson文件,存放在你开始进行dump到dump结束之间所有的oplog。
  • oplog 官方说明: Replica Set Oplog — MongoDB Manual
[root@mysql02 ~]# mongodump --help
--oplog     use oplog for taking a point-in-time snapshot

复制

mongorestore --oplog参数说明

参数

参数说明

--oplogReplay

重放oplog.bson中的操作内容

--oplogLimit

与--oplogReplay一起使用时,可以限制重放到指定的时间点

3.5 mongodump使用--oplog参数备份

首先我们在mongodb中模拟一个不断有插入操作的集合foo

use test
for(var i = 0; i < 10000; i++) {db.foo.insert({a: i});
}

然后在插入过程中模拟一次mongodump全备,并添加--oplog参数

[root@mysql02 ~]# mongodump -u -p --port 28018 --authenticationDatabase admin --oplog -o /tmp/backup
2021-01-14T20:51:15.254+0800   writing admin.system.version to
2021-01-14T20:51:15.255+0800   done dumping admin.system.version (1 document)
2021-01-14T20:51:15.255+0800   writing test.foo to
2021-01-14T20:51:15.474+0800   done dumping test.foo (1701 documents)
2021-01-14T20:51:15.483+0800   writing captured oplog to
2021-01-14T20:51:15.509+0800       dumped 73 oplog entries[root@mysql02 ~]# ll /tmp/backup
总用量 12
drwxr-xr-x 2 root root    69 1月  14 20:51 admin
-rw-r--r-- 1 root root 10804 1月  14 20:51 oplog.bson
drwxr-xr-x 2 root root    47 1月  14 20:51 test从dump开始到结束的时间系统将记录所有的oplog到oplog.bson文件中

复制

注意:--oplog选项只对全库导出有效,所以不能指定-d选项。

3.6 mongorestore使用--oplog参数恢复

[root@mysql02 ~]# mongorestore -u -p --port 28018 --authenticationDatabase admin --oplogReplay --drop /tmp/backup
2021-01-14T21:13:52.134+0800   preparing collections to restore from
2021-01-14T21:13:52.144+0800   reading metadata for test.foo from /tmp/backup/test/foo.metadata.json
2021-01-14T21:13:52.199+0800   restoring test.foo from /tmp/backup/test/foo.bson
2021-01-14T21:13:52.291+0800   no indexes to restore
2021-01-14T21:13:52.291+0800   finished restoring test.foo (1701 documents)  <--表示test.foo集合中恢复了1701个文档
2021-01-14T21:13:52.291+0800   replaying oplog  <--表示重放了oplog中的所有操作
2021-01-14T21:13:52.407+0800   doneeasydb:PRIMARY> db.foo.count()
1771  <--所以实际比1701个多,因为应用了oplog中的数据

复制

这就是 oplog 配合 mongodump 实现热备功能

4.利用oplog实现任意时间点数据恢复

oplog有两种来源:

  • mongodump时加上--oplog选项,自动生成的oplog,这种方式的oplog直接 --oplogReplay 就可以恢复
  • 单独备份获取的oplog

例如:

mongodump  --port 28021 -d local -c oplog.rs

复制

4.1 模拟一个持续写入的生产环境

easydb:PRIMARY> use test
switched to db testeasydb:PRIMARY> for(i=0;i<30000;i++){ db.easydb.insert({"id":i,"name":"easydb.net","age":18,"date":new Date()}); }
WriteResult({ "nInserted" : 1 })

复制

4.2 插入数据的同时备份

[root@mysql02 ~]# mongodump -u -p --port 28018 --authenticationDatabase admin --oplog -o /tmp/backup
2021-01-15T11:46:14.449+0800   writing admin.system.version to
2021-01-15T11:46:14.451+0800   done dumping admin.system.version (1 document)
2021-01-15T11:46:14.452+0800   writing test.easydb to
2021-01-15T11:46:15.799+0800   done dumping test.easydb (20154 documents)
2021-01-15T11:46:15.805+0800   writing captured oplog to
2021-01-15T11:46:15.991+0800       dumped 1601 oplog entries

复制

4.3 备份完成后模拟一个错误的操作

easydb:PRIMARY> use test
switched to db testeasydb:PRIMARY> show collections
easydbeasydb:PRIMARY> db.dropDatabase()
{"dropped" : "test","ok" : 1,"operationTime" : Timestamp(1610682482, 2),"$clusterTime" : {"clusterTime" : Timestamp(1610682482, 2),"signature" : {"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),"keyId" : NumberLong(0)}}
}

复制

4.4 切割全备里的oplog,找出上次全备最后一个时间的数据

[root@mysql02 ~]# bsondump /tmp/backup/oplog.bson > /tmp/oplog.json
2021-01-16T17:28:56.252+0800   417 objects found
[root@mysql02 ~]# tail -1 /tmp/oplog.json
{"ts":{"$timestamp":{"t":1610789118,"i":416}},"t":{"$numberLong":"6"},"h":{"$numberLong":"8277197316656995929"},"v":2,"op":"i","ns":"test.easydb","ui":{"$binary":"JEUrQxOWS6Gw8vfPIetrqQ==","$type":"04"},"wall":{"$date":"2021-01-16T09:25:18.435Z"},"o":{"_id":{"$oid":"6002b0fe4994bdfbd2b0747e"},"id":17511.0,"name":"easydb.net","age":18.0,"date":{"$date":"2021-01-16T09:25:18.443Z"}}}{"t":1610789118,"i":416}就是上一次全备最后的时间戳

复制

4.5 导出上一次全备以后的增量数据

mongodump -u -p --port 28018 --authenticationDatabase admin -d local -c oplog.rs -q '{ts:{$gt:Timestamp(1610789118,416)}}' -o /tmp/oplog#这里填的是我们上一步截取的时间戳

复制

4.6 恢复最近一次全备的数据

mongorestore -u -p --port 28018 --authenticationDatabase admin --oplogReplay  /tmp/backupeasydb:PRIMARY> use test
switched to db test
easydb:PRIMARY> db.easydb.count()
17512检查全备恢复了多少条数据

复制

4.7 截取备份出来增量的oplog,找到误删库的时间点(limt)

  • 删库语句的上一个oplog时间戳为终点。
[root@mysql02 ~]# bsondump /tmp/oplog/local/oplog.rs.bson | grep -C 5 dropDatabase
{"ts":{"$timestamp":{"t":1610789163,"i":1}},"t":{"$numberLong":"6"},"h":{"$numberLong":"-8852159408511820267"},"v":2,"op":"n","ns":"","wall":{"$date":"2021-01-16T09:26:03.551Z"},"o":{"msg":"periodic noop"}}
{"ts":{"$timestamp":{"t":1610789168,"i":1}},"t":{"$numberLong":"6"},"h":{"$numberLong":"-8231808943143165392"},"v":2,"op":"c","ns":"test.$cmd","ui":{"$binary":"JEUrQxOWS6Gw8vfPIetrqQ==","$type":"04"},"wall":{"$date":"2021-01-16T09:26:08.735Z"},"o":{"drop":"easydb"}}
2021-01-16T17:51:45.426+0800   12587 objects found
{"ts":{"$timestamp":{"t":1610789168,"i":2}},"t":{"$numberLong":"6"},"h":{"$numberLong":"-1802663680461751854"},"v":2,"op":"c","ns":"test.$cmd","wall":{"$date":"2021-01-16T09:26:08.807Z"},"o":{"dropDatabase":1}}
{"ts":{"$timestamp":{"t":1610789183,"i":1}},"t":{"$numberLong":"6"},"h":{"$numberLong":"7216379125886047426"},"v":2,"op":"n","ns":"","wall":{"$date":"2021-01-16T09:26:23.551Z"},"o":{"msg":"periodic noop"}}

{"t":1610789168,"i":1}

将过滤出来的Unix时间戳进行转换,再次确认是不是误操作的时间点

4.8 复制增量的oplog到备份目录,重命名为oplog.bson,将原来的oplog.bson覆盖

cp /tmp/oplog/local/oplog.rs.bson /tmp/backup/oplog.bson

4.9 将增量的oplog进行恢复,添加之前找到的误删除的点(limt)

mongorestore -u -p --port 28018 --authenticationDatabase admin --oplogReplay --oplogLimit "1610789168:1"  /tmp/backupeasydb:PRIMARY> db.easydb.count()
30000
再次检查,发现30000条数据已经全部恢复

4.10 把恢复后的数据再做一次全备,至此一次恢复就完成了

MongoDB数据库备份(mongodump)以及恢复(mongorestore)工具实践相关推荐

  1. MongoDB备份(mongodump)与恢复(mongorestore)工具实践

    mongodump和mongorestore实践 1.mongodump备份工具 mongodump能够在Mongodb运行时进行备份,它的工作原理是对运行的Mongodb做查询,然后将所有查到的文档 ...

  2. MongoDB数据库备份(mongodump)以及恢复(mongorestore)

    mongodump关键参数如下所示: -h,--host :代表远程连接的数据库地址,默认连接本地Mongo数据库: --port:代表远程连接的数据库的端口,默认连接的远程端口27017: -u,- ...

  3. mongodb备份oplog_MongoDB 备份(mongodump)与恢复(mongorestore)

    MongoDB 备份(mongodump)与恢复(mongorestore) MongoDB数据备份 在Mongodb中我们使用mongodump命令来备份MongoDB数据.该命令可以导出所有数据到 ...

  4. 备份(mongodump)和恢复(mongorestore)

    备份(mongodump)和恢复(mongorestore) 拓荒者发表于运维经验分享订阅 182 助力数字生态,云产品优惠大促 腾讯云促销,1核1G 99元/1年,2核4G 1200元/3年 立即抢 ...

  5. MongoDB备份与恢复(3)—数据备份(mongodump)与恢复(mongorestore)

    转载自萌阔论坛  用户tingcheng  http://forum.foxera.com/mongodb/topic/176/mongodb%E5%A4%87%E4%BB%BD%E4%B8%8E%E ...

  6. Linux系统mongdb还原数据库,linux - mongodb备份mongodump、恢复mongorestore

    前言 服务器都会涉及到服务迁移或者备份恢复的时候,今天简单总结mongodb的备份与恢复. mongodump和mongorestore --备份单个表 mongodump -u superuser ...

  7. Linux系统mongdb还原数据库,linux下mongodb数据库备份与还原

    MongoDb数据库备份还原 数据库迁移,可视化工具NoSQLBooster for MongoDB 付费版才具有数据导入功能.代价过高,索性采起命令行web 数据备份 备份命令mongodb mon ...

  8. oracle备份还原到本地_Oracle 11g R2 RAC数据库备份通过RMAN恢复到单实例数据库实现...

    Oracle 11g R2 RAC数据库备份通过RMAN恢复到单实例数据库实现 下面是我的一次从Oracle 11g R2 RAC到单实例间通过RMAN恢复备份集的过程,记录在此. 有些人以此方法作为 ...

  9. window oracle 只有bak文件怎么恢复_Oracle 11g R2 RAC数据库备份通过RMAN恢复到单实例数据库实现...

    Oracle 11g R2 RAC数据库备份通过RMAN恢复到单实例数据库实现 下面是我的一次从Oracle 11g R2 RAC到单实例间通过RMAN恢复备份集的过程,记录在此. 有些人以此方法作为 ...

  10. 计算机系统灾难性恢复,企业数据库备份和灾难性恢复的关键途径研究

    [摘 要]在当今企业信息化建设步伐日益加快的新形势下,数据库技术在企业办公自动化等等各个方面都取得了非常广泛的应用,并且促进了企业办公效率的大幅度提高,也实现了企业办公成本的有效节约.然而,也应该看到 ...

最新文章

  1. iOS私有Api检测
  2. SqlServer数据库端口默认是1433吗?
  3. html事件绑定的方法,javascript实现简单的on事件绑定
  4. linux Shell(脚本)编程入门实例讲解详解
  5. etherum 常用命令及搭建私有链
  6. 打开tomcat的管理平台,管理应用
  7. 从入门到入土:恶意代码Lab03-03.exe|分析实验|运行截图|问题回答|
  8. 关于CSS 里的_width是什么意思???
  9. linux 内存清理/释放命令(也可用于openwrt和padavan等系统的路由器)
  10. 设计模式之简单工厂模式、工厂模式和抽象工厂模式
  11. 问学计算机的同学买什么电脑,学生用的笔记本电脑什么样的好
  12. Why you should not shrink your data files
  13. 搞笑生活短视频为何涨粉飞快?有三个原因,抓住用户心理是关键
  14. 【软件建模与UML】(持续更新)
  15. ArcGIS API for JavaScript开发之PopupTemplate
  16. 二次元PHP随机api接口源码,随机二次元图片API接口php源码
  17. 二维码读取之2d_data_codes_rectify_symbol.hdev
  18. linux 命令中的大于号、小于号的作用
  19. 条码标签打印软件制作学校考卷条码
  20. android点击手机返回键触发事件

热门文章

  1. 参加第13届全国男性健康日活动有感
  2. 调用第三方提供的webService服务
  3. 项目实战:《智慧线上购物商城》:基于vue3+vite+vant4组件(一)
  4. 微信公众号一次群发多条消息
  5. 直播预告:Quadro RTX显卡助力Twinmotion在建筑表现领域火力全开
  6. vue双向数据绑定原理
  7. Redis-基础知识
  8. 经验分享 | 如何拿到自己满意的offer?
  9. Python常见框架
  10. 周杰伦推荐 万魔新降噪豆 1MORE EVO 全新发布