MongoDB数据库备份mongodump以及恢复mongorestore工具实践

摘要

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.oplog

master/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参数说明

[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	done


easydb: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 test

easydb: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 test

easydb:PRIMARY> show collections
easydb

easydb: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/backup

easydb: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/backup

easydb:PRIMARY> db.easydb.count()
30000
再次检查,发现30000条数据已经全部恢复

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

完结

以上就是MongoDB数据库备份(mongodump)以及恢复(mongorestore)工具实践的所有内容,欢迎小伙伴们交流讨论。

原文地址:https://cloud.tencent.com/developer/article/2000614

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


文章浏览阅读552次。com.mongodb.MongoQueryException: Query failed with error code 292 and error message 'Executor error during find command :: caused by :: Sort exceeded memory limit of 104857600 bytes, but did not opt in to external sorting.' on server 11.51.141.63:27017 _mongodb 大文件 下载失败
文章浏览阅读635次,点赞9次,收藏8次。MongoDB 是一种 NoSQL 数据库,它将每个数据存储为一个文档,这里的文档类似于 JSON/BSON 对象,具体数据结构由键值(key/value)对组成。
文章浏览阅读2.1k次。和。_mongodb 日期类型
文章浏览阅读1.7k次。Scalestack等客户期待使用MongoDB Atlas Vector Search和Amazon Bedrock构建下一代应用程序
文章浏览阅读970次。SpringBoot整合中间件mongodb、ES_springboot3 elasticsearch json数据
文章浏览阅读673次。MongoDB 简介_尚医通sql
文章浏览阅读1k次,点赞8次,收藏9次。官网下载MongoDB安装包后进行解压(因了解并不深入,故暂不进行详细说明,自行查找其他安装方法,后期了解深入后将进行该教程的完善)在bin目录下使用命令启动:./mongod --config …/mongodb.conf。该文章任然处于完善中,如果存在错误遗漏的地方,欢迎私信联系。安装相关的nuget包后即可通过以下方法连接数据。YX9010_0@的第二十篇文章。
文章浏览阅读1.2k次,点赞17次,收藏26次。社交场景, 使用 MongoDB 存储存储用户信息, 以及用户发表的朋友圈信息, 通过地理位置索引实现附近的人, 地点等功能.游戏场景, 使用 MongoDB 存储游戏用户信息, 用户的装备, 积分等直接以内嵌文档的形式存储, 方便查询, 高效率存储和访问.物流场景, 使用 MongoDB 存储订单信息, 订单状态在运送过程中会不断更新, 以 MongoDB 内嵌数组的形式来存储, 一次查询就能将订单所有的变更读取出来.物联网场景, 使用 MongoDB 存储所有接入的智能设备信息, 以及设备汇报的日
文章浏览阅读686次。您可以使用 update_one() 方法来更新 MongoDB 中调用的记录或文档。update_one() 方法的第一个参数是 query 对象,用于定义要更新的文档。注释:如果查询找到多个记录,则仅更新第一个匹配项。第二个参数是定义文档新值的对象。_python 更新 mongodb 数据
文章浏览阅读1.3k次。首先来学习一下nosql这里安装就不进行介绍 只记录一下让自己了解mongodb。_nosql注入
文章浏览阅读4.1k次,点赞8次,收藏7次。在data的目录下,创建一个db文件。因为启动MongoDB服务之前必须创建数据库文件的存放文件夹,否则命令不会自动创建,而且不能启动成功。第一步:安装时,Custom是指可以自定义安装路径,然后傻瓜式安装即可(注意:先不要安装图形化工具,否则安装时间会特别长):如果要想连接成功,必须要开服务,即mongod -dbpath C:MongoDBdatadb的cmd要一直开着。然后回车,ctrl+F输入port找到端口号,一般为:27017。打开命令行,然后找到bin文件地址,并输入。_mongodb windows安装
文章浏览阅读5.1k次,点赞3次,收藏43次。详细介绍MongoDB数据库的基本知识,安装方法,基本操作,_mongodb数据库
文章浏览阅读3.2k次。安装教程翻看以往文章。_navicat 连接mongodb
文章浏览阅读426次,点赞9次,收藏12次。win10开放端口:https://blog.csdn.net/m0_43605481/article/details/119255256。我的是阿里云服务器,所以直接在安全组中加入规则,端口范围:27017,授权对象:0.0.0.0。windows在mongodb安装文件夹的bin文件夹中的mongod.cfg。数据库名字是test,打算创建一个用户,账号aaa,密码bbb,权限readWrite。因为该用户是创建在test数据库的,所以在最后要加上test。O了,然后恢复了test的数据。
文章浏览阅读1.1k次。聚合操作主要用于处理数据并返回计算结果。聚合操作将来自多个文档的值组合在一起,按条件分组后,再进行一系列操作(如求和、平均值、最大值、最小值)以返回单个结果。MongoDB的聚合查询​聚合是MongoDB的高级查询语言,它允许我们通过转化合并由多个文档的数据来生成新的在单个文档里不存在的文档信息。MongoDB中聚合(aggregate)主要用于处理数据(例如分组统计平均值、求和、最大值等),并返回计算后的数据结果,有点类似sql语句中的count(*)、groupby。..._如何将几个db的数据统整在一起做查询
文章浏览阅读680次,点赞7次,收藏8次。(2)application.properties配置文件。(4)UserService类。(5)测试和测试结果。
文章浏览阅读1k次,点赞17次,收藏25次。Studio 3T 2023.9 (macOS, Linux, Windows) - MongoDB 的专业 GUI、IDE 和 客户端,支持自然语言查询_mongodb客户端
文章浏览阅读1.1k次,点赞32次,收藏27次。插件式的存储引擎架构可以实现 Server 层和存储引擎层的解耦,可以支持多种存储引擎,如 MySQL 既可以支持 B-Tree 结构的 InnoDB 存储引擎,还可以支持 LSM 结构的 RocksDB 存储引擎。MongoDB 中的记录就是一个 BSON 文档,它是由键值对组成的数据结构,类似于 JSON 对象,是 MongoDB 中的基本数据单元。的简称,是 JSON 文档的二进制表示,支持将文档和数组嵌入到其他文档和数组中,还包含允许表示不属于 JSON 规范的数据类型的扩展。
文章浏览阅读5.1k次,点赞6次,收藏96次。本文设计了一种基于智能室内温度控制的自动调速风扇。以STM32系列单片机为核心主控板,通过程序代码驱动和使用温度传感器模块实现对环境温度的实时监测,并可以实时显示环境温度。同时,可以设置温度检测的上下警告值,根据需求自行调节。_stm32 温控风扇
文章浏览阅读898次,点赞13次,收藏21次。在MongoDB中,我们使用find()和find_one()方法来在集合中查找数据,就像在MySQL数据库中使用SELECT语句来在表中查找数据一样。_pymongo find_one