在生产环境中,存放数据的服务器仍有可能发生掉电、宕机以及其他无法预测的情况,为了确保数据的安全性,好一部分数据是需要做按时备份,并在灾难发生时,能够及时进行数据的恢复。
本篇的测试项目是借以单机部署3个节点的集群环境,来模拟多机环境的数据备份恢复。
mongodb安装与部署集群(3个节点,1个节点类似)
mongodb ZIP安装,版本4.0.28,win10
创建3个文件夹,分别命名r1,r2,r3
在这3个文件夹中分别新建mongodb.conf,/log/mongodb.log, /data, start.bat
# ==============================================
# r1中的配置
# r1/mongodb.conf
dbpath=D:\workspace\mongodb-4.0.28\r1\data
logpath=D:\workspace\mongodb-4.0.28\r1\log\mongodb.log
logappend=true
journal=true
quiet=true
port=27017
replSet = s1
# r1/start.bat
cd D:\workspace\mongodb-4.0.28\bin
mongod --config D:\workspace\mongodb-4.0.28\r1\mongodb.conf
# ==============================================
# r2中的配置
# r2/mongodb.conf
dbpath=D:\workspace\mongodb-4.0.28\r2\data
logpath=D:\workspace\mongodb-4.0.28\r2\log\mongodb.log
logappend=true
journal=true
quiet=true
port=27018
replSet = s1
# r2/start.bat
cd D:\workspace\mongodb-4.0.28\bin
mongod --config D:\workspace\mongodb-4.0.28\r2\mongodb.conf
# ==============================================
# r3中的配置
# r3/mongodb.conf
dbpath=D:\workspace\mongodb-4.0.28\r3\data
logpath=D:\workspace\mongodb-4.0.28\r3\log\mongodb.log
logappend=true
journal=true
quiet=true
port=27019
replSet = s1
# r3/start.bat
cd D:\workspace\mongodb-4.0.28\bin
mongod --config D:\workspace\mongodb-4.0.28\r3\mongodb.conf
小提示:如果是Mongodb5.0,有些语法不一样,导致许多报错,建议换成Mongodb4.0。
分别运行3个文件夹中的start.bat
文件,即开启3个mongo实例。
生成并启动mongo实例,还可以直接执行下边命令:
mongod --port 27017 --dbpath E:/mongos/mongodb1/data --logpath E:/mongos/mongodb1/log/mongodb.log --pidfilepath E:/mongos/mongodb1/mongodb1.pid --replSet s2 --logappend --directoryperdb
开启3个客户端来连接对应的实例
mongo localhost:27017
mongo localhost:27018
mongo localhost:27019
配置集群主,备,仲裁节点,只需要在Primary节点上进行这一步,其他2个节点不需要操作。 需要关闭后台mongoDB服务,开启实例也就开启了服务。
> use admin
> cfg={ _id:"s1", members:[ {_id:0,host:'localhost:27017',priority:2}, {_id:1,host:'localhost:27018',priority:1}, {_id:2,host:'localhost:27019',arbiterOnly:true}] };
> rs.initiate(cfg)
> rs.status()
注:一台mongodb实例时,cfg={id:"s1", members:[ {id:0,host:'localhost:27017',priority:2}] };两台mongodb实例时,cfg={id:"s1", members:[ {id:0,host:'localhost:27017',priority:2}, {_id:1,host:'localhost:27018',arbiterOnly:true}] }。
Primary节点的账号密码设置
1. use admin
2. db.createUser({user: 'root', pwd: 'Gdpt', roles: ['root']})
在 mongodb安装程序中的mongod.cfg配文中,修改
security:
authorization: enabled
或者由命令启动服务时增加--auth
mongod --auth --config E:\workspace\mongodb-4.0.28\r1\mongodb.conf
测试业务场景
一周一次全量备份,每天一次增量备份,本文还未设置定时任务执行,手动执行全部测试成功。
全量备份&还原
起初,针对原始数据进行全量备份,执行脚本all_backup.bat,备份数据做了压缩。
rem ******Mongodb full backup start******
@echo off
set "Ymd=%date:~0,4%%date:~5,2%%date:~8,2%0%time:~1,1%%time:~3,2%%time:~6,2%"
md D:\workspace\mongodb-4.0.28\backup\full\%Ymd%\
"D:\workspace\mongodb-4.0.28\bin\mongodump.exe" --host=127.0.0.1 --port=27017 -u root -p root --gzip --authenticationDatabase=admin -o D:\workspace\mongodb-4.0.28\backup\full\%Ymd%\
@echo on
rem ******Mongodb full backup end******
针对全备数据后期可以随时全量还原,将mongodbBackup_0708044702指定为备份文件夹,执行下边all_recover.bat
rem ******Mongodb full backup start******@echo off"D:\workspace\mongodb-4.0.28\bin\mongorestore.exe" --host=127.0.0.1 --port=27017 -u root -p root --authenticationDatabase=admin --gzip E:\data\allDump\mongodbBackup_0708044702\@echo onrem ******Mongodb full backup end******
增量备份&还原
更改系统时间至第二天,插入数据,继续更改系统时间至第三天,进行增量备份。
删除数据库。测试全量恢复之后,测试增量恢复。
增量备份add_backup.bat
rem ******MongoDB backup start********@echo offecho wscript.echo DateDiff("s", "01/01/1970 00:00:00", Date())>sjc.vbsfor /f %%i in ('cscript sjc.vbs /nologo') do set endDate=%%iset /a "endDate=%endDate%-28800"set /a "startDate=%endDate%-86400"set "Ymd=%date:~0,4%%date:~5,2%%date:~8,2%0%time:~1,1%%time:~3,2%%time:~6,2%"md D:\workspace\mongodb-4.0.28\backup\add\%Ymd%\"D:\workspace\mongodb-4.0.28\bin\mongodump.exe" --host=127.0.0.1 --port=27010 -u root -p root --authenticationDatabase=admin -d local --gzip -c oplog.rs --query "{"ts":{$gte:Timestamp(%startDate%, 1),$lt:Timestamp(%endDate%, 1)}}" -o E:\data\oplogDump\%Ymd%\@echo onrem ******MongoDB backup end********
这是增量备份的脚本,其中可以看到在命令行中加入了查询条件,ts表示时间范围,这里是设置的从当前日期前一天的0点到今天的0点,设置在每天凌晨运行备份前一天从0点开始24小时的数据(这里需要根据环境的不同来更改),ns表示查询的数据的范围,这里是查询了用于测试的test数据库的数据(这两个查询条件可以在oplog.rs这个collection中的document中找到相对应的字段,可以根据不同的需求作添加或更改)。
增量恢复add_recover.bat
比如,插入新数据当时是6月1日,把电脑时间调整到6月2号,然后执行增量备份脚本,在生成的目录E:\data\oplogDump\%Ymd%\中,有oplog.rs.bson文件。
然后删除russia数据库,执行全量还原脚本,然后要执行增量还原脚本。
先找到刚刚增量备份的oplog.rs.bson文件,压缩的情况下需先解压;
把这个文件复制到全量备份生成的文件夹中E:\data\allDump\mongodbBackup_0708044702,并把这个文件改名成oplog.bson;
最后执行增量还原脚本即可。
rem ******Mongodb full backup start******@echo off"D:\workspace\mongodb-4.0.28\bin\mongorestore.exe" --host=127.0.0.1 --port=27010 -u root -p root --oplogReplay --authenticationDatabase=admin D:\workspace\mongodb-4.0.28\backup\full\0531053536@echo onrem ******Mongodb full backup end******
脚本等同于执行下边的指令
mongorestore --host=127.0.0.1 --port=27010 --drop --oplogReplay --oplogFile E:\data\allDump\mongodbBackup_0609043550\oplog.bson
小提示:
mongorestore语法模板
mongorestore --host <host>:<port> -u <user> --authenticationDatabase <adb>--oplogReplay--oplogFile dump/local/oplog.rs.bson--oplogLimit 1646056729:1filedir
查看oplog.rs.bson记录的指令
bsondump E:\data\oplogDump\0613072745\local\oplog.rs.bson
查询oplog.rs集合的操作日志
use localdb.oplog.rs.find({"ns": "test.test"}).sort({"$natural": -1})
备份单个集合
mongodump --host <host>:<port> -d local -c oplog.rs -u <user> --authenticationDatabase <adb> -q '{"ns": "test.survey"}'