MongoDB通過Shell 實現集合的日常歸檔


 1.MongoDB數據歸檔的意義

和其他類型的數據庫一樣,歸檔對MongoDB同樣重要。通過歸檔,可以保持集合中合適的數據量,對數據庫的性能是一種保障,也就是大家常說的數據冷熱分離。

同時,歸檔對數據庫的管理也帶來了很大方便性,例如日常的備份、災難恢復等。

在此,不再展開敘述了。

 2.集合數據歸檔流程圖

3.歸檔實現代碼

#
# The file is used by cron to Archive the data of NeedArchiveColName_Archive collection,the collection is part of NeedArchiveDBColName DB.
# The file is writed by DBA Carson Xu.If you find any error, please connect with me,thanks.
# The version is defined V.001
# Version   ModifyTime                ModifyBy              Desc
# Ver001    2019-02-22 14:20         Carson Xu             Create the Scripts File
#
#
#!/bin/bash
######mongodb可執行文件所在文檔路徑,此例為4.04 ,同時支持3.4.4

command_linebin="/QQMSG/mongo_db/mongobin404/bin/mongo"
command_linebinT="/QQMSG/mongo_db/mongobin404/bin/mongo"

######存放導出過渡文件的文檔路徑和文件名字,ColA可用你的集合名字替代
targetpath='/data/mongodb_back/ArchiveDB_端口號'
bakcollectionname=NeedArchiveColName_$(date "+%Y%m%d%H%M")

###### 登入賬號信息
username="賬號"
password="賬號密碼"


#######start 設置備份集合的開始日期和結束日期 #####

ParamBakStartDate=$(date -d '-46 days' "+%Y-%m-%d")
echo "備份NeedArchiveColName時間參數中的開始時間為:" $ParamBakStartDate 

ParamBakEndDate=$(date -d '-45 days' "+%Y-%m-%d")
echo "備份NeedArchiveColName時間參數中的結束時間為:" $ParamBakEndDate 

ParamBakStartTimeS="$(date -d $ParamBakStartDate +%s)"

ParamBakEndTimeS="$(date -d $ParamBakEndDate  +%s)"

echo "備份集合的時間轉換為UTC時間秒數為:" $ParamBakStartTimeS  和 $ParamBakEndTimeS

ParamBakStartTimeMS=$[$ParamBakStartTimeS * 1000+8*60*60*1000]
ParamBakEndTimeMS=$[$ParamBakEndTimeS * 1000+8*60*60*1000]

echo "備份集合的時間轉換為UTC時間毫秒數為:" $ParamBakStartTimeMS  和 $ParamBakEndTimeMS

#######end ######

######## start 連接源Server DB ,檢查此次集合備份的文檔數
command_line="${command_linebin} localhost:端口號/NeedArchiveDBColName -u$username -p$password"
export docQty=$(/bin/echo 'db.NeedArchiveColName.find({NeedArchiveByField:{$gte:new Date('\"$ParamBakStartDate\"'),$lt:new Date('\"$ParamBakEndDate\"')}}).count()' | $command_line --quiet)
echo "備份前集合NeedArchiveColName的文檔數據為:" $docQty
###### End #####

###### Start 定義每次備份歸檔的最大閾值,防止意外情況的發生,例如:參數輸入錯誤###
if [ $docQty -gt 2000000 ];then
  echo "MongoDB-Archive-Exception:NeedArchiveDBColName庫NeedArchiveColName集合指定時間段內的文檔數過大,超過定義的安全閾值 2000000,歸檔終止,請檢查!"
  exit
fi

####### end  ######

######## start 連接目標Server DB ,檢查target DB 上是否已經存在此時間內的文檔
command_lineT="${command_linebinT} 歸檔實例IP:歸檔實例端口/歸檔數據庫Name -u$username -p$password"
export docQtyT=$(/bin/echo 'db.NeedArchiveColName.find({NeedArchiveByField:{$gte:new Date('\"$ParamBakStartDate\"'),$lt:new Date('\"$ParamBakEndDate\"')}}).count()' | $command_lineT --quiet)
echo "備份目標BKDB集合NeedArchiveColName備份歸檔前的文檔數據為:" $docQtyT
if [ $docQtyT -gt 0 ];then
  echo "MongoDB-Archive-Exception:NeedArchiveDBColName庫NeedArchiveColName集合檢查發現指定時間段內目標數據庫目標集合存在異常文檔數,歸檔終止,請檢查!"
  exit
fi

####### end  ######

####### start mongoexport  指定集合指定時間段內的文檔,輸出到指定路徑下;並執行檢查命令是否正常執行####
start()
{
echo "NeedArchiveDBColName庫NeedArchiveColName集合備份輸出開始"
/QQMSG/mongo_db/mongobin404/bin/mongoexport --port 端口號 -u $username -p $password -d NeedArchiveDBColName --authenticationDatabase NeedArchiveDBColName -c NeedArchiveColName -q ' { NeedArchiveByField: { $gte:new Date('$ParamBakStartTimeMS'),$lt:new Date('$ParamBakEndTimeMS') } } ' -o ${targetpath}/${bakcollectionname}
echo "NeedArchiveDBColName庫NeedArchiveColName集合備份輸出完畢"
}
start
execute()
{
if [ $? -eq 0 ]
then
echo "The MongoDB 集合 NeedArchiveColName 文檔mongoexport完成!"
else
echo "The MongoDB 集合 NeedArchiveColName 文檔mongoexport失敗"
exit
fi
}
###### end  ######

###### Start mongomongoimport 將導出的備份集合導入到指定的BKDB 指定的集合中#####
echo "備份輸入開始"
/QQMSG/mongo_db/mongobin404/bin/mongoimport -h 歸檔實例IP --port 歸檔實例端口 -u $username -p $password -d 歸檔數據庫Name --authenticationDatabase 歸檔數據庫Name -c NeedArchiveColName  --file ${targetpath}/${bakcollectionname}
echo "備份輸入完畢"

##### End #######

######## start 連接目標Server DB ,檢查target DB 上是否已經存在此時間內的文檔
export docQtyT2=$(/bin/echo 'db.NeedArchiveColName.find({NeedArchiveByField:{$gte:new Date('\"$ParamBakStartDate\"'),$lt:new Date('\"$ParamBakEndDate\"')}}).count()' | $command_lineT --quiet)
echo "備份目標BKDB集合NeedArchiveColName備份歸檔后的文檔數據為:" $docQtyT2

echo "比較docQty 和 docQtyT2 的大小"
if [ $docQty == $docQtyT2 ]; then
     echo "正常:時間段內源數據庫集合中的文檔數  和 目標數據庫集合中還原后的文檔數據 相等";
elif [ $docQty -gt $docQtyT2 ]; then
    echo "MongoDB-Archive-Exception:時間段內源數據庫集合中的文檔數  大於  目標數據庫集合中還原后的文檔數據";
    exit
else
   echo "MongoDB-Archive-Exception:時間段內源數據庫集合中的文檔數  小於  目標數據庫集合中還原后的文檔數據";
   exit
fi
########### End ##### 

########### Start Remove 源數據庫源集合指定時間內的記錄 ########

docQtyR=$(/bin/echo 'db.NeedArchiveColName.remove({NeedArchiveByField:{$gte:new Date('$ParamBakStartTimeMS'),$lt:new Date('$ParamBakEndTimeMS')}}).nRemoved' | $command_line --quiet)
echo "本次操作Remove集合NeedArchiveColName的文檔數據為:" $docQtyR
########## End  #########
###### 檢查 Remove 后集合的文檔數 ### 
docQty=$(/bin/echo 'db.NeedArchiveColName.find({NeedArchiveByField:{$gte:new Date('\"$ParamBakStartDate\"'),$lt:new Date('\"$ParamBakEndDate\"')}}).count()' | $command_line --quiet)
echo "NeedArchiveDBColName庫NeedArchiveColName集合 此次 Remove 后指定時間剩余的文檔數據為:" $docQty
###### End ###

#########刪除導出的文件#######
rm -rf ${targetpath}/${bakcollectionname}
if [ $? -eq 0 ]
then
echo "正常:NeedArchiveDBColName庫NeedArchiveColName集合導出的文件被刪除:" ${targetpath}/${bakcollectionname}
else
echo "MongoDB-Archive-Exception:NeedArchiveDBColName庫NeedArchiveColName集合導出的文件未被正常刪除" ${targetpath}/${bakcollectionname}
fi
######## End #####

 

4. 代碼說明

4.1 配置基本信息

主要包括:mongo bin 可執行文件所在路徑;導出過渡文件的定義;歸檔賬號和密碼;集合數據保留天數。

4.2 代碼中關鍵詞

明白關鍵字的含義,可在部署運行前,批量替換

代碼中關鍵詞 關鍵詞意義
NeedArchiveDBColName
需要歸檔的集合所在數據庫;
NeedArchiveColName
需要歸檔的集合名字;
歸檔數據庫Name
歸檔數據庫Name
NeedArchiveByField
歸檔依據的字段;此例中是Date類型的字段,其他類型還要調試。
 /QQMSG/mongo_db/mongobin404/bin  Mongo 可執行文件所在路徑
 2000000  歸檔的最大閾值
 ArchiveDB_端口號  過渡文件所放的位置,一個數據庫一個文檔。不用細化到集合
端口號 端口號分為源庫所在實例端口,和目標庫所在實例端口

4.3 在本例中,源庫和目標庫設置了相同的歸檔賬號和對應密碼

4.4  通過crontab 實現日常歸檔,執行信息(異常錯誤)重定向到log文件

歸檔實現代碼保存到文件中,通過crontab設置文件的定時任務,實現日常歸檔。

執行情況 重定向( >>)到指定文件。通過指定文件的監視可實現監控歸檔的執行情況。

 

 

 

本文版權歸作者所有,未經作者同意不得轉載,謝謝配合!!!

本文版權歸作者所有,未經作者同意不得轉載,謝謝配合!!!

本文版權歸作者所有,未經作者同意不得轉載,謝謝配合!!!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM