mongodb增量/全量備份腳本的實(shí)現(xiàn)詳解
前言
mongodb備份腳本,可以全量或增量進(jìn)行備份,兩年前所寫(xiě),目前網(wǎng)上mongodb備份相關(guān)的腳本也還是很少。下面話不多說(shuō)了,來(lái)一起看看詳細(xì)的介紹吧
功能
定期對(duì)mongodb數(shù)據(jù)庫(kù)數(shù)據(jù)進(jìn)行全量備份或增量備份(副本集架構(gòu)),并可以壓縮上傳到阿里云oss(本地會(huì)先生成壓縮包,可以設(shè)置不上傳oss)。
腳本運(yùn)行環(huán)境
使用python語(yǔ)言編寫(xiě),需安裝python,pymongo和mongodb shell客戶端(測(cè)試時(shí)使用python 2.7.6,pymongo 3.0.3和mongodb shell 2.0.4)。
腳本部署步驟
1. 將腳本放到一臺(tái)linux主機(jī)
2. 如果是增量備份,創(chuàng)建mongodb 備份角色用戶或更高權(quán)限的admin庫(kù)用戶。(導(dǎo)出時(shí)會(huì)先切換到admin庫(kù)來(lái)驗(yàn)證權(quán)限,需有查詢local庫(kù),mongodump local庫(kù)和mongodump目標(biāo)庫(kù)的權(quán)限)
use admin db.addUser( { user: "xxxxx", pwd: "xxxxx", roles: [ "backup" ] } )
3. 編輯config.properties,修改oss、mongodb連接等配置信息
## 阿里云oss 連接配置 endpoint= oss.aliyuncs.com accessKeyId = xxxxxxx accessKeySecret = xxxxxxx bucket = db-backup ## mongodb 連接配置 # 建議用從庫(kù)的地址,減少對(duì)主庫(kù)壓力 db_host= localhost db_port= 27017 # 如果是增量備份方案,為步驟2中的創(chuàng)建的用戶,或更高權(quán)限的admin用戶;如果是全量備份方案,則只需有目標(biāo)庫(kù)的操作權(quán)限 db_user= testb db_passwd= testb # 目標(biāo)庫(kù) db_name= che # 備份到本地的臨時(shí)目錄 db_backup_root_path= /temp/backup/ # 如果使用mongo客戶端綠色版的,寫(xiě)上mongo客戶端的絕對(duì)路徑 mongo_shell_path= /dev/hanxuetong/mongodb/mongodb-linux-x86_64-3.0.6/bin/ # 增量備份還是全量備份 1: 增量備份 0:全量備份 is_inc_backup=1 # 每多少天進(jìn)行一次全量備份 full_backup_period=7 # 是否上傳到oss,如果 1 ,上傳成功后會(huì)刪除本地備份文件;0:不上傳到oss is_upload_to_oss= 0
4. 將start.py加入linux定時(shí)任務(wù)。crontab任務(wù)配置如 0 4 * * * python /xxx/start.py >> /xxx/xxx.log 2>&1
增量時(shí)恢復(fù)步驟:
1. 創(chuàng)建mongodb 具有applyOps權(quán)限的角色 以及用此角色的用戶。(需有執(zhí)行 mongorestore --oplogReplay的用戶權(quán)限)
use admin db.createRole( { role: "applyOpsRole", privileges: [ { resource: { anyResource: true }, actions: [ "anyAction"] } ], roles: [] } ) db.addUser( { user: "xxxx", pwd: "xxxx", roles: [ "applyOpsRole" ] } )
2. 修改 restore_inc.py里的配置
## 阿里云oss 配置 endpoint="oss.aliyuncs.com" accessKeyId="xxxxxxx" accessKeySecret="xxxxxxx" bucket="db-backup" ## mongodb導(dǎo)入的配置 db_host="localhost" db_port=27017 # 步驟1創(chuàng)建的用戶 db_user="testr" db_passwd="testr" db_name="che" # recent circle backup direactory on oss 最新備份文件的周期名,即備份臨時(shí)目錄中mongodb_inc_backup_info.json的last_circle_backup_dir_name 或 oss中文件夾名 last_circle_backup_dir_name="mongodb_cycle_backup_20151124141133" # 從oss上下載到本地的臨時(shí)目錄 restore_local_temp_path="H:\\pythoncode\\temp\\restore\\" # 如果使用mongo客戶端綠色版的,寫(xiě)上mongo客戶端的絕對(duì)路徑 mongo_shell_path= "/alidata1/dev/hanxuetong/mongodb/mongodb-linux-x86_64-3.0.6/bin/" # backup file has download to local ? if True,will not download backup files from oss # 是否備份文件已經(jīng)下載到本地,如果true,則不會(huì)從oss下載和解壓,本地已有 has_download_to_local=False # 恢復(fù)時(shí)是否先刪除舊的數(shù)據(jù)庫(kù) is_drop_old_restore=True
3. 導(dǎo)入期間停止mongodb寫(xiě)入
4. 執(zhí)行 restore_inc.py
全量時(shí)恢復(fù)步驟:
1. 修改 restore_full.py里的配置
## 阿里云oss 配置 endpoint="oss.aliyuncs.com" accessKeyId="xxxxxxx" accessKeySecret="xxxxxxx" bucket="db-backup" ## mongodb導(dǎo)入的配置 db_host="localhost" db_port=27017 # 數(shù)據(jù)庫(kù)對(duì)應(yīng)的用戶 db_user="test" db_passwd="test" db_name="che" # recent circle backup direactory on oss 最新備份文件的周期名, oss 上存儲(chǔ)的文件名稱是 last_circle_backup_dir_name+last_full_backup_file_suffix last_circle_backup_dir_name="mongodb_cycle_backup_20151124141133" last_full_backup_file_suffix=".tar.gz" # 備份的目錄,實(shí)際全量備份的路徑為 restore_local_temp_path+last_circle_backup_dir_name+db_name restore_local_temp_path="H:\\pythoncode\\temp\\restore\\" # 如果使用mongo客戶端綠色版的,寫(xiě)上mongo客戶端的絕對(duì)路徑 mongo_shell_path="/alidata1/dev/hanxuetong/mongodb/mongodb-linux-x86_64-3.0.6/bin/" # backup file has download to local ? if True,will not download backup files from oss # 是否備份文件已經(jīng)下載到本地,如果true,則不會(huì)從oss下載和解壓,本地已有 has_download_to_local=False # 恢復(fù)時(shí)是否先刪除舊的數(shù)據(jù)庫(kù) is_drop_old_restore=True
2. 執(zhí)行 restore_full.py
相關(guān):
一個(gè)周期內(nèi)(如一星期)先備份一次全量數(shù)據(jù)庫(kù),然后后面每次備份 上次記錄點(diǎn)到最新時(shí)間內(nèi)的oplog文件。 Oplog 記錄了MongoDB數(shù)據(jù)庫(kù)的更改操作信息,其保存在local庫(kù)的oplog.rs表,在集群架構(gòu)才存在,單機(jī)不會(huì)有,故增量備份不能在單機(jī)下使用。從庫(kù)是通過(guò)異步復(fù)制主庫(kù)的Oplog文件,從而達(dá)到與主庫(kù)的同步。 oplog有大小限制,超過(guò)指定大小,新的記錄會(huì)覆蓋舊的操作記錄。
全量腳本執(zhí)行時(shí)的流程
備份mongodb數(shù)據(jù)庫(kù)到本地
進(jìn)行壓縮
上傳到oss
檢驗(yàn)oss與本地文件的大小是否相同
刪除本地備份文件
增量腳本執(zhí)行時(shí)的流程
- 讀取上一個(gè)周期執(zhí)行信息判斷是否需要?jiǎng)?chuàng)建新的周期
- 獲得mongodb上oplog最近記錄的時(shí)間點(diǎn)current timestamp position
- 從本地讀取上一次執(zhí)行時(shí)mongodb的oplog時(shí)間點(diǎn)
- dump導(dǎo)出全量數(shù)據(jù)或增量oplog文件到本地,增量oplog文件的導(dǎo)出范圍是 上次oplog記錄點(diǎn)到最新時(shí)間內(nèi)的oplog文件
- 保存步驟2獲取的current timestamp position到本地,作為下一次執(zhí)行步驟3中的時(shí)間點(diǎn)
- 進(jìn)行壓縮
- 上傳到oss
- 刪除本地備份文件
恢復(fù)時(shí)腳本執(zhí)行的流程
- 從oss上下載指定周期的備份文件到本地
- 對(duì)全量文件和增量oplog的zip文件進(jìn)行解壓
- 用 mongorestore對(duì)全量文件進(jìn)行導(dǎo)入
- 用 mongorestore --oplogReplay 分別對(duì)各時(shí)間段的oplog文件進(jìn)行導(dǎo)入
mongodb增量備份 腳本源碼地址:
https://gitee.com/passer/mongodb_backup_script
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
- mongodb 數(shù)據(jù)庫(kù)操作--備份 還原 導(dǎo)出 導(dǎo)入
- MongoDB整庫(kù)備份與還原以及單個(gè)collection備份、恢復(fù)方法
- MongoDB備份、還原、導(dǎo)出、導(dǎo)入、克隆操作示例
- Windows下自動(dòng)備份MongoDB的批處理腳本
- Mongodb實(shí)現(xiàn)定時(shí)備份與恢復(fù)的方法教程
- Windows或Linux系統(tǒng)中備份和恢復(fù)MongoDB數(shù)據(jù)的教程
- Linux下MongoDB數(shù)據(jù)庫(kù)實(shí)現(xiàn)自動(dòng)備份詳解
- 淺談MongoDB的備份方式
- MongoDB使用自帶的命令行工具進(jìn)行備份和恢復(fù)的教程
- mongodb增量備份腳本的實(shí)現(xiàn)和原理詳解
相關(guān)文章
MongoDB4.0在windows10下的安裝與服務(wù)配置教程詳解
本文通過(guò)圖文并茂的形式給大家介紹了MongoDB4.0在windows10下的安裝與服務(wù)配置教程,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-08-08使用Mongodb實(shí)現(xiàn)打卡簽到系統(tǒng)的實(shí)例代碼
這篇文章主要介紹了使用Mongodb實(shí)現(xiàn)打卡簽到系統(tǒng)的示例代碼,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05Spring Boot中使用MongoDB數(shù)據(jù)庫(kù)的方法
MongoDB是一個(gè)高性能,開(kāi)源,無(wú)模式的,基于分布式文件存儲(chǔ)的文檔型數(shù)據(jù)庫(kù),由C++語(yǔ)言編寫(xiě),其名稱來(lái)源取自“humongous”,是一種開(kāi)源的文檔數(shù)據(jù)庫(kù)──NoSql數(shù)據(jù)庫(kù)的一種。這篇文章主要介紹了Spring Boot中使用MongoDB數(shù)據(jù)庫(kù)的方法,需要的朋友可以參考下2017-12-12MongoDB快速入門(mén)及其SpringBoot實(shí)戰(zhàn)教程
MongoDB是一個(gè)開(kāi)源、高性能、無(wú)模式的文檔型數(shù)據(jù)庫(kù),當(dāng)初的設(shè)計(jì)就是用于簡(jiǎn)化開(kāi)發(fā)和方便擴(kuò)展,是NoSQL數(shù)據(jù)庫(kù)產(chǎn)品中的一種,它支持的數(shù)據(jù)結(jié)構(gòu)非常松散,是一種類似于JSON的格式叫BSON,本文介紹MongoDB快速入門(mén)及其SpringBoot實(shí)戰(zhàn),感興趣的朋友一起看看吧2023-12-12MongoDB學(xué)習(xí)筆記之GridFS使用介紹
這篇文章主要介紹了MongoDB學(xué)習(xí)筆記之GridFS使用介紹,本文介紹了GridFS的作用、GridFS的一些使用方法、GridFS實(shí)現(xiàn)原理及注意事項(xiàng)等,需要的朋友可以參考下2015-07-07MongoDB在系統(tǒng)數(shù)據(jù)庫(kù)local中無(wú)法創(chuàng)建用戶的解決辦法
這篇文章主要給大家介紹了關(guān)于MongoDB在系統(tǒng)數(shù)據(jù)庫(kù)local中無(wú)法創(chuàng)建用戶的解決辦法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-11-11MongoDB數(shù)據(jù)庫(kù)安裝部署及警告優(yōu)化
大家好,本篇文章主要講的是MongoDB數(shù)據(jù)庫(kù)安裝部署及警告優(yōu)化,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽2021-12-12mongodb 數(shù)據(jù)生成Insert 語(yǔ)句的示例代碼
這篇文章主要介紹了mongodb 數(shù)據(jù)生成Insert 語(yǔ)句的示例代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作,具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03