介绍
作为数据库管理员,备份是日常工作之一,包括物理备份和逻辑备份。Mongodb官方并没有提供物理备份工具,但在Mongodb复制集中,我们可以使用oplog备份来进行增量备份和恢复。

方案
为了实现增量备份和恢复,我们采取以下方案:
1、全备:每固定频率进行mongodump全库导出备份,如每天一次。
2、增量备份:每固定频率使用Mongodump进行oplog备份,每次备份时指定备份的起始位置为上次备份时间的前面几分钟。备份周期必须在oplog保留的时间范围内。
3、全库恢复:利用全备进行恢复。
4、指定从全备开始前的上一个oplog备份集开始进行恢复,一直恢复到指定的时间点。
增量备份脚本
以下是增量备份脚本:
#!/bin/bash
##envset
mongobin="/usr/local/mongodb/bin"
host=localhost
mongouser="admin"
mongopwd="123456"
mongoport=27017
fullbakdir=/home/mongo/backup/full-`date+%F`
inc_bakdir=/home/mongo/backup/inc-`date+"%Y-%m-%d-%H%M%S"`
#starttime=`date -d-1hours+%s`
starttime=`date -d-62Minutes+%s`
checktime=3900
##Make needs dirs
function fulldir(){
if [ ! -d "${fullbakdir}" ];then
mkdir -p ${fullbakdir}
else
echo "已经存在备份目录,本次备份退出,请检查环境"
exit
fi
}
function incdir(){
if [ ! -d "${inc_bakdir}" ];then
mkdir -p ${inc_bakdir}
fi
}
function fullback(){
${mongobin}/mongodump --host=${host} --port=${mongoport} --authenticationDatabase admin -u${mongouser} -p${mongopwd} -j8 --oplog --gzip --out=${fullbakdir}
}
function inclback(){
${mongobin}/mongodump --host=${host} --port=${mongoport} --authenticationDatabase admin -u${mongouser} -p${mongopwd} -d local -c oplog.rs --gzip --query "{ts:{$gte:Timestamp($starttime,1)}}" --out=${inc_bakdir}
}
function chkoplog(){
oplogtime=`mongo --eval "rs.printReplicationInfo()" | grep "loglength(start to end)" | awk '{print $6}' | awk -Fs '{print $1}'`
echo $oplogtime
if [ ${oplogtime} -gt 60 ];then
return 0
else
return 1
fi
}
signal=${1:-full}
if [ ${signal} = full ];then
fulldir
fullback
elif [ ${signal} = inc ];then
incdir
chkoplog
if [ $? -eq 0 ];then
inclback
else
echo "sendmsg"
fi
else
echo "请指定备份类型"
fi
通过在crontab中部署定时任务来实现固定频率备份。
例如:每天一次全备
13 ****** sh /home/mongo/scripts/backup.sh full
例如:每小时一次增量备份
30 */1 ***** sh /home/mongo/scripts/backup.sh inc
注:oplog只存在于复制集架构中,单机数据库是不会有oplog的。
结尾
通过oplog方式可以实现Mongodb的增量备份和基于时间点的恢复,使数据库管理员的备份操作更加高效方便。
原创文章,作者:小编小本本,如若转载,请注明出处:https://www.benjiyun.com/yunzhujiyunwei/vps-yunwei/5975.html
