mongodb如何实现增量/全量备份脚本

62次阅读
没有评论

共计 3988 个字符,预计需要花费 10 分钟才能阅读完成。

这篇文章主要介绍了 mongodb 如何实现增量 / 全量备份脚本,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让丸趣 TV 小编带着大家一起了解一下。

功能

定期对 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

感谢你能够认真阅读完这篇文章,希望丸趣 TV 小编分享的“mongodb 如何实现增量 / 全量备份脚本”这篇文章对大家有帮助,同时也希望大家多多支持丸趣 TV,关注丸趣 TV 行业资讯频道,更多相关知识等着你来学习!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-04发表,共计3988字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)