gobackup 自动将 MySQL 数据库备份到七牛云私有空间之二,线上部署

更新日期: 2025-10-27 阅读次数: 43 字数: 1122 分类: MySQL

继续前文 使用 gobackup 自动将 MySQL 数据库备份到七牛云私有空间,在本地测试了 gobackup 的基本功能之后,今天在几台线上服务器,包括阿里云和腾讯云的各种服务器,依次部署了 gobackup 备份服务。这里记录一下一些踩坑的地方。

消息通知设置

用 163 邮箱设置了邮件通知,测试失败日志如下:

2025/10/27 09:32:58 [Notifier] Running 1 Notifiers
2025/10/27 09:33:18 [Notifier] EOF

从 github issue 看,似乎是不支持 TLS:

When send mail via port 465, the error EOF will occur.

https://github.com/gobackup/gobackup/pull/288

对提交看是支持了的,但是我测试了几次,都是 EOF 错误。

所以,我决定,还是换成 webhook 方式吧,我在自己服务器上写一个接收接口,然后在自己的服务器上发邮件通知。

Webhook 通知实现

https://gobackup.github.io/configuration/notifiers/webhook

只需要处理 gobackup 发过来的 json 数据即可,格式如下:

{
  "title": "This is title",
  "message": "This is message"
}

果然,改成 webhook 方式后,测试成功了。邮件格式如下图:

gobackup 邮件截图

但是,如果每天备份成功都发邮件的话,未免太多了。

The on_success, on_failure option (default: true) for toggle when backup has been successfully or failed.

可以独立设置成功和失败的通知开关:

on_success: true
on_failure: true

还是都开启吧。我担心如果真失败了,而且邮件服务也出问题了,那就麻烦了。

线上新建一个七牛云私有空间

专门用于存储数据库备份文件,并且不允许外部访问下载。选了个离我最近的机房,对应的 region id:

  • 华东-浙江 cn-east-1
  • 华东-浙江2 cn-east-2

不能给独立的空间设置 access key 和 secret key,这个地方的体验不太好。

yaml 的注释语法

yaml 的注释是用 # 符号开头的,后面的内容都会被忽略掉。

可以方便的在配置文件中添加注释,解释每个配置项的作用和用法。或者存档一些废弃的配置项,以备后续参考。

配置文件放哪里

两个位置任选其一,如下:

~/.gobackup/gobackup.yml
/etc/gobackup/gobackup.yml

感觉第一种更方便一点。毕竟也用不到 root 权限,直接使用非 root 用户即可。

注意需要把文件权限修改,防止其他用户读取:

chmod 600 gobackup.yml

安装 gobackup

将本地的 gobackup 可执行文件 scp 上传到服务器上即可。

做成 Makefile 任务更方便一些。

.PHONY: deploy_gobackup
deploy_gobackup:
	scp -P $(SSH_PORT) /usr/local/bin/gobackup $(SERVER_USER)@$(SERVER_HOST):~/

然后登录服务器,移动到 /usr/local/bin 目录下即可。

sudo mv gobackup /usr/local/bin/

确认

$ which gobackup
/usr/local/bin/gobackup

mysql 单实例多个数据库的配置

参考:

https://github.com/gobackup/gobackup/issues/193

my_db_default: &my_db_default
  type: mysql
  host: localhost
  port: 3306
  username: root
  password: root
  args: --single-transaction --quick

models:
  my_app:
    databases:
      my_db1:
        <<: *my_db_default
        database: my_db1
      my_db2:
        <<: *my_db_default
        database: my_db2
      my_db3:
        <<: *my_db_default
        database: my_db3

yaml 的配置还是太灵活了,怪不得 rasa 也是用的 yaml 配置。

禁用 Web 功能

https://gobackup.github.io/configuration#webconfig

没有禁用 web 功能,所以,干脆设置一个非常复杂的账号和密码吧。

同时阿里云的防火墙也阻止了 2703 端口的访问。

甚至直接不用 gobackup start 服务,改成 crontab 系统定时任务。

先放到系统计划任务里跑着

crontab -e

每天凌晨 0 点跑一次:

0 0 * * * /usr/local/bin/gobackup perform >> ~/.gobackup/gobackup.log

crontab 没有执行,如何排查

Ubuntu 系统下,可以查看系统日志:

less /var/log/syslog

搜索 cron

Oct 27 14:41:01 localhost CRON[2698]: (ubuntu) CMD (/usr/local/bin/gobackup perform >> ~/.gobackup/gobackup.log)

看到 gobackup 的执行日志:

2025/10/27 14:41:01 [Config] Load config from default path.
2025/10/27 14:41:01 [Config] Load gobackup config failed: While parsing config: yaml: control characters are not allowed
2025/10/27 14:41:01 [Config] While parsing config: yaml: control characters are not allowed

这个问题,很诡异,发现 yaml 配置文件并没有任何问题。改成 root 用户的 crontab 后,就可以正常执行了。 看起来并不是权限的问题。而且不同用户的加载目录不同,而非 root 用户的目录下有一个我没有删除的 gobackup 可执行文件, 估计是把这个文件当成配置文件去加载了,导致报错。删除掉这个文件后,就可以正常执行了。

关于作者 🌱

我是来自山东烟台的一名开发者,有感兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊, 查看更多联系方式