标签归档:github

使用 GitHub Actions 定时自动备份数据库(MySQL / MongoDB)

使用 GitHub Actions 定时自动备份数据库(MySQL / MongoDB)

在日常开发或部署中,数据库备份是保证数据安全的重要环节。但手动备份不仅麻烦,也容易忘记。好在我们可以利用 GitHub Actions 的定时任务(schedule)能力 每天自动备份数据库,并上传到 GitHub、OSS 或服务器。

本文将介绍如何:

  1. 使用 GitHub Actions 定时执行备份
  2. 通过 SSH 登录服务器执行备份脚本
  3. 或直接在 GitHub Actions 中连接远程数据库备份
  4. 将备份文件上传到 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