使用 GitHub Actions 定时自动备份数据库(MySQL / MongoDB)
在日常开发或部署中,数据库备份是保证数据安全的重要环节。但手动备份不仅麻烦,也容易忘记。好在我们可以利用 GitHub Actions 的定时任务(schedule)能力 每天自动备份数据库,并上传到 GitHub、OSS 或服务器。
本文将介绍如何:
- 使用 GitHub Actions 定时执行备份
- 通过 SSH 登录服务器执行备份脚本
- 或直接在 GitHub Actions 中连接远程数据库备份
- 将备份文件上传到 GitHub Releases / 阿里云 OSS / AWS S3
一、准备工作
1. 在 GitHub 仓库中配置 Secrets
进入:
Settings → Secrets and variables → Actions → New repository secret
需要设置:
| Secret 名称 | 说明 |
|---|---|
SSH_PRIVATE_KEY |
用于连接服务器(如果你在服务器执行备份) |
DB_HOST |
数据库地址 |
DB_USER |
数据库用户名 |
DB_PASSWORD |
数据库密码 |
DB_NAME |
需要备份的库名 |
如果你在 GitHub Actions 内部直连数据库,则只需 DB 相关的 secret。
二、方法一:通过 SSH 登录服务器备份(最佳方案)
这种方式最稳定:
✔ 不暴露数据库端口
✔ 备份在服务器本地执行
✔ 支持 Docker 环境、物理机、云主机
1)服务器备份脚本 example
创建 /root/backup/mysql_backup.sh:
#!/bin/bash
set -e
DATE=$(date +"%Y%m%d_%H%M%S")
BACKUP_DIR="/root/backups/mysql"
mkdir -p $BACKUP_DIR
# 备份文件名
FILE="$BACKUP_DIR/${DATE}.sql.gz"
echo "开始备份: $FILE"
mysqldump -u root -p'密码改为你的' --databases gfds | gzip > "$FILE"
echo "备份完成:$FILE"
2)GitHub Actions workflow
.github/workflows/db-backup.yml
name: Database Backup
on:
schedule:
- cron: "0 18 * * *" # 每天 02:00(中国时间 UTC+8)
workflow_dispatch:
jobs:
backup:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup SSH
uses: webfactory/ssh-agent@v0.8.0
with:
ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }}
- name: Add server to known hosts
run: |
mkdir -p ~/.ssh
ssh-keyscan -H your-server-ip >> ~/.ssh/known_hosts
- name: Execute backup script on server
run: |
ssh root@your-server-ip "bash /root/backup/mysql_backup.sh"
只要配置好 SSH key,这个 workflow 就会每天自动执行。
备份会保存在服务器 /root/backups/mysql/。
三、方法二:在 GitHub Actions 中直接备份远程数据库
适用于支持外网访问数据库的场景。
MySQL 备份示例
name: Backup MySQL
on:
schedule:
- cron: "0 18 * * *"
workflow_dispatch:
jobs:
backup:
runs-on: ubuntu-latest
steps:
- name: Install MySQL client
run: sudo apt-get update && sudo apt-get install -y mysql-client
- name: Backup database
run: |
FILE="backup_$(date +%Y%m%d_%H%M%S).sql.gz"
mysqldump -h ${{ secrets.DB_HOST }} \
-u ${{ secrets.DB_USER }} \
-p${{ secrets.DB_PASSWORD }} \
${{ secrets.DB_NAME }} | gzip > $FILE
echo "备份文件:$FILE"
- name: Upload backup as artifact
uses: actions/upload-artifact@v4
with:
name: mysql-backup
path: "*.sql.gz"
四、方法三:备份 MongoDB
在服务器执行备份
mongo_backup.sh:
DATE=$(date +"%Y%m%d_%H%M%S")
DIR="/root/backups/mongo"
mkdir -p $DIR
mongodump --gzip --archive="$DIR/$DATE.gz"
echo "MongoDB 备份完成:$DIR/$DATE.gz"
GitHub Actions 同上,只是换一下脚本名。
五、上传备份到 GitHub / OSS / S3
你可以在 backup job 最后追加:
上传到 GitHub Releases
- name: Upload to GitHub Releases
uses: softprops/action-gh-release@v2
with:
tag_name: "backup-${{ github.run_id }}"
files: "*.gz"
上传到阿里云 OSS
- name: Upload to Aliyun OSS
uses: manyuanrong/aliyun-oss-website-action@v1.1.9
with:
accessKeyId: ${{ secrets.OSS_ID }}
accessKeySecret: ${{ secrets.OSS_SECRET }}
bucket: backup-bucket
endpoint: oss-cn-hangzhou.aliyuncs.com
folder: db-backups
localFolder: .
六、总结
GitHub Actions + 定时任务(cron)可以轻松实现自动化数据库备份。
根据你的系统结构,你可以选择:
| 场景 | 推荐方案 |
|---|---|
| 服务器上有数据库 | SSH 登录服务器执行备份(最安全) |
| 数据库允许外网访问 | 在 GitHub Actions 中直接备份 |
| 需要长期保存备份 | 上传 GitHub Releases / OSS / S3 |



