这是一个基于 Docker 和 Percona XtraBackup 的 MySQL 数据库备份服务。它支持全量备份、增量备份,并可以将备份上传到 Rclone 支持的云存储中。
在启动服务之前,请确保项目根目录下存在以下配置文件:
- config.json: 服务配置文件
{
"mysql_user": "backup", // 备份用户
"mysql_password": "your_password", // 备份用户密码
"mysql_host": "mysql", // MySQL 主机地址
"mysql_port": 3306, // MySQL 端口
"parallel": 4, // 备份时的并行线程数
"local_backup_count": 7, // 本地保留的备份数量
"default_rclone_remote": "onedrive:", // 默认 Rclone 远程名称
"full_backup_interval": "12h", // 全量备份间隔
"incremental_backup_interval": "30m", // 增量备份间隔
"cleanup_interval": "1h", // 清理旧备份间隔
"rclone_upload_interval": "15m" // 上传到 Rclone 间隔
}- rclone.conf: Rclone 配置文件,用于连接云存储。
使用 Docker Compose 启动服务:
docker-compose up -d --build服务启动后将监听 32400 端口。
可以通过 HTTP 请求触发备份或下载任务。
curl -X POST http://localhost:32400/full \
-H "Content-Type: application/json" \
-d '{"drive": "onedrive:", "comment": "This is a full backup"}'curl -X POST http://localhost:32400/incremental \
-H "Content-Type: application/json" \
-d '{"drive": "onedrive:", "comment": "This is an incremental backup"}'从云存储下载备份到本地的 downloaded_backup 目录。
curl -X POST http://localhost:32400/download \
-H "Content-Type: application/json" \
-d '{"drive": "onedrive:", "backup_name": "db_20251130_1200"}'curl http://localhost:32400/health本指南说明如何手动进入容器并使用 xtrabackup 恢复数据。
docker-compose exec backup-service bash- 本地生成的备份位于
backup目录。 - 从云端下载的备份位于
downloaded_backup目录。
由于备份文件是使用 zstd 压缩的,在准备之前需要先解压。
# 假设备份目录为 /backup/db_20231027_1200
xtrabackup --decompress --target-dir=/backup/db_20231027_1200xtrabackup --prepare --target-dir=/backup/db_20231027_1200假设你有一个全量备份 db_full 和一个增量备份 db_inc。
-
准备全量备份(注意使用
--apply-log-only):xtrabackup --prepare --apply-log-only --target-dir=/backup/db_full
-
将增量备份应用到全量备份上。如果有多个增量备份,可以依次应用。如果为最后一个增量备份,去掉
--apply-log-only参数:xtrabackup --prepare --apply-log-only --target-dir=/backup/db_full --incremental-dir=/backup/db_inc
警告: 此操作将覆盖数据库的数据目录。请确保 MySQL 服务已停止,且数据目录为空(或已备份)。
-
停止 MySQL 服务(在宿主机执行):
docker stop <mysql_container_name>
-
清空 MySQL 数据目录(在 backup-service 容器内执行,请谨慎操作):
# 确保路径正确,例如: rm -rf /var/lib/mysql/*
-
执行恢复(在 backup-service 容器内执行):
# 假设你要恢复到的目录是 /var/lib/mysql (容器内的挂载点) xtrabackup --copy-back --target-dir=/backup/db_20231027_1200 --datadir=/var/lib/mysql -
修复权限(在宿主机执行): 恢复后的文件可能属于 root 用户,需要修改为 mysql 用户。
sudo chown -R 999:999 /path/to/mysql/data
-
启动 MySQL 服务:
docker start <mysql_container_name>