數(shù)據(jù)庫備份是DBA的一種日常工作,備份包括物理備份和邏輯備份。每一種DBMS產(chǎn)品都提供了自己的備份和恢復(fù)的工具,如Oracle的rman和數(shù)據(jù)泵就是實現(xiàn)數(shù)據(jù)庫備份工具的代表。
要實現(xiàn)數(shù)據(jù)庫增量備份一般都是基于物理備份備份來實現(xiàn),如rman0級+N級+歸檔日志,但是Mongodb官方以及第三方都沒有提供物理備份工具(基于文件系統(tǒng)的除外),僅提供了用于邏輯備份的mongoexport或者Mongodump。一般來說邏輯備份是無法實現(xiàn)增量的,但在Mongodb復(fù)制集中,提供了一個名為oplog的固定大小集合(默認為磁盤空間的5%,可手動修改)來存儲所有的數(shù)據(jù)變更操作(復(fù)制集架構(gòu)就利用此集合來進行數(shù)據(jù)同步),并且其具有冪等性的特點,因此可通過備份oplog的方式來進行增量備份和增量恢復(fù)。
由于oplog的冪等性,即做了多次oplog恢復(fù)或者多次重復(fù)的操作,也能保證其數(shù)據(jù)跟只執(zhí)行一次的結(jié)果相同,所以我們使用如下方案來實現(xiàn)增量備份和恢復(fù):
1、全備:按固定頻率進行mongodump全庫導(dǎo)出備份,如每天一次
2、增量備份:按固定頻率使用Mongodump進行oplog備份,且每次備份時指定備份的起始位置為上次備份時間的前面幾分鐘,即多備份幾分鐘的oplog數(shù)據(jù),這樣可確保數(shù)據(jù)不丟失。此處要注意,oplog是一個capped集合,所以備份周期必須在oplog保留的時間范圍內(nèi)(即按照當(dāng)前數(shù)據(jù)庫的oplog大小,假如oplog集合可以保存3小時的數(shù)據(jù),那么備份頻率不能高于3小時)。例:每小時備份一次oplog
starttime=`date-d -62 Minutes +%s` mongodump--host=127.0.0.1 --port=27017 --authenticationDatabase admin -uroot-p*** -d local -c oplog.rs --gzip --query{ts:{$gte:Timestamp($starttime, 1)}} --out=/backupdir 在本例中,每小時備份一次oplog,每次備份的起始時間點為當(dāng)前時間的前面62min,這樣每次重復(fù)備份2min的oplog。 |
若出現(xiàn)了故障導(dǎo)致數(shù)據(jù)丟失或者人為誤操作,可以將數(shù)據(jù)恢復(fù)到任意時間點
3、全庫恢復(fù):利用步驟1的全備進行恢復(fù)。
4、指定從全備開始前的上一個oplog備份集開始進行恢復(fù),一直恢復(fù)到指定的時間點。例:多次恢復(fù)oplog直到指定的時間點。
mongorestore-h 127.0.0.1 --port 27017 --oplogReplay /backup/oplog2021032714
mongorestore-h 127.0.0.1 --port 27017 --oplogReplay /backup/oplog2021032715
…………
mongorestore-h 127.0.0.1 --port 27017 --oplogReplay --oplogLimit
需要注意的是,oplog只存在于復(fù)制集架構(gòu)中,單機數(shù)據(jù)庫是不會寫oplog的,所以針對單機架構(gòu),如果要實現(xiàn)增量備份的話,若有多的機器,可改成復(fù)制集,如果沒有多余的機器,則可將單機改成單節(jié)點的復(fù)制集。對于分片集群架構(gòu),要求將所有分片部署成復(fù)制集架構(gòu),備份需基于所有的分片進行備份,而不能基于mongos進行備份。
附:增量備份腳本:
#!/bin/bash ##env set 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 -1 hours +%s` starttime=`date-d -62 Minutes +%s` checktime=3900 ##Make needs dirs functionfulldir() { if[ ! -d "${fullbakdir}" ]; then mkdir-p ${fullbakdir} else echo"已經(jīng)存在備份目錄,本次備份退出,請檢查環(huán)境" exit fi } functionincdir() { if[ ! -d "${inc_bakdir}" ]; then mkdir-p ${inc_bakdir} fi } functionfullback() { ${mongobin}/mongodump--host=${host} --port=${mongoport} --authenticationDatabase admin-u${mongouser} -p${mongopwd} -j 8 --oplog --gzip --out=${fullbakdir} } functioninclback() { ${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} } functionchkoplog() { oplogtime=`mongo--eval "rs.printReplicationInfo()" |grep "log lengthstart to end" |awk {print $6} |awk -Fs {print $1}` echo$oplogtime if[ ${oplogtime} -gt 60 ];then return0 else return1 fi } signal=${1:-full} if[ ${signal} = full ];then fulldir fullback elif[ ${signal} = inc ];then incdir chkoplog if[ $? -eq 0 ];then inclback else echo"send msg" fi else echo"請指定備份類型" fi |
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/129954.html
摘要:起因年月,當(dāng)大家都在為的逝去寫總結(jié),并為年的到來做計劃的時候,一波黑客發(fā)動了一輪攻擊,攻擊的對象瞄準(zhǔn)了數(shù)據(jù)庫。他們刪除了所有數(shù)據(jù)庫數(shù)據(jù),并留下一個勒索數(shù)據(jù)庫。不幸的是,我也成為這幸運的一員。謹記,安全,安全,安全。 起因 2017年1月,當(dāng)大家都在為16的逝去寫總結(jié),并為17年的到來做計劃的時候,一波黑客發(fā)動了一輪攻擊,攻擊的對象瞄準(zhǔn)了mongodb數(shù)據(jù)庫。他們刪除了所有數(shù)據(jù)庫數(shù)據(jù),并...
摘要:起因年月,當(dāng)大家都在為的逝去寫總結(jié),并為年的到來做計劃的時候,一波黑客發(fā)動了一輪攻擊,攻擊的對象瞄準(zhǔn)了數(shù)據(jù)庫。他們刪除了所有數(shù)據(jù)庫數(shù)據(jù),并留下一個勒索數(shù)據(jù)庫。不幸的是,我也成為這幸運的一員。謹記,安全,安全,安全。 起因 2017年1月,當(dāng)大家都在為16的逝去寫總結(jié),并為17年的到來做計劃的時候,一波黑客發(fā)動了一輪攻擊,攻擊的對象瞄準(zhǔn)了mongodb數(shù)據(jù)庫。他們刪除了所有數(shù)據(jù)庫數(shù)據(jù),并...
閱讀 1346·2023-01-11 13:20
閱讀 1684·2023-01-11 13:20
閱讀 1132·2023-01-11 13:20
閱讀 1858·2023-01-11 13:20
閱讀 4100·2023-01-11 13:20
閱讀 2704·2023-01-11 13:20
閱讀 1385·2023-01-11 13:20
閱讀 3597·2023-01-11 13:20