0. 环境
在测试环境下,创建了一台虚拟机,搭建了3节点的副本集;将端口区分开,节点1选举的优先级最高。使用版本:3.6.3
测试部署配置表:
主机 | 节点 | 端口 | 角色 |
---|---|---|---|
xx.xx.10.203 | 节点1 | 27017 | PRIMARY |
xx.xx.10.203 | 节点2 | 27018 | SECONDARY |
xx.xx.10.203 | 节点3 | 27019 | SECONDARY |
1. 逻辑备份
1. 备份
普通备份
# mongodump -h xx.xx.10.203 -uroot -proot123 --authenticationDatabase admin -d hu -o /file/testbk/
压缩备份
# mongodump -h xx.xx.10.203:27017 -uroot -proot123 --archive=/file/testbk/hu111.gz --gzip --db hu --authenticationDatabase admin
2. 还原
# mongorestore -h xx.xx.10.203 -uroot -proot123 --authenticationDatabase admin -d hu /file/testbk/hu/
还原库时追加的路径在库名的层级上
3. bson文件
# bsondump xxx.bson > xxx.log
# bsondump --bsonFile=xxx.bson --outFile=xxx.log
转换bson文件可读,xxx.log 即为正常可读文件
4. 参数说明
--authenticationDatabase:认证库
-h:指定地址,可以是ip或ip+port
-u:用户
-p:密码
-d:备份的库名,无则备份全库
-o:指定备份地址,无则默认备份在当前路径的dump下
--gzip:gzip压缩
--oplog:备份oplog文件信息
2. oplog备份还原
1. 模拟集合montab插入1000条文档:(test库)
> for(var i = 0; i < 1000; i++) {db.montab.insert({test: i});}
2. 查看集合:
> db.montab.count()
1000
3. 备份整个test库:
# mongodump -h xx.xx.10.203:27017 -uroot -proot123 --authenticationDatabase admin -o /file/testbk/m1/ -d test
4. 新增3条文档:
> db.montab.insert({"test":2000})
> db.montab.insert({"test":3000})
> db.montab.insert({"test":4000})
5. 查看集合:
> db.montab.count()
1003
6. 删除集合,之后模拟恢复1003条数据,或者1001/1002条:
> db.montab.drop()
true
7. 备份整个oplog文件:(目的便于查找时间节点)
# mongodump -h xx.xx.10.203:27017 -uroot -proot123 --authenticationDatabase admin -o /file/testbk/m2/ -d local -c oplog.rs
8. 转化文件,找出第3步骤后到第6步骤之间的时间点,并备份该时间段的oplog:
# bsondump oplog.rs.bson > x.log
{"ts":{"$timestamp":{"t":1578018876,"i":1}},"t":{"$numberLong":"2"},"h":{"$numberLong":"9120523196018810304"},"v":2,"op":"n","ns":"","wall":{"$date":"2020-01-03T02:34:36.215Z"},"o":{"msg":"periodic noop"}}
{"ts":{"$timestamp":{"t":1578018916,"i":1}},"t":{"$numberLong":"2"},"h":{"$numberLong":"-5940720223521682290"},"v":2,"op":"n","ns":"","wall":{"$date":"2020-01-03T02:35:16.215Z"},"o":{"msg":"periodic noop"}}
备份oplog:
# mongodump -h xx.xx.10.203:27017 -uroot -proot123 --authenticationDatabase admin -o /file/testbk/o1/ -d local -c oplog.rs -q '{ts:{$lt:Timestamp(1578018916, 1),$gt:Timestamp(1578018876, 1)}}'
(存入之前第3步骤路径,与库名的地址同级 # mv /file/testbk/o1/local/oplog.rs.bson /file/testbk/m1/oplog.bson )
9. 直接恢复到1003条数据:
# mongorestore -h xx.xx.10.203:27017 -uroot -proot123 --authenticationDatabase admin --oplogReplay /file/testbk/m1/
查看集合:
> db.montab.count()
1003
10.恢复到1001/1002/1003之间任意时间点数据:
{test:999 时间戳1 1578018859 }
{ 时间戳2 1578018876 }
{test:2000 时间戳3 1578018886 }
{test:3000 时间戳4 1578018889 }
{test:4000 时间戳5 1578018892 }
{ 时间戳6 1578018916 }
第8步骤备份的oplog就是时间戳2到时间戳6之间的,所以 --oplogLimit后指向时间戳3与6之间的任意时间点,就可以恢复到不同时间的数据。
# mongorestore -h xx.xx.10.203:27017 -uroot -proot123 --authenticationDatabase admin --oplogReplay --oplogLimit 1578018889:1 /file/testbk/m1/
3. 延迟节点备份还原
1. 配置延迟节点
配置节点3延迟120s(2分钟):
> cfg=rs.conf()
> cfg.members[2].priority=0
0
> cfg.members[2].hidden=true
true
> cfg.members[2].slaveDelay=120
120
> rs.reconfig(cfg)
确认节点同步时间:
> db.printSlaveReplicationInfo()
source: xx.xx.10.203:27018
syncedTo: Fri Jan 03 2020 14:06:06 GMT+0800 (CST)
10 secs (0 hrs) behind the primary
source: xx.xx.10.203:27019
syncedTo: Fri Jan 03 2020 14:04:06 GMT+0800 (CST)
130 secs (0.04 hrs) behind the primary
2. 模拟备份
节点1模拟产生1000条数据,
1分钟后删除节点1中数据,
在第2分钟后,备份节点3中刚同步好的数据
在节点1中恢复节点3的备份
# mongodump -h xx.xx.10.203:27019 -uroot -proot123 --authenticationDatabase admin -o /file/testbk/m1/ -d test
# mongorestore -h xx.xx.10.203:27017 -uroot -proot123 --authenticationDatabase admin /file/testbk/m1/
[其他复杂情况,如新增数据,删除,再新增,这类想要去除删除的部分,恢复所有新加数据,只要有最初备份,和不超过oplog窗口时间的oplog备份,就可以参照oplog的备份方式进行还原]