Gobackup + 腾讯云COS + mysql8配置

NatureChan 发布于 5 小时前 10 次阅读


🗄 CLI tool for backup your databases, files to cloud storages in schedully.
Go
2681

Gobackup是一个支持多种数据库(mysql / pg / redis等)+多种存储方式(本地,各种S3(backblaze cloudflare 腾讯 阿里))+通知的一个备份工具,支持定时备份数据库,压缩,再归档到各种目的地。集成度高,很优秀。

工具文档:https://gobackup.github.io/

文档稍微老了一些,有一些坑没列出来,这里我给一个可运行的配置方案供参考。

配置

先期准备

  • 用于备份的mysql用户、密码,给予对应权限。
  • 提前创建cos桶(bucket),提前复制好bucket-name,region等信息,并创建好子账户,拿到keyid和secret key。
    理论上s3都没问题。记得这个桶一定要是私有读写,你也不想大家都能下载你的备份吧。

docker-compose

docker-compose最简单,可以用network让gobackup容器能访问到数据库。

services:
  gobackup:
    image: huacnlee/gobackup:latest
    container_name: gobackup
    restart: always
    volumes:
      - /etc/gobackup/gobackup.yml:/etc/gobackup/gobackup.yml:ro
      # 如果需要备份本地文件,也可以挂载在这里
      # - ./data:/data
    # 也可以通过环境变量设置定时任务(Crontab 模式)
    # GoBackup 默认会根据配置文件中的 schedule 运行
    environment:
      - TZ=Asia/Shanghai
    networks:  # 把gobackup放在能访问数据库的docker子网里面
      - db

随后我们在host创建 /etc/gobackup/gobackup.yml 填入以下内容:
对于cron表达式,我也不会写,你可以把这段复制给ai,让它帮你完善。

models:
  # --- 1. 月度全量备份 ---
  monthly_full:
    schedule: "0 0 1 * *"  # 每月1日 00:00 执行 这个是cron表达式 你可以让ai帮你生成
    databases:
      mysql:
        type: mysql       # 数据库类型 mysql
        host: mysql       # 数据库主机名,在docker环境下写mysql数据库的容器名即可
        port: 3306        # 端口默认3306
        database: b<DELETED>c # 备份那个数据库
        username: b<DELETED>p # 用户
        password: 2<DELETED>f # 密码
        args: --skip-ssl --single-transaction --quick  # 这个很重要,如果不添加--skip-ssl 会在mysql8上报错(自签)
    storages:
      cos_tencent:
        type: cos
        bucket: b<DELETED>8  # bucket name 就是你bucket 域名前面那段 如:backup-123456789
        region: ap-tokyo     # 区域 ap-tokyo就是日本东京,可以看域名中间 如 ap-shenzhen 就是深圳
        access_key_id: A<DELETED>7  # access key id 前面创建子账户要复制的
        secret_access_key: c<DELETED>9  # access key 前面创建子账户复制的
        path: /backups/monthly/         # 备份路径,这个是到cos底下备份的
        keep: 3  # 保留 3 份
        storage_class: STANDARD          # 存储类型,参看:https://cloud.tencent.com/document/product/436/33417 
        force_path_style: false  # 这个文档没有,不添加的话会报错 “PathStyleDomainForbidden” 参见 https://github.com/gobackup/gobackup/issues/233
     compress_with:
        type: tgz    # 采用tag.gz格式压缩,节省空间

这里归纳一下几个坑:

  • args 如果不带 --skip-ssl 且mysql服务器为自签证书(默认如此),在备份的时候会报错,提示“TLS/SSL error: self-signed certificate in certificate chain”
  • 对象是腾讯云COS,必须携带 force_path_style: false 强制gobackup不使用path_style调用腾讯云cos api,否则上传会提示 “PathStyleDomainForbidden: The bucket you are attempting to access must be addressed using COS virtual-styled domain.”

配置完毕以后把docker容器跑起来,接下来我们可以使用命令手动跑一次备份,后面就都是自动的了。

ubuntu@VM-0-3-ubuntu /e/gobackup [1]> sudo docker exec -it gobackup gobackup perform -m monthly_full
2026/05/04 14:10:16 [Config] Load config from default path.
2026/05/04 14:10:16 [Config] Config file: /etc/gobackup/gobackup.yml
2026/05/04 14:10:16 [Config] Config loaded, found 2 models.
2026/05/04 14:10:16 [Model: monthly_full] WorkDir: /tmp/gobackup1290750539/1777875016771840744/monthly_full
2026/05/04 14:10:16 [Database] => database | mysql: mysql
2026/05/04 14:10:16 [MySQL] -> Dumping MySQL...
2026/05/04 14:12:32 [MySQL] dump path: /tmp/gobackup1290750539/1777875016771840744/monthly_full/mysql/mysql
2026/05/04 14:12:32 [MySQL] Dump succeeded
2026/05/04 14:12:32 [Compressor] => Compress | tar
2026/05/04 14:12:48 [Compressor] -> /tmp/gobackup1290750539/1777875016771840744/2026.05.04.14.12.32.tar
2026/05/04 14:12:48 [Storage] => Storage | cos
2026/05/04 14:12:48 [QCloud COS] -> Uploading (3.8 GB)...
2026/05/04 14:12:48 [QCloud COS] [=========================================] 100.00% (40.27 MiB p/s)
2026/05/04 14:14:17 [QCloud COS] Uploaded: https://<removed> (Duration 1 minute 29 seconds)
2026/05/04 14:14:17 [Model] Cleanup temp: /tmp/gobackup1290750539/
2026/05/04 14:14:18 [Notifier] Running 0 Notifiers

跑去看一下腾讯云的cos,能看到文件就算成功了。

可选的优化操作

跳过某些表

实际上有一些表不需要备份,比如我项目里有个功能是站内信,因为历史原因很大(>5G),但其实数据不重要,此时我们可以配置参数去忽略某个表。

    databases:
      mysql:
        type: mysql
        host: mysql
        port: 3306
        database: b<removed>c
        username: b<removed>p
        password: 2<removed>f
        # 排除特定的表
        exclude_tables:
          - message
        # 这样就排除了message标
        args: --skip-ssl --single-transaction --quick

切片

如果你的s3对象是openlist,或者使用webdav去上传,那么会遇到单个文件太大传不上去的问题。这个问题唯一的解决方式是将文件切成几个部分上传,详见:https://gobackup.github.io/configuration/splitter

models:
  monthly_full:
    schedule: "0 0 1 * *"
    databases:
      mysql: ...  # <此处略>
    storages: ... # <此处略>
  # 添加split_with块
  split_with:
      chunk_size: 500m   # 多少mb为一块 这里是500m 这样比如你的原文件是1400m,就会被切割成三个部分去上传。

还原的话,按照序号首尾相连拼接在一起应该就ok。

通知

备份失败需要通知到位,参考:https://gobackup.github.io/configuration/notifiers/mail

此作者没有提供个人介绍。
最后更新于 2026-05-04