mongodb备份与恢复

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的备份方式进行还原]


你可能感兴趣的:(蓝鲸,数据库,自动运维)