项目开发完成后需要对工程中的mongodb作本地备份,之前在做mysql备份的时候,只使用的全备的方式来备份,即使用mysql自带的mysqldump
命令来实现,下面顺便贴出备份的脚本。
rem ******MySQL 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%"
mysqldump --user=%usr% --password=%pwd% --host=%host% --port=%port% --protocol=tcp --single-transaction --default-character-set=utf8 --extended-insert --quick --routines --events --databases "db_name" > C:\backup_%Ymd%.sql
@echo on
rem ******MySQL backup end********
其中涉及的相关的参数可以查阅文档找到,这里不再详述。
而在做mongodb地时候,当使用mongodump
时,发现当数据量稍大时,备份消耗的时间会非常大,我们测试服务器上的数据量大约为10个G,10分钟只能备份2%不到,所以考虑使用增量备份的方式来备份数据,下面贴出的是使用mongodump
方式全备mongodb的脚本。
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 C:\backup_%Ymd%\full\
"C:\Program Files\MongoDB\Server\3.2\bin\mongodump.exe" --host=localhost --port=27017 --authenticationDatabase=admin -o C:\backup_%Ymd%\full\
@echo on
rem ******Mongodb full backup end******
要想实现mongodb的增量备份,需要首先了解几个mongodb相关的概念
mongodb的集群搭建方式主要有三种,主从模式,Replica set模式,sharding模式。
副本集是一种在多台机器同步数据的进程,副本集体提供了数据冗余,扩展了数据可用性。在多台服务器保存数据可以避免因为一台服务器导致的数据丢失。
也可以从硬件故障或服务中断解脱出来,利用额外的数据副本,可以从一台机器致力于灾难恢复或者备份。
The oplog (operations log) is a special capped collection that keeps a rolling record of all operations that modify the data stored in your databases.
这里分享几篇文章作为参考:
mongodb的增量备份是通过集群的oplog功能来实现的,所以需要满足mongodb集群至少需要是一个副本集集群(如果是分片集,那么每个分片也都要是副本集),在一个搭建好的集群中的master节点中,可以在local
数据库下找到oplog.rs
,通过备份这个collection中指定时间段内的数据来实现增量备份。
下面贴出增量备份脚本代码
rem ******MongoDB backup start********
@echo off
echo wscript.echo DateDiff("s", "01/01/1970 00:00:00", Date())>sjc.vbs
for /f %%i in ('cscript sjc.vbs /nologo') do set endDate=%%i
set /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 C:\mongodbBackup\backup_%Ymd%\
"C:\Program Files\MongoDB\Server\3.2\bin\mongodump.exe" --host=localhost --port=27017 --authenticationDatabase=admin -d local -c oplog.rs --query "{"ts":{$gte:Timestamp(%startDate%, 1),$lt:Timestamp(%endDate%, 1)},ns:/^test/}" -o C:\mongodbBackup\backup_%Ymd%\
@echo on
rem ******MongoDB backup end********
这是增量备份的脚本,其中可以看到在命令行中加入了查询条件,ts
表示时间范围,这里是设置的从当前日期前一天的0点到今天的0点,需要注意的是这样设置需要与脚本实际的运行方式相对应,笔者的脚本程序是通过计划任务的方式运行的,设置在每天凌晨运行备份前一天从0点开始24小时的数据(这里需要根据环境的不同来更改),ns
表示查询的数据的范围,笔者这里是查询了用于测试的test数据库的数据,实际也要作相应的更改(这两个查询条件可以在oplog.rs
这个collection中的document中找到相对应的字段,可以根据不同的需求作添加或更改)。
我这里是设置了每周末执行一次全备(可以使用开始给出的全备方案,也可以手动物理备份),然后每天执行一次增量备份,恢复时首先恢复全备的数据,再依次恢复增量备份的数据。
恢复数据使用了mongorestore
功能,先恢复全备的数据:
"C:\Program Files\MongoDB\Server\3.2\bin\mongorestore.exe" --host=localhost --port=27017 --authenticationDatabase=admin
C:\backup_20181101083905\full\
再恢复增量备份的数据:
"C:\Program Files\MongoDB\Server\3.2\bin\mongorestore.exe" --host=localhost --port=27017 --oplogReplay --authenticationDatabase=admin C:\mongodbBackup\backup_oplog
--oplogReplay
After restoring the database dump, replays the oplog entries from the oplog.bson file located in the top level of the dump directory. When used in conjunction with mongodump --oplog, ~bin.mongorestore --oplogReplay restores the database to the point-in-time backup captured with the mongodump --oplog command. For an example of --oplogReplay, see Restore Point in Time Oplog Backup.
~bin.mongorestore --oplogReplay replays any valid oplog.bson file found in the top level of the dump directory. That is, if you have a bson file that contains valid oplog entries, you can name the file oplog.bson and move it to the top level of the dump directory for ~bin.mongorestore --oplogReplay to replay.
恢复增量的数据时需要注意,我们前台增量备份的数据是oplog.rs
这个collection的数据,那么我们还需要把备份后的~/local/oplog.rs.bson
这个文件拷贝到还原目录下(恢复时使用的还原目录,即上面脚本中的C:\mongodbBackup\backup_oplog
这个目录)。
如上面所说,笔者介绍的增量备份方案使用的前提是需要有一个集群的环境,但尽量不要在生产环境测试验证,数据无价,建议先在自己的开发环境中搭建一个简单的集群环境用于测试验证。
副本集的概念可以在笔者在上面给出的几篇文章中进行理解,这里我只介绍我在开发时搭建的步骤,毕竟相关的概念我也不清楚2333。
我是在C:/mongos/
文件夹下创建的这3个文件夹,其中:
C:/mongos/r1/mongodb.conf
dbpath=C:\mongos\r1
logpath=C:\mongos\r1\mongodb.log
logappend=true
journal=true
quiet=true
port=27017
replSet = testrs
C:/mongos/r1/start.bat
cd C:\Program Files\MongoDB\Server\3.2\bin
mongod --config C:\mongos\r1\mongodb.conf
C:/mongos/r2/mongodb.conf
dbpath=C:\mongos\r2
logpath=C:\mongos\r2\mongodb.log
logappend=true
journal=true
quiet=true
port=27018
replSet = testrs
C:/mongos/r2/start.bat
cd C:\Program Files\MongoDB\Server\3.2\bin
mongod --config C:\mongos\r2\mongodb.conf
C:/mongos/r3/mongodb.conf
dbpath=C:\mongos\r3
logpath=C:\mongos\r3\mongodb.log
logappend=true
journal=true
quiet=true
port=27019
replSet = testrs
C:/mongos/r3/start.bat
cd C:\Program Files\MongoDB\Server\3.2\bin
mongod --config C:\mongos\r3\mongodb.conf
可能还需要把mongodb的安装路径修改为你本地安装的路径,也可以将bin
目录添加到环境变量path
中。
start.bat
文件,即开启了3个mongo实例cmd
中输入> mongo localhost:27017
连接mongo进入),分别执行以下命令:> use admin
> cfg={ _id:"testrs", 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)
到此一个简单的mongodb集群环境就搭建完成,可以在刚才的命令行中输入> rs.status()
来确认是否正常搭建。这个集群是由本地开启的三个端口27017
,27018
,27019
组成的,其中端口为27017
的节点为主节点,通过客户端(笔者使用的是robomongo)连接这三个节点,在27017
中的local
数据库中可以找到oplog.rs
这个collection。
测试环境搭好了,测试还不是随意搞搞嘛2333
由于备份mongo数据库时,使用mongodump
全备的方式来备份会花费大量的时间,因为mongodb在备份的时候并不会锁表,也不会生成一个快照,耗时过长的备份可能会引起数据一致性问题,所以需要使用增量备份来降低一些副作用,这里笔者使用的是依赖于mongo集群的增量备份方式,通过与周期性的全备配合使用可以实现相对可靠的数据备份。
最后需要指出的是,数据无价,笔者并不是一个DBA,数据库相关的原理知识并不完备,这里只是分享了在处理mongodb增量备份的过程中自己的总结,希望谨慎操作。