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

来源:https://www.cnblogs.com/xuliuzai/archive/2019/04/12/10698241.html
-Advertisement-
Play Games

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設置文件的定時任務,實現日常歸檔。

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

 

 

 

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

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

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


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 伺服器的特性: 高速度的CPU運算能力 長時間的可靠運行 強大的I/O外部數據吞吐能力 伺服器通常具有更高的性能,效率,高可靠,高可用性,以及更好的擴展性。 伺服器的分類 (1)伺服器按外形分類 塔式伺服器: 常見的立式和卧式機箱結構的伺服器,可放置在普通的辦公環境。 優點:主板擴展性較強,適合常見 ...
  • 一. 原子操作的定義 原子操作,是指一組相關聯的操作要麼都不間斷的執行,要麼都不執行。 二. 原子操作對同步與互斥的意義 1. 討論原子操作的意義之前,先瞭解操作系統中如下概念: 競爭條件:兩個或多個進程或線程讀寫某些共用數據,而最後的結果取決於進程運行的精確時序,稱為競爭條件。 臨界區:把對共用內 ...
  • Linux信號_總結 對信號本質的理解: 類似於中斷,區別在於中斷是由硬體產生的,而信號是由軟體實現的。 信號的來源: 觸發硬體(觸發鍵盤,或是硬體故障);軟體信號函數kill 、alarm、setitimer、sigqueue 等函數。 信號的分類: 可靠信號與不可靠信號,實時信號與非實時信號; ...
  • 1.常用快捷鍵 Ctrl+d 2.Shell 常用通配符: 3.在命令行中使用幫助 例如 man命令,它是Manual pages的縮寫。 要查看相應區段的內容,就在 man 後面加上相應區段的數字即可,如: 4.su /sudo和su- su <user> 可以切換到用戶 user,執行時需要輸入 ...
  • Linux ssh登陸慢的兩種原因分析 如果做運維就一定會遇到ssh登陸Linux伺服器慢的問題,問題比較好解決,一般Google之後有很多文章都告訴你解決方法,但是很少有文章分析為什麼會慢,這篇文章簡單分析下ssh登陸慢的原因。 useDNS配置導致登陸慢 如果ssh server的配置文件(通常 ...
  • 1. 安裝基礎依賴 2. 下載源碼包 3.cd php-7.2.7 4.配置 5.make && make install 6.配置文件 # cp php.ini-development /usr/local/php/lib/php.ini # cp /usr/local/php/etc/php-f ...
  • 1. 安裝 2. 創建SSHFS 掛載目錄 3.使用SSHFS 掛載遠程的文件系統 sudo sshfs -o allow_other,IdentityFile=~/.ssh/id_rsa #username@site:/share1/home/siyuan /mnt/siyuan 例: sshfs ...
  • 想學習下JavaWeb,手頭有2017年有活動的時候買的一本書,還是全彩的,應該很適合我這種菜鳥技術渣。 只可惜照著書搭建了一套Web環境,代碼和db腳本都是拷貝的光碟里的,也反覆檢查了資料庫的連接情況,Navicat可以正常連,涉及到的兩個資料庫配置文件裡面的url、埠、密碼應該都是對的,反覆折 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...