数据库备份工具
数据库备份脚本:DB Backup。
功能¶
- 支持 MySQL 和 PostgreSQL 数据库
- 可同时上传到 Amazon S3 和 Cloudflare R2 进行云端存储
- 支持配置多个备份任务
- 提供 GitHub Actions 工作流示例,以此为依托定时自动执行
执行要求¶
- Python
- 要备份数据库的类型的客户端,
mysqldump,pg_dump
安装¶
git clone https://github.com/chris1ding1/db-backup
cd db-backup
uv sync
配置¶
数据库、云存储的密钥配置¶
cp .env.example .env
编辑 .env 文件:
# 远程存储,多个用逗号分隔,如 r2,s3,留空则只保存本地
STORAGE_REMOTE_DEFAULT=
# AWS S3 配置
AWS_BUCKET=
AWS_DEFAULT_REGION=
AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
# Cloudflare R2 配置
CLOUDFLARE_ACCOUNT_ID=
CLOUDFLARE_BUCKET=
CLOUDFLARE_ACCESS_KEY_ID=
CLOUDFLARE_SECRET_ACCESS_KEY=
# MySQL 连接
MYSQL_HOST=127.0.0.1
MYSQL_PORT=3306
MYSQL_USER=
MYSQL_PASSWORD=
# PostgreSQL 连接
PGSQL_HOST=127.0.0.1
PGSQL_PORT=5432
PGSQL_USER=
PGSQL_PASSWORD=
备份配置¶
编辑 config.py 文件
数据库连接配置¶
DATABASE_CONNECTIONS: dict[str, dict] = {
"blog-db": { # 自定义 Key 名,在备份任务列表指定链接使用
"driver": DatabaseDriver.MYSQL, # 数据库类型。 MySQL 为:DatabaseDriver.MYSQL。PostgreSQL 为 DatabaseDriver.PGSQL。
"host": os.getenv("MYSQL_HOST", "127.0.0.1"),
"port": int(os.getenv("MYSQL_PORT", "3306")),
"user": os.getenv("MYSQL_USER"),
"password": os.getenv("MYSQL_PASSWORD"),
},
"shop-db": {
"driver": DatabaseDriver.PGSQL,
"host": os.getenv("PGSQL_HOST", "127.0.0.1"),
"port": int(os.getenv("PGSQL_PORT", "5432")),
"user": os.getenv("PGSQL_USER"),
"password": os.getenv("PGSQL_PASSWORD"),
},
# 可以添加更多连接...
}
# 备份任务列表
BACKUP_TASKS: list[dict] = [
{
"db_connection": "blog-db", # 使用哪个数据库连接。`DATABASE_CONNECTIONS` 中的 Key。
"dump_command": "", # 直接写导出备份命令。
"result_filename": "production.my_database", # 备份文件的文件名称。末尾自动添加 UTC 时区的年月日
"save_path": "my_database", # 备份文件的保存目录。本地将会保存到当前项目的 `backup/{save_path}` 下。云端的存储路径就本配置值。
},
# 可以添加更多任务...
]
执行¶
uv run python main.py
关于自动定时执行,可在服务器上配置 crontab。 另,本项目提供了 GitHub Actions 工作流配置示例,默认每月 1 号凌晨 1 点执行,也可手动触发。这样无需挂载在任何服务器上。使用方法:
- Fork 本项目,记得可见性是非公开
- 复制
backup.yml.example为backup.yml - 按需修改自动执行时间
- GitHub 仓库中配置环境变量 Secrets 和 Variables
- 按需修改工作流内设置
.env的命令,- name: Set environment variable部分