mongodb增量/全量備份指令碼的實現詳解
前言
mongodb備份指令碼,可以全量或增量進行備份,兩年前所寫,目前網上mongodb備份相關的指令碼也還是很少。下面話不多說了,來一起看看詳細的介紹吧
功能
定期對mongodb資料庫資料進行全量備份或增量備份(副本集架構),並可以壓縮上傳到阿里雲oss(本地會先生成壓縮包,可以設定不上傳oss)。
指令碼執行環境
使用python語言編寫,需安裝python,pymongo和mongodb shell客戶端(測試時使用python 2.7.6,pymongo 3.0.3和mongodb shell 2.0.4)。
指令碼部署步驟
1. 將指令碼放到一臺linux主機
2. 如果是增量備份,建立mongodb 備份角色使用者或更高許可權的admin庫使用者。(匯出時會先切換到admin庫來驗證許可權,需有查詢local庫,mongodump local庫和mongodump目標庫的許可權)
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中的建立的使用者,或更高許可權的admin使用者;如果是全量備份方案,則只需有目標庫的操作許可權 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定時任務。crontab任務配置如 0 4 * * * python /xxx/start.py >> /xxx/xxx.log 2>&1
增量時恢復步驟:
1. 建立mongodb 具有applyOps許可權的角色 以及用此角色的使用者。(需有執行 mongorestore --oplogReplay的使用者許可權)
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匯入的配置 db_host="localhost" db_port=27017 # 步驟1建立的使用者 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 # 是否備份檔案已經下載到本地,如果true,則不會從oss下載和解壓,本地已有 has_download_to_local=False # 恢復時是否先刪除舊的資料庫 is_drop_old_restore=True
3. 匯入期間停止mongodb寫入
4. 執行 restore_inc.py
全量時恢復步驟:
1. 修改 restore_full.py裡的配置
## 阿里雲oss 配置 endpoint="oss.aliyuncs.com" accessKeyId="xxxxxxx" accessKeySecret="xxxxxxx" bucket="db-backup" ## mongodb匯入的配置 db_host="localhost" db_port=27017 # 資料庫對應的使用者 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 # 是否備份檔案已經下載到本地,如果true,則不會從oss下載和解壓,本地已有 has_download_to_local=False # 恢復時是否先刪除舊的資料庫 is_drop_old_restore=True
2. 執行 restore_full.py
相關:
增量備份實現原理
一個週期內(如一星期)先備份一次全量資料庫,然後後面每次備份 上次記錄點到最新時間內的oplog檔案。 Oplog 記錄了MongoDB資料庫的更改操作資訊,其儲存在local庫的oplog.rs表,在叢集架構才存在,單機不會有,故增量備份不能在單機下使用。從庫是通過非同步複製主庫的Oplog檔案,從而達到與主庫的同步。 oplog有大小限制,超過指定大小,新的記錄會覆蓋舊的操作記錄。
全量指令碼執行時的流程
備份mongodb資料庫到本地
進行壓縮
上傳到oss
檢驗oss與本地檔案的大小是否相同
刪除本地備份檔案
增量指令碼執行時的流程
- 讀取上一個週期執行資訊判斷是否需要建立新的週期
- 獲得mongodb上oplog最近記錄的時間點current timestamp position
- 從本地讀取上一次執行時mongodb的oplog時間點
- dump匯出全量資料或增量oplog檔案到本地,增量oplog檔案的匯出範圍是 上次oplog記錄點到最新時間內的oplog檔案
- 儲存步驟2獲取的current timestamp position到本地,作為下一次執行步驟3中的時間點
- 進行壓縮
- 上傳到oss
- 刪除本地備份檔案
恢復時指令碼執行的流程
- 從oss上下載指定週期的備份檔案到本地
- 對全量檔案和增量oplog的zip檔案進行解壓
- 用 mongorestore對全量檔案進行匯入
- 用 mongorestore --oplogReplay 分別對各時間段的oplog檔案進行匯入
mongodb增量備份 指令碼原始碼地址:
https://gitee.com/passer/mongodb_backup_script
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對我們的支援。