{"id":22729700,"url":"https://github.com/perfectstorm88/db-backup-and-restore","last_synced_at":"2025-04-13T23:13:27.176Z","repository":{"id":47793268,"uuid":"203899644","full_name":"perfectstorm88/db-backup-and-restore","owner":"perfectstorm88","description":"db-backup-and-restore（mysql、mongodb）","archived":false,"fork":false,"pushed_at":"2022-07-21T09:45:45.000Z","size":587,"stargazers_count":16,"open_issues_count":0,"forks_count":6,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-04-13T23:13:24.107Z","etag":null,"topics":["backup","mongodb","mongodump","mongorestore","mysql","mysqldump","oss","restore"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/perfectstorm88.png","metadata":{"files":{"readme":"README.MD","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2019-08-23T01:17:48.000Z","updated_at":"2024-12-25T13:24:59.000Z","dependencies_parsed_at":"2022-08-24T04:51:08.253Z","dependency_job_id":null,"html_url":"https://github.com/perfectstorm88/db-backup-and-restore","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/perfectstorm88%2Fdb-backup-and-restore","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/perfectstorm88%2Fdb-backup-and-restore/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/perfectstorm88%2Fdb-backup-and-restore/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/perfectstorm88%2Fdb-backup-and-restore/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/perfectstorm88","download_url":"https://codeload.github.com/perfectstorm88/db-backup-and-restore/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248794569,"owners_count":21162615,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["backup","mongodb","mongodump","mongorestore","mysql","mysqldump","oss","restore"],"created_at":"2024-12-10T18:11:27.581Z","updated_at":"2025-04-13T23:13:27.150Z","avatar_url":"https://github.com/perfectstorm88.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"**一种既便捷又超便宜的数据库(MySQL、MongoDB)备份与恢复方案**：数据库的备份和恢复是很古老的话题了，但是现有的方案没找到顺手的，没办法只能重新发明轮子了。代码参考[db-backup-and-restore](https://github.com/perfectstorm88/db-backup-and-restore)\n\n- [1.我的需求场景](#1我的需求场景)\n- [2.我的探寻过程](#2我的探寻过程)\n  - [2.1.阿里云的数据库备份RBS](#21阿里云的数据库备份rbs)\n  - [2.2.github上的开源方案](#22github上的开源方案)\n- [3.我的方案](#3我的方案)\n  - [3.1.方案总体框架](#31方案总体框架)\n  - [3.2.基于时间衰减的备份存储策略](#32基于时间衰减的备份存储策略)\n  - [3.3.恢复程序](#33恢复程序)\n- [4.quickstart](#4quickstart)\n  - [4.1.运行条件](#41运行条件)\n  - [4.2.下载工程代码](#42下载工程代码)\n  - [4.3.配置config.yml，定义第一个备份任务](#43配置configyml定义第一个备份任务)\n  - [4.4.数据库备份](#44数据库备份)\n  - [4.5.数据库恢复](#45数据库恢复)\n  - [4.5.1. 数据恢复执行样例](#451-数据恢复执行样例)\n- [6.配置参数详解](#6配置参数详解)\n- [7.基于Docker的部署](#7基于docker的部署)\n- [8.扩展阅读](#8扩展阅读)\n\n\n\n# 1.我的需求场景\n\n- 1.基本需求: 备份和容灾恢复，按指定时间周期备份，当生产系统故障时，能够进行恢复\n- 2.业务需求: 能够回滚恢复到某个指定时间点的数据\n  - 2.1.比如用户误删除数据或者把数据搞乱掉了，要求恢复到2个月前的数据再重新开始\n  - 2.2.开发测试时，有时会使用某个历史节点的数据进行功能测试\n- 3.备份和恢复使用方便，简单易懂\n- 4.故障后的恢复过程速度快\n- 5.廉价的备份成本\n- 6.备份数据除了保存在本地外，也能够保存在云存储\n- 7.支持mongodb、mysql等常用的业务数据库\n\n# 2.我的探寻过程\n\n## 2.1.阿里云的数据库备份RBS\n\n详细参见官网介绍：[阿里云的数据库备份服务RBS](https://help.aliyun.com/document_detail/59133.html?spm=a2c4g.11186623.6.542.360ed81dKYapLT)\n\nRBS满足需求场景中的1、2、3，功能还是挺强大的，但是有两个致命缺点，一个是贵，另一个是死慢死慢的\n\n第一点：贵，RBS是按备份数据量收费的，而备份数据量如下所示，“通过备份链路的实际数据大小”，跟你每个月执行备份的次数有关。如果我有50G数据，每天备份一次，每个月就要1000多块钱，另外备份存储也要单独收费\n![阿里云RBM中的数据量定义](./image/dbbr阿里云RBM中的数据量定义.jpg)\n\n第二点:最不能忍受，恢复数据执行起来死慢死慢的，我做了个测试，总共50M数据文件，RBS恢复了2个小时还没有执行完，这么点数据量用mongorestore，几秒钟就可以执行完。\n\n## 2.2.github上的开源方案\n\n- [mgob](https://github.com/stefanprodan/mgob/) : 一个golang大神写的，是基于docker容器的Mongodb备份程序。可以备份到亚马逊的S3、gcloud，也可以本地备份。\n  - 但是不支持备份到阿里云，\n  - 而且恢复数据的操作不太理想，需要手工下载到本地，然后再执行mongorestore命令，不够傻瓜化\n- [PyBackup](https://github.com/LoneKingCode/PyBackup):  可以存储到oss、腾讯云、七牛等，还比较适合我们的需求场景，但是没有对应的数据恢复功能。另外备份任务定时执行是通过操作系统的cron控制的\n- [mongodb-backup-manager](https://github.com/XiaocongDong/mongodb-backup-manager): 界面，但是说明文档不全，部署起来比较麻烦，自己本身还需要一个mongodb数据库。最关键的是也没有数据恢复功能\n- [AliyunRDS](https://github.com/Menyoupingxiaoguo/AliyunRDS): 实现阿里云RDS数据库备份数据库自动定时下载，并转储阿里云OSS文件服务器， 使用C#实现的，还把工程文件上传，看着就不利索！\n\n总结： 不管是阿里云的数据库备份RBS还是github已有的开源方案，都不是太适合我们的业务场景需求，只好重新造轮子了。\n\n# 3.我的方案\n\n## 3.1.方案总体框架\n【方案总体框架】包含两个主要程序：\n\n- 备份程序：常驻进程，周期性执行备份任务，备份文件保存在本地或者上传到云存储(如阿里云、七牛、腾讯云等)。\n- 恢复程序：单次执行，通过引导步骤傻瓜式操作，简单易上手\n\n![数据库备份和恢复流程](./image/dbbr数据库备份和恢复流程.jpg)\n\n## 3.2.基于时间衰减的备份存储策略\n【基于时间衰减的备份存储策略】\n备份存储的时间衰减策略： 越近的数据越重要，保存的时间间隔越小，份数越多；越老的数据重要性越小，保存的时间间隔越大，份数越少\n可以通过策略参数控制，例如：\n\n- `\"days\": 6`   最近6天，每天保存一份\n- `\"weeks\": 3`  最近3周，每周保存一份\n- `\"months\": 6` 最近6个月，每月保存一份\n- `\"years\": 5`  最近5年，每年保存一份，超过5年以上就不保留备份了\n\n![基于时间衰减的备份存储策略](./image/dbbr稀疏备份策略.jpg)\n\n\n\n比如5年的历史数据，备份数= 6 + 3 + 6 + 5 = 20\n\n以每个备份20G的存储大小为例，20G*20份==400G，购买一个500G的归档型存储包，每年的存储费用为135元，算是非常便宜的方案了（参加 [阿里云产品定价-对象存储OSS](https://www.aliyun.com/price/product?spm=a2c4g.11186623.2.13.5a9c7b554eTNZ0#/oss/detail)）\n![阿里云产品定价-对象存储OSS-存档存储包](./image/dbbr阿里云产品定价-对象存储OSS-存档存储包.jpg)\n\n## 3.3.恢复程序\n【恢复程序】的执行逻辑如下面有限状态机所示，用户只需要根据引导输入3个指令即可完成一个恢复：\n\n- input_uri: 输入目标数据库的uri\n- choice_task: 选择一个备份任务（在config.tasks中配置）\n- choice_file: 选择一个备份文件 (可以是本地的备份文件，也可以是远端的备份文件)\n![数据库恢复执行逻辑有限状态机](./image/dbbr数据库恢复执行逻辑有限状态机.jpg)\n\n# 4.quickstart\n\n## 4.1.运行条件\n\n- `python3.6版本以上`\n- 如果是mongodb，需要预安装mongodump和mongorestore命令\n- 如果是mysql，需要预安装mysql客户端,可以支持mysql和mysqldump命令\n\n## 4.2.下载工程代码\n```\ngit clone https://github.com/perfectstorm88/db-backup-and-restore\ncd db-backup-and-restore\npip install -r requirements.txt\ncp config.sample.yml config.yml\n```\n## 4.3.配置config.yml，定义第一个备份任务\n\n最简单的样例如下：\n```yml\ntmpPath: './temp'\narchivePath: './archive'\nlocal:\n  retention: 10   # number of backups to keep locally\n\ntasks:\n  - name: 'mongo_my_test1'\n    type: 'mongodb'  \n    schedule: \"day 13:15\" # 每天 13:15执行\n    params:  # 通过mongodump执行的参数\n      uri: \"mongodb://test:test@127.0.0.1:13722/lcz_test1\" #\n```\n\n## 4.4.数据库备份\n\n有两种启动方式，启动常驻进程，周期任务调度：\n\n```bash\nnohup python  $(pwd)/backup.py -l \u0026 # nohup方式启动\n```\n另一种方式，是直接启动任务，忽略schedule参数，立即执行数据库备份，一般应用在测试场景,如\n```bash\npython backup.py -t mongo_my_test1\n```\n\n## 4.5.数据库恢复\n\n执行restore.py ，按着引导步骤执行即可\n```bash\npython restore.py \n```\n## 4.5.1. 数据恢复执行样例\n恢复程序】的执行逻辑如下面有限状态机所示，用户只需要根据引导输入3个指令即可完成一个恢复：\n\n- input_uri: 输入目标数据库的uri\n- choice_task: 选择一个备份任务（在config.tasks中配置）\n- choice_file: 选择一个备份文件 (可以是本地的备份文件，也可以是远端的备份文件)\n![数据库恢复执行逻辑有限状态机](./image/dbbr数据库恢复执行逻辑有限状态机.jpg)\n\n执行 `python restore.py`命令，过程如下：\n```bash\n*******************welcome to use database restore program****************\n# 【输入】选择一个备份任务（任务名称是在config.yml )\nplease choice the task to restore  \n0) mongo_lcz_test1\n1) mysql_db1\n-1) return last step\n(choice task)-\u003e1\n# 【输入】选择一个数据源文件\nplease choice the following file to restore  \n 0) 20190829150621.zip 232.100 KB  (local)\n-1) return last step\n(choice task)-\u003e0\n# 【输入】输入目标数据库的uri\nplease input the destination db uri,format is [scheme://][user[:[password]]@]host[:port][/schema][?attribute1=value1\u0026attribute2=value2]\n(such as mysql://root:123456@127.0.0.1/db1)  \n(uri)-\u003emysql://root:123456@127.0.0.1/db2\n# 检查uri格式\nnow is check uri ....                            \n# 解压缩zip文件\nunzip file:/root/db-backup-and-restore/./archive/mysql_db1/20190829150621.zip \n# 执行数据库恢复命令\n2019-08-29 16:13:57,833 INFO start exec restore cmd: mysql  -uroot -p123456 -h47.99.73.225 db2 \u003c /root/db-backup-and-restore/temp/uIZ3XfhB/back.sql\n2019-08-29 16:13:57,857 DEBUG mysql: [Warningder] Using a password on the command line interface can be insecure.\n2019-08-29 16:14:01,041 DEBUG b\nprocess exit\n```\n\n\n# 6.配置参数详解\n```yml\ntmpPath: './temp'\narchivePath: './archive'\n# oss:  # 存储到OSS\n#   url: \"http://oss-cn-hangzhou.aliyuncs.com\"\n#   bucket: \"jfjun4test\"\n#   accessKey: \"accessKey\"\n#   secretKey: \"secretKey\"\n#   prefix: 'backup/'  # oss中的存储根路径\n#   # 存储策略，只有一个起作用，优先级timeDecay\u003eretention\u003eexpireDays，\n#   expireDays: 730  # 最大保存天数\n#   retention: 14    # 最大保留分数\n#   timeDecay:\n#     - months: 6 # 如果超过2个月后，每个月只保留一份\n#     - years: 10 # 如果超过2年后，每年只保留一份\n#     - days: 6\n#     - weeks: 3\n\n# 存放到本地,存放目录 {archivePath}/{task.name}/\nlocal:\n  # 稀疏策略，如果配置了稀疏策略，则retention失效，expireDays失效\n  expireDays: 730  # 最大保存天数\n  retention: 10    # 最大保留份数\n  timeDecay:   # 时间衰减保存策略\n    days: 6,   # 最近6天，每天保存一份\n    weeks: 3,  # 最近3周，每周保存一份\n    months: 6, # 最近6个月，每月保存一份\n    years: 5,  # 最近5年，每年保存一份，超过5年以上就不保留备份了\n\ntasks:\n  - name: 'mongo_lcz_test1'\n    type: 'mongodb'\n    # schedule表示执行时间策略\n    # \"day 03:21\" # 每天 03:21执行\n    # \"hour :31\" # 每小时 31分执行\n    # \"monday 03:21\" # 每周一 03:21执行\n    schedule: \"day 13:15\" # 每天 13:15执行\n    params:  # 通过mongodump执行的参数\n      # uri: \"mongodb://test:test@127.0.0.1:13722/lcz_test1\"\n      d: lcz_test1\n      u: test\n      p: test\n      h: 127.0.0.1:13722\n\n  - name: 'mysql_db1'\n    type: 'mysql'\n    schedule: \"day :00\"  # 每周\n    params:  # 通过mysqldumap执行的参数\n      # uri: \"mysql://root:123456@127.0.0.1/db1\"\n      u: \"root\"\n      p: \"123456\"\n      databases: \"db1\"\n      host: \"127.0.0.1\"\n```\n\n# 7.基于Docker的部署\n\n1. 构建镜像\n```bash\n./build.sh  #docker build --rm -t=db-backup-and-restore .\n```\n2. 使用docker-deploy-sample目录的例子：\n\n- config/config.yml 配置文件样例\n- start_once.sh  手工执行一次备份\n- start_demon.sh  以后台方式启动备份，按指定时间备份\n- start_restore.sh 手工执行数据恢复操作\n\n\n# 8.扩展阅读\n上述方案为全量备份，比较适合于中小型业务场景，比如200G以下的的数据量，如果是过T的数据量，可以考虑定期全量+增量备份方案，下面为扩展阅读\n\n- [MongoShake——基于MongoDB的跨数据中心的数据复制平台](https://github.com/alibaba/MongoShake):基于mongodb oplog的集群复制工具，可以满足迁移和同步的需求，进一步实现灾备和多活功能\n- [mongodb增量备份脚本与原理](https://my.oschina.net/passerman/blog/712035): 对应开源项目，https://gitee.com/passer/mongodb_backup_script\n- [史上最通俗易懂的IPFS入门介绍01](https://baijiahao.baidu.com/s?id=1602399996570066329\u0026wfr=spider\u0026for=pc):关于存储，有个朋友脑洞大开，推荐用IPFS","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fperfectstorm88%2Fdb-backup-and-restore","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fperfectstorm88%2Fdb-backup-and-restore","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fperfectstorm88%2Fdb-backup-and-restore/lists"}