#!/bin/sh export PATH=/data/app/mongodb/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin dir=/data/bak/monbak date=`date +%Y%m%d` time=`date +%Y%m%d_%H%M%S` dirlog=/data/bak/monlog firstlog=${dirlog}/first_record.log lastlog=${dirlog}/last_record.log baklog=${dirlog}/monbak.log resultlog=${dirlog}/result/monresult_${time}.log rlog=`ls ${dirlog}/mon*bak_${date}_*.log` dbname=hw_report host=mongodb mongo_args=( "127.0.0.1:6668/local" "--authenticationDatabase admin" " -u hw" "-p 123456" ) bak_args=( "-h 127.0.0.1" "--port 6668" "--authenticationDatabase admin" "-u hw" "-p 123456" "--gzip" ) #第一个 #first=$(mongo ${mongo_args[@]} --eval "db.oplog.\$main.find().limit(1);"|grep Timestamp|awk -F '[{":(,)]' '{print $6","$7}') #最后一个 #last=$(mongo ${mongo_args[@]} --eval "db.oplog.\$main.find().sort({ts:-1}).limit(1)"|grep Timestamp|awk -F '[{":(,)]' '{print $6","$7}') #第一个 first=$(mongo ${mongo_args[@]} --eval "db.oplog.\$main.find({'ns':{\$regex:\"${dbname}\"}}).limit(1);"|grep Timestamp|awk -F '[{":(,)]' '{print $6","$7}') #最后一个 last=$(mongo ${mongo_args[@]} --eval "db.oplog.\$main.find({'ns':{\$regex:\"${dbname}\"}}).sort({ts:-1}).limit(1)"|grep Timestamp|awk -F '[{":(,)]' '{print $6","$7}') full(){ baktype=full starttime=`date +%s` mongodump ${bak_args[@]} --oplog -o ${dir}/${host}_${baktype}_${time} stoptime=`date +%s` costtime=`expr ${stoptime} - ${starttime}` } inc(){ baktype=inc first=`tail -n1 ${lastlog}` starttime=`date +%s` mongodump ${bak_args[@]} -d local -c "oplog.\$main" -q "{ts:{\$gt:Timestamp(${first}),\$lte:Timestamp(${last})},ns:/^${dbname}\\\./}" -o ${dir}/${host}_${baktype}_${time} stoptime=`date +%s` costtime=`expr ${stoptime} - ${starttime}` } record(){ datefirst=$(date "+%Y-%m-%d %H:%M:%S" -d @`echo ${first}|awk -F '[,]' '{print $1}'`) datelast=$(date "+%Y-%m-%d %H:%M:%S" -d @`echo ${last}|awk -F '[,]' '{print $1}'`) if [ ${baktype} == 'inc' ];then count=`grep 'done dumping local.oplog.' ${rlog} |awk '{for (i=2;i<=NF;i++)printf("%s ", $i);print ""}'` printf "%-24s [%s] [%s %s]\n" "|--${baktype}_${time}:" "first:(${first}) < oplog <= last:(${last})" "${datefirst} ~ ${datelast}" "${count}" >> ${baklog} else echo "" >> ${baklog} count=`grep 'done dumping hw_report.kj_report' ${rlog} |awk '{for (i=2;i<=NF;i++)printf("%s ", $i);print ""}'` printf "%-24s [%s] [%s %s] \n" "${baktype}_${time}:" "first:(${first}) <= oplog <= last:(${last})" "${datefirst} ~ ${datelast}" "${count}" >> ${baklog} fi echo ${first} >> ${firstlog} echo ${last} >> ${lastlog} } result(){ echo "[backup]" >> ${resultlog} echo "备份目标: ${host} mongodb" >> ${resultlog} echo "备份类型: ${baktype}" >> ${resultlog} echo "备份开始时间: ${time}" >> ${resultlog} echo "备份持续时间: ${costtime}s" >> ${resultlog} echo "备份目录名称: ${host}_${baktype}_${time}" >> ${resultlog} echo "备份目录大小: `du -s ${dir}/${host}_${baktype}_${time}|awk '{print $1}'`k" >> ${resultlog} br=`echo ${count}|grep "done dumping"|wc -l` [ ${br} -eq 1 ]&&r=SUCCESS||r=FAILED echo "备份结果: ${r}" >> ${resultlog} } after(){ #定期删除备件文件 #find ${dir} -type d -mtime +12 | xargs rm -rf } case $1 in full) full record result ;; inc) inc record result ;; *) echo "$0 {full|inc}" ;; esac #mongorestore -h 127.0.0.1 --port 6668 --authenticationDatabase admin -u hw -p 123456 --oplogReplay --gzip /root/monba/full_20181010_153750/ #mongorestore -h 127.0.0.1 --port 6668 --authenticationDatabase admin -u hw -p 123456 --oplogReplay --gzip /root/monbak/inc_20181010_154831/
转载于:https://blog.51cto.com/gordy/2326736