1. 程式人生 > >mongodb增量或全量備份指令碼

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有大小限制,超過指定大小,新的記錄會覆蓋舊的操作記錄。

全量指令碼執行時的流程

  1. 備份mongodb資料庫到本地

  2. 進行壓縮

  3. 上傳到oss

  4. 檢驗oss與本地檔案的大小是否相同

  5. 刪除本地備份檔案

增量指令碼執行時的流程

  1. 讀取上一個週期執行資訊判斷是否需要建立新的週期

  2. 獲得mongodb上oplog最近記錄的時間點current timestamp position

  3. 從本地讀取上一次執行時mongodb的oplog時間點

  4. dump匯出全量資料或增量oplog檔案到本地,增量oplog檔案的匯出範圍是 上次oplog記錄點到最新時間內的oplog檔案

  5. 儲存步驟2獲取的current timestamp position到本地,作為下一次執行步驟3中的時間點

  6. 進行壓縮

  7. 上傳到oss

  8. 刪除本地備份檔案

恢復時指令碼執行的流程

  1. 從oss上下載指定週期的備份檔案到本地

  2. 對全量檔案和增量oplog的zip檔案進行解壓

  3. 用 mongorestore對全量檔案進行匯入

  4. 用 mongorestore --oplogReplay 分別對各時間段的oplog檔案進行匯入

https://gitee.com/passer/mongodb_backup_script