前言
mongodb備份腳本,可以全量或增量進行備份,兩年前所寫,目前網(wǎng)上mongodb備份相關(guān)的腳本也還是很少。下面話不多說了,來一起看看詳細的介紹吧
功能
定期對mongodb數(shù)據(jù)庫數(shù)據(jù)進行全量備份或增量備份(副本集架構(gòu)),并可以壓縮上傳到阿里云oss(本地會先生成壓縮包,可以設(shè)置不上傳oss)。
腳本運行環(huán)境
使用python語言編寫,需安裝python,pymongo和mongodb shell客戶端(測試時使用python 2.7.6,pymongo 3.0.3和mongodb shell 2.0.4)。
腳本部署步驟
1. 將腳本放到一臺linux主機
2. 如果是增量備份,創(chuàng)建mongodb 備份角色用戶或更高權(quán)限的admin庫用戶。(導(dǎo)出時會先切換到admin庫來驗證權(quán)限,需有查詢local庫,mongodump local庫和mongodump目標庫的權(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 連接配置
# 建議用從庫的地址,減少對主庫壓力
db_host= localhost
db_port= 27017
# 如果是增量備份方案,為步驟2中的創(chuàng)建的用戶,或更高權(quán)限的admin用戶;如果是全量備份方案,則只需有目標庫的操作權(quán)限
db_user= testb
db_passwd= testb
# 目標庫
db_name= che
# 備份到本地的臨時目錄
db_backup_root_path= /temp/backup/
# 如果使用mongo客戶端綠色版的,寫上mongo客戶端的絕對路徑
mongo_shell_path= /dev/hanxuetong/mongodb/mongodb-linux-x86_64-3.0.6/bin/
# 增量備份還是全量備份 1: 增量備份 0:全量備份
is_inc_backup=1
# 每多少天進行一次全量備份
full_backup_period=7
# 是否上傳到oss,如果 1 ,上傳成功后會刪除本地備份文件;0:不上傳到oss
is_upload_to_oss= 0
4. 將start.py加入linux定時任務(wù)。crontab任務(wù)配置如 0 4 * * * python /xxx/start.py >> /xxx/xxx.log 2>1
增量時恢復(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 最新備份文件的周期名,即備份臨時目錄中mongodb_inc_backup_info.json的last_circle_backup_dir_name 或 oss中文件夾名
last_circle_backup_dir_name="mongodb_cycle_backup_20151124141133"
# 從oss上下載到本地的臨時目錄
restore_local_temp_path="H:\\pythoncode\\temp\\restore\\"
# 如果使用mongo客戶端綠色版的,寫上mongo客戶端的絕對路徑
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,則不會從oss下載和解壓,本地已有
has_download_to_local=False
# 恢復(fù)時是否先刪除舊的數(shù)據(jù)庫
is_drop_old_restore=True
3. 導(dǎo)入期間停止mongodb寫入
4. 執(zhí)行 restore_inc.py
全量時恢復(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ù)庫對應(yīng)的用戶
db_user="test"
db_passwd="test"
db_name="che"
# recent circle backup direactory on oss 最新備份文件的周期名, oss 上存儲的文件名稱是 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"
# 備份的目錄,實際全量備份的路徑為 restore_local_temp_path+last_circle_backup_dir_name+db_name
restore_local_temp_path="H:\\pythoncode\\temp\\restore\\"
# 如果使用mongo客戶端綠色版的,寫上mongo客戶端的絕對路徑
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,則不會從oss下載和解壓,本地已有
has_download_to_local=False
# 恢復(fù)時是否先刪除舊的數(shù)據(jù)庫
is_drop_old_restore=True
2. 執(zhí)行 restore_full.py
相關(guān):
增量備份實現(xiàn)原理
一個周期內(nèi)(如一星期)先備份一次全量數(shù)據(jù)庫,然后后面每次備份 上次記錄點到最新時間內(nèi)的oplog文件。 Oplog 記錄了MongoDB數(shù)據(jù)庫的更改操作信息,其保存在local庫的oplog.rs表,在集群架構(gòu)才存在,單機不會有,故增量備份不能在單機下使用。從庫是通過異步復(fù)制主庫的Oplog文件,從而達到與主庫的同步。 oplog有大小限制,超過指定大小,新的記錄會覆蓋舊的操作記錄。
全量腳本執(zhí)行時的流程
備份mongodb數(shù)據(jù)庫到本地
進行壓縮
上傳到oss
檢驗oss與本地文件的大小是否相同
刪除本地備份文件
增量腳本執(zhí)行時的流程
- 讀取上一個周期執(zhí)行信息判斷是否需要創(chuàng)建新的周期
- 獲得mongodb上oplog最近記錄的時間點current timestamp position
- 從本地讀取上一次執(zhí)行時mongodb的oplog時間點
- dump導(dǎo)出全量數(shù)據(jù)或增量oplog文件到本地,增量oplog文件的導(dǎo)出范圍是 上次oplog記錄點到最新時間內(nèi)的oplog文件
- 保存步驟2獲取的current timestamp position到本地,作為下一次執(zhí)行步驟3中的時間點
- 進行壓縮
- 上傳到oss
- 刪除本地備份文件
恢復(fù)時腳本執(zhí)行的流程
- 從oss上下載指定周期的備份文件到本地
- 對全量文件和增量oplog的zip文件進行解壓
- 用 mongorestore對全量文件進行導(dǎo)入
- 用 mongorestore --oplogReplay 分別對各時間段的oplog文件進行導(dǎo)入
mongodb增量備份 腳本源碼地址:
https://gitee.com/passer/mongodb_backup_script
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
您可能感興趣的文章:- mongodb 數(shù)據(jù)庫操作--備份 還原 導(dǎo)出 導(dǎo)入
- MongoDB整庫備份與還原以及單個collection備份、恢復(fù)方法
- MongoDB備份、還原、導(dǎo)出、導(dǎo)入、克隆操作示例
- Windows下自動備份MongoDB的批處理腳本
- Mongodb實現(xiàn)定時備份與恢復(fù)的方法教程
- Windows或Linux系統(tǒng)中備份和恢復(fù)MongoDB數(shù)據(jù)的教程
- Linux下MongoDB數(shù)據(jù)庫實現(xiàn)自動備份詳解
- 淺談MongoDB的備份方式
- MongoDB使用自帶的命令行工具進行備份和恢復(fù)的教程
- mongodb增量備份腳本的實現(xiàn)和原理詳解