1.MongoDB數據歸檔的意義 和其他類型的資料庫一樣,歸檔對MongoDB同樣重要。通過歸檔,可以保持集合中合適的數據量,對資料庫的性能是一種保障,也就是大家常說的數據冷熱分離。 同時,歸檔對資料庫的管理也帶來了很大方便性,例如日常的備份、災難恢復等。 在此,不再展開敘述了。 2.集合數據歸檔流 ...
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設置文件的定時任務,實現日常歸檔。
執行情況 重定向( >>)到指定文件。通過指定文件的監視可實現監控歸檔的執行情況。
本文版權歸作者所有,未經作者同意不得轉載,謝謝配合!!!
本文版權歸作者所有,未經作者同意不得轉載,謝謝配合!!!
本文版權歸作者所有,未經作者同意不得轉載,謝謝配合!!!