Skip to content

37705109/gobackup_incre

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

GoBackup

企业级数据库全量/增量备份与智能恢复解决方案

Gitee 仓库 | 下载中心 | 问题反馈


📋 目录


🚀 项目介绍

GoBackup 是一款企业级数据库备份与恢复解决方案,专为应用服务器设计。支持多种数据库的全量与增量备份,提供灵活的存储选项和智能恢复功能,大幅降低存储成本和恢复时间。

注意: 本项目托管在 Gitee 平台,提供稳定的国内访问体验。所有功能完整,持续更新维护。

核心优势

  • 智能增量备份:支持 binlog、时间戳、主键范围等多种增量策略
  • 零停机恢复:分阶段恢复,可在全量恢复后验证数据完整性
  • 存储高效:增量备份可节省 99%+ 存储空间
  • 多云支持:支持本地、S3、OSS、GCS 等多种存储后端
  • Web 管理:直观的管理界面,支持备份监控和历史查看
  • 容器化部署:完整的 Docker 和 docker-compose 支持

✨ 功能特性

数据库支持

  • MySQL: 支持全量 + binlog 增量备份
  • PostgreSQL: 支持全量 + WAL 增量备份
  • MongoDB: 支持全量 + oplog 增量备份
  • Redis: 支持 RDB 和 AOF 备份
  • SQLite: 文件级备份
  • 其他: InfluxDB、MariaDB、etcd、SQL Server

存储后端

  • 本地存储: 直接存储到本地目录
  • 云存储: S3、阿里云 OSS、Google Cloud Storage、Azure Blob
  • 传统协议: FTP、SFTP、SCP
  • 对象存储: MinIO、腾讯云 COS、华为云 OBS

增量策略

  • binlog: MySQL binlog 位置增量(推荐)
  • time: 基于时间字段的增量备份
  • size: 基于文件大小变化的增量
  • oplog: MongoDB oplog 增量
  • 主键范围: 基于主键 ID 范围的增量

🛠 部署方式

二进制部署

1. 下载安装

# 方式一:安装脚本
curl -sSL https://gitee.com/monkey_dat/gobackup/raw/master/install | sh

# 方式二:手动下载
wget https://gitee.com/monkey_dat/gobackup/releases/latest/download/gobackup-linux-amd64.tar.gz
tar -xzf gobackup-linux-amd64.tar.gz
sudo mv gobackup /usr/local/bin/

2. 创建配置目录

sudo mkdir -p /etc/gobackup
sudo mkdir -p /var/log/gobackup
sudo mkdir -p /var/lib/gobackup

3. 创建系统服务

# 创建 systemd 服务文件
sudo tee /etc/systemd/system/gobackup.service > /dev/null <<EOF
[Unit]
Description=GoBackup Database Backup Service
After=network.target

[Service]
Type=simple
User=root
ExecStart=/usr/local/bin/gobackup start
Restart=always
RestartSec=5
StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target
EOF

# 启用并启动服务
sudo systemctl daemon-reload
sudo systemctl enable gobackup
sudo systemctl start gobackup

Docker 部署

1. 使用 docker-compose(推荐)

Clone 项目 git clone https://gitee.com/monkey_dat/gobackup.git
打包前端

cd web  && npm install 
npm run build 

构建后端

 GOOS=linux GOARCH=amd64 go build -o gobackup main.go 
 (因为通过 go:embed 内嵌 dist,所以直接打包二进制即可)

拷贝二进制文件到Dockerfile目录

CP gobackup /path

打包容器

docker build -t gobackup_incre:tag . 

项目已包含优化的 docker-compose.yml

version: '3.8'

services:
  gobackup:
    image: gobackup_incre:tag
    container_name: gobackup
    restart: unless-stopped

    # 数据目录映射
    volumes:
      # 配置文件(只读)
      - /data/gobackup_data/gobackup.yml:/etc/gobackup/gobackup.yml:ro
      # 数据持久化
      - /data/gobackup_data/data:/var/lib/gobackup
      - /data/gobackup_data/logs:/var/log/gobackup

    # 环境变量
    environment:
      - GOBACKUP_CONFIG=/etc/gobackup/gobackup.yml
      - GOBACKUP_DIR=/var/lib/gobackup
      - GOBACKUP_LOG_PATH=/var/log/gobackup/gobackup.log
      - TZ=Asia/Shanghai

    # Web 接口端口
    ports:
      - "2703:2703"

    # 日志配置
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"

2. 部署和启动

# 克隆项目
git clone https://gitee.com/monkey_dat/gobackup.git
cd gobackup

# 创建数据目录
sudo mkdir -p /data/gobackup_data/{data,logs}

# 复制并编辑配置文件
sudo cp tests/fixtures/gobackup.yml /data/gobackup_data/gobackup.yml
sudo vim /data/gobackup_data/gobackup.yml

# 构建镜像(如果需要)
docker-compose build

# 启动服务
docker-compose up -d

# 查看日志
docker-compose logs -f gobackup

目录结构:

/data/gobackup_data/
├── gobackup.yml      # 主配置文件
├── data/             # 备份状态和记录
└── logs/             # 运行日志

3. 单独运行 Docker

# 方式一:使用自定义镜像(推荐)
docker pull gobackup_incre:v0.1.15

# 方式二:使用阿里云镜像
docker pull registry.cn-hangzhou.aliyuncs.com/monkey_dat/gobackup:latest

# 快速启动
docker run -d \
  --name gobackup \
  -p 2703:2703 \
  -v /data/gobackup_data/gobackup.yml:/etc/gobackup/gobackup.yml:ro \
  -v /data/gobackup_data/data:/var/lib/gobackup \
  -v /data/gobackup_data/logs:/var/log/gobackup \
  -e TZ=Asia/Shanghai \
  gobackup_incre:v0.1.15

⚙️ 配置详解

基础配置结构

# /etc/gobackup/gobackup.yml 或 ~/.gobackup/gobackup.yml

models:
  # 模型名称,可定义多个备份任务
  mysql_production:
    # 增量备份配置
    incremental:
      enabled: true                 # 启用增量备份
      strategy: binlog              # 增量策略: time/size/binlog/oplog
      base_backup_days: 7           # 全量备份间隔天数
      max_incrementals: 6           # 两次全量备份间最大增量数
      retention_days: 30            # 备份保留天数,0 表示永久保留
      
    # 数据库配置
    databases:
      mysql_db:
        type: mysql
        host: 
        port: 
        database: test
        username: root
        password: 
        additional_options: "--single-transaction --routines --triggers"
        
    # 存储配置
    storages:
      s3_backup:
        type: s3
        bucket: dbbackup
        region: us-east-1
        path: backups_new
        access_key_id: ${S3_ACCESS_KEY}
        secret_access_key: ${S3_SECRET_KEY}
        endpoint: http://172.20.101.251:9000
        
    # 压缩配置
    compress_with:
      type: tgz
      
    # 加密配置(可选)
    encrypt_with:
      type: openssl
      password: ${ENCRYPT_PASSWORD}
      
    # 调度配置
    schedule:
      cron: "0 2 * * *"              # 每天凌晨 2 点执行
      
    # 通知配置(可选)
    notifiers:
      mail:
        type: mail
        smtp_host: smtp.gmail.com
        smtp_port: 587
        smtp_user: backup@company.com
        smtp_pass: ${SMTP_PASSWORD}
        to: admin@company.com

增量策略详解

1. binlog 策略(MySQL 推荐)

incremental:
  enabled: true
  strategy: binlog
  base_backup_days: 7
  max_incrementals: 6
  retention_days: 30

原理: 基于 MySQL binlog 位置进行增量备份 优点: 精确捕获数据变更,备份文件最小 要求: MySQL 需开启 binlog

2. time 策略(基于时间字段)

incremental:
  enabled: true
  strategy: time
  time_column: updated_at        # 时间字段名
  base_backup_days: 7

原理: 只备份时间字段大于上次备份时间的记录 优点: 适用于有时间戳字段的表 限制: 表必须有时间字段

3. size 策略(基于文件大小)

incremental:
  enabled: true
  strategy: size
  size_threshold: 10MB           # 大小变化阈值

原理: 当数据库文件大小变化超过阈值时触发增量 优点: 简单易用 缺点: 粒度较粗

存储配置示例

S3 兼容存储

storages:
  s3_minio:
    type: s3
    bucket: backup-bucket
    region: us-east-1
    path: mysql-backups
    access_key_id: minioadmin
    secret_access_key: minioadmin
    endpoint: http://minio:9000
    force_path_style: true

阿里云 OSS

storages:
  aliyun_oss:
    type: oss
    bucket: my-backup-bucket
    region: oss-cn-hangzhou
    path: database-backups
    access_key_id: ${ALIYUN_ACCESS_KEY}
    secret_access_key: ${ALIYUN_SECRET_KEY}

本地存储

storages:
  local_backup:
    type: local
    path: /data/backups
    keep: 30                       # 保留最近 30 个备份

📊 备份策略

全量备份逻辑

  1. 数据导出: 使用 mysqldump/pg_dump 等工具导出完整数据
  2. 压缩打包: 使用 gzip/tar 压缩备份文件
  3. 加密处理: 可选的 OpenSSL 加密
  4. 存储上传: 上传到配置的存储后端
  5. 状态记录: 记录备份元信息和 binlog 位置

增量备份逻辑

binlog 增量流程

graph TD
    A[检查是否需要增量备份] --> B{距离上次全量备份天数}
    B -->|< base_backup_days| C[执行增量备份]
    B -->|>= base_backup_days| D[执行全量备份]
    C --> E[获取当前 binlog 位置]
    E --> F[从上次位置提取 binlog]
    F --> G[生成增量 SQL]
    G --> H[压缩并上传]
    H --> I[更新备份状态]
    D --> J[mysqldump 全量导出]
    J --> K[记录当前 binlog 位置]
    K --> L[上传全量备份]
Loading

时间增量流程

graph TD
    A[查询表结构] --> B{是否有时间字段}
    B -->|有| C[查询上次备份时间]
    B -->|无| D[跳过该表]
    C --> E[WHERE time_column > last_backup_time]
    E --> F[导出增量数据]
    F --> G[生成 INSERT SQL]
    G --> H[压缩上传]
Loading

备份决策算法

func ShouldPerformFullBackup(lastFullBackup time.Time, config IncrementalConfig) bool {
    daysSinceLastFull := time.Since(lastFullBackup).Hours() / 24
    
    // 超过设定天数,执行全量备份
    if daysSinceLastFull >= float64(config.BaseBackupDays) {
        return true
    }
    
    // 增量备份数量达到上限,执行全量备份
    incrementalCount := GetIncrementalCount(lastFullBackup)
    if incrementalCount >= config.MaxIncrementals {
        return true
    }
    
    return false
}

📚 使用教程

1. 快速开始

# 1. 创建配置文件
mkdir -p ~/.gobackup
cp gobackup_test.yml ~/.gobackup/gobackup.yml

# 2. 编辑配置
vim ~/.gobackup/gobackup.yml

# 3. 执行备份
gobackup perform

# 4. 启动守护进程
gobackup start

2. 手动执行备份

# 执行所有模型的备份
gobackup perform

# 执行指定模型的备份
gobackup perform --model mysql_production

# 强制执行全量备份
gobackup perform --model mysql_production --full

# 查看备份状态
gobackup status

3. Web 界面管理

启动服务后访问 http://localhost:2703

  • 首页: 查看备份概览和最近备份状态
  • 增量备份: 管理增量备份设置和历史
  • 文件列表: 浏览和下载备份文件
  • 恢复工具: 在线恢复向导

🔄 恢复指南

GoBackup 提供了强大的恢复脚本 restore_binlog_complete.sh,支持全量+增量的智能恢复。

恢复脚本特性

  • 交互式恢复: 分阶段恢复,每步可验证
  • 自动发现: 智能识别备份文件类型和顺序
  • 多源支持: 支持本地和 S3 存储恢复
  • 增量链: 自动处理多个增量备份的依赖关系

基本用法

1. 查看帮助

./restore_binlog_complete.sh --help

2. 本地恢复(交互模式)

# 自动发现目录中的备份文件
./restore_binlog_complete.sh \
  --local-dir /path/to/backups \
  --target-db restored_database \
  --mysql-host localhost \
  --mysql-port 3306 \
  --mysql-user root \
  --mysql-pass password

恢复过程:

  1. 列出所有备份文件
  2. 自动识别全量和增量备份
  3. 恢复全量备份
  4. 显示数据库连接信息供验证
  5. 询问是否继续恢复增量备份
  6. 按顺序恢复每个增量备份

3. 指定文件恢复

./restore_binlog_complete.sh \
  --full-backup /backups/2025.06.26.16.18.40.tar \
  --incremental-dir /backups/2025.06.26.16.19.05.tar \
  --target-db restored_db

4. S3 恢复

./restore_binlog_complete.sh \
  --from-s3 \
  --s3-bucket dbbackup \
  --s3-prefix backups_new \
  --s3-full-key 2025.06.26.16.18.40.tar \
  --s3-incr-key 2025.06.26.16.19.05.tar \
  --target-db restored_db \
  --auto

5. 多增量恢复

# 目录结构示例:
# /backups/
#   ├── 2025.06.26.16.18.40.tar (2.5M - 全量)
#   ├── 2025.06.26.16.19.05.tar (20K - 增量1)
#   ├── 2025.06.26.16.20.15.tar (15K - 增量2) 
#   └── 2025.06.26.16.21.30.tar (10K - 增量3)

./restore_binlog_complete.sh --local-dir /backups --target-db restored_db

恢复验证

每个阶段恢复后,脚本会显示验证信息:

[INFO] 恢复的表数量: 25
[INFO] 恢复的表列表:
  users
  orders
  products
  ...
[INFO] 数据库统计信息:
  users: 50000 rows
  orders: 120000 rows
  products: 5000 rows

🔗 数据库连接信息:
  mysql -h localhost -P 3306 -u root -p restored_db

💡 验证命令示例:
  # 查看所有表
  mysql -h localhost -P 3306 -u root -ppassword -e "SHOW TABLES;" restored_db
  
  # 查看某个表的数据量
  mysql -h localhost -P 3306 -u root -ppassword -e "SELECT COUNT(*) FROM users;" restored_db

高级恢复选项

干运行模式

# 只显示恢复计划,不实际执行
./restore_binlog_complete.sh \
  --local-dir /backups \
  --target-db test_restore \
  --dry-run

自动模式

# 跳过所有交互确认
./restore_binlog_complete.sh \
  --local-dir /backups \
  --target-db restored_db \
  --auto

MongoDB恢复参数配置

跳过admin数据库,避免覆盖用户账号

./restore_mongodb_complete.sh --local-dir . --skip-admin

# 只恢复业务数据库
./restore_mongodb_complete.sh --local-dir . --include-dbs ecm_uat,gobackup_test

# 排除系统数据库
./restore_mongodb_complete.sh --local-dir . --exclude-dbs admin,config,local

🌐 Web 管理界面

功能概览

  • 仪表板: 备份状态概览
  • 增量管理: 查看和管理增量备份
  • 历史记录: 备份历史和文件下载
  • 恢复向导: 图形化恢复界面

增量备份管理

Web 界面提供了直观的增量备份管理:

  • 查看当前增量配置
  • 监控备份链状态
  • 手动触发全量/增量备份
  • 清理过期备份

💡 最佳实践

1. 备份策略建议

# 生产环境推荐配置
models:
  production:
    incremental:
      enabled: true
      strategy: binlog              # 使用 binlog 策略
      base_backup_days: 7           # 每周全量备份
      max_incrementals: 6           # 最多6个增量
      retention_days: 30            # 保留30天
    schedule:
      cron: "0 2 * * *"            # 凌晨2点备份(低峰期)

2. 存储优化

  • 本地 + 云端: 本地快速恢复,云端长期存储
  • 多区域备份: 跨区域冗余存储
  • 生命周期策略: 设置存储类别转换

3. 监控告警

notifiers:
  mail:
    type: mail
    # 备份成功/失败都发送邮件
    on_success: true
    on_failure: true
    smtp_host: smtp.company.com
    to: devops@company.com

4. 安全配置

encrypt_with:
  type: openssl
  password: ${STRONG_PASSWORD}    # 使用环境变量
  
# 敏感信息使用环境变量
databases:
  mysql_db:
    password: ${MYSQL_PASSWORD}

5. 性能调优

  • 并行备份: 多个数据库可并行备份
  • 压缩级别: 根据 CPU/存储平衡选择压缩级别
  • 网络优化: 配置合适的上传并发数

🔧 故障排除

常见问题

1. 备份失败

# 检查日志
tail -f /var/log/gobackup/gobackup.log

# 检查数据库连接
mysql -h host -P port -u user -p database

# 检查存储权限
aws s3 ls s3://bucket/path/

2. 增量备份异常

# 检查 binlog 是否开启
SHOW VARIABLES LIKE 'log_bin';

# 检查 binlog 文件
SHOW BINARY LOGS;

# 检查备份状态文件
cat /var/lib/gobackup/backup_state.json

3. 恢复失败

# 检查目标数据库权限
GRANT ALL PRIVILEGES ON restored_db.* TO 'user'@'%';

# 检查磁盘空间
df -h

# 检查备份文件完整性
tar -tzf backup.tar

4. Docker 相关问题

# 查看容器日志
docker logs gobackup

# 进入容器调试
docker exec -it gobackup bash

# 检查容器网络
docker network ls

5. 定时任务大文件上传失败

问题症状

  • 定时任务备份大文件(>1GB)时出现 IncompleteBody 错误
  • 手动执行相同备份却能正常完成
  • 错误信息:You did not provide the number of bytes specified by the Content-Length HTTP header

原因分析: 定时任务使用了互斥锁机制,在大文件多部分上传过程中可能出现并发冲突,导致Content-Length不匹配。

解决方案

  1. 配置更长的上传超时时间
storages:
  s3_backup:
    type: s3
    timeout: 1800  # 30分钟,默认300秒可能不够
    # ... 其他配置
  1. 调整S3兼容存储的分片大小
storages:
  s3_backup:
    type: s3
    # 对于MinIO等S3兼容存储,可以调整这些参数
    max_retries: 5
    force_path_style: true
    # ... 其他配置
  1. 使用更稳定的备份策略

    • 考虑使用增量备份减少单次备份文件大小
    • 将大型数据库拆分为多个小的备份任务
    • 使用本地存储作为中转,再同步到云存储
  2. 监控和重试机制

    • 程序已内置重试机制(最多3次)
    • 建议配置通知器以及时发现上传失败
    • 可以通过Web界面查看备份状态和日志

配置示例

models:
  large_db_backup:
    # 对于大型数据库,建议启用增量备份
    incremental:
      enabled: true
      strategy: binlog
      base_backup_days: 7
      
    storages:
      s3_reliable:
        type: s3
        timeout: 3600        # 1小时超时
        max_retries: 5       # 增加重试次数
        
    # 配置失败通知
    notifiers:
      mail:
        type: mail
        on_failure: true     # 失败时发送邮件

日志配置

# 在配置文件中添加日志配置
logger:
  level: info                     # debug/info/warn/error
  file: /var/log/gobackup/app.log
  max_size: 100                   # MB
  max_files: 5

性能监控

# 查看备份性能
time gobackup perform

# 监控磁盘 I/O
iostat -x 1

# 监控网络流量
iftop

📄 许可证

MIT License


🤝 贡献

欢迎提交 Issue 和 Pull Request!

  1. Fork 本项目
  2. 创建功能分支 (git checkout -b feature/amazing-feature)
  3. 提交更改 (git commit -m 'Add amazing feature')
  4. 推送到分支 (git push origin feature/amazing-feature)
  5. 创建 Pull Request

📞 技术支持


GoBackup - 让数据备份变得简单可靠 🚀

About

Support for incremental functions of mongodb and MySQL based on the original project

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors