LighthouseApp/docker-compose-mysql-backup.yml
speakeloudest 75d4c48e41
Some checks failed
Build Windows / build (push) Has been cancelled
feat: 源码提交
2025-10-19 23:30:54 -07:00

182 lines
6.5 KiB
YAML
Executable File

version: '3.8'
services:
# MySQL 5.7 备份服务
mysql-backup:
image: percona/percona-xtrabackup:2.4 # 使用 2.4 版本支持 MySQL 5.7
container_name: mysql-backup
restart: unless-stopped
# 环境变量配置 - 请修改以下配置
environment:
# 🔗 远程 MySQL 5.7 服务器配置
MYSQL_HOST: "rm-0jog99u32x2n4935j9o.mysql.ap-southeast-7.rds.aliyuncs.com" # 远程 MySQL 服务器地址
MYSQL_PORT: "13306" # MySQL 端口
MYSQL_USER: "sysadmin" # 备份用户账号
MYSQL_PASSWORD: "vxxa#RbOQajEbjaxyErgPU_p$Boit8a9" # 备份用户密码
MYSQL_VERSION: "5.7" # MySQL 版本
# 📁 备份配置
BACKUP_DIR: "/backup" # 容器内备份目录
BACKUP_RETENTION_DAYS: "7" # 备份保留天数
BACKUP_SCHEDULE: "0 2 * * *" # 备份时间 (每天凌晨2点)
# 🔧 备份选项
BACKUP_TYPE: "full" # 备份类型: full(全量) / incremental(增量)
COMPRESS_BACKUP: "true" # 是否压缩备份
PARALLEL_THREADS: "2" # 并行线程数 (MySQL 5.7 建议使用较少线程)
# 挂载卷配置
volumes:
- ./backup:/backup # 本地备份目录映射
- ./scripts:/scripts # 备份脚本目录
- ./logs:/logs # 日志目录
- /etc/localtime:/etc/localtime:ro # 时区同步
# 网络配置
networks:
- backup-network
# 启动命令 - 执行备份脚本
command: >
bash -c "
echo 'MySQL 5.7 备份服务启动中...' &&
echo '远程服务器: $${MYSQL_HOST}:$${MYSQL_PORT}' &&
echo 'MySQL 版本: $${MYSQL_VERSION}' &&
echo '备份用户: $${MYSQL_USER}' &&
echo '备份目录: $${BACKUP_DIR}' &&
echo '备份计划: $${BACKUP_SCHEDULE}' &&
# 创建必要目录
mkdir -p $${BACKUP_DIR} $${BACKUP_DIR}/full $${BACKUP_DIR}/incremental /logs &&
# 安装 cron 和必要工具
apt-get update && apt-get install -y cron gzip pv &&
# 创建备份脚本
cat > /scripts/backup.sh << 'EOF'
#!/bin/bash
set -e
TIMESTAMP=$$(date +%Y%m%d_%H%M%S)
BACKUP_PATH=$${BACKUP_DIR}/$${BACKUP_TYPE}/$${TIMESTAMP}
echo \"[$$(date)] 开始 MySQL 5.7 备份到: $${BACKUP_PATH}\" >> /logs/backup.log
# 创建备份目录
mkdir -p $${BACKUP_PATH}
# 测试连接
echo \"[$$(date)] 测试 MySQL 连接...\" >> /logs/backup.log
mysql -h$${MYSQL_HOST} -P$${MYSQL_PORT} -u$${MYSQL_USER} -p$${MYSQL_PASSWORD} -e \"SELECT 1;\" 2>> /logs/backup.log
if [ $$? -ne 0 ]; then
echo \"[$$(date)] 错误: 无法连接到 MySQL 服务器\" >> /logs/backup.log
exit 1
fi
# 执行备份
if [ \"$${BACKUP_TYPE}\" = \"full\" ]; then
echo \"[$$(date)] 执行全量备份\" >> /logs/backup.log
innobackupex \\
--host=$${MYSQL_HOST} \\
--port=$${MYSQL_PORT} \\
--user=$${MYSQL_USER} \\
--password=$${MYSQL_PASSWORD} \\
--parallel=$${PARALLEL_THREADS} \\
--compress \\
--stream=tar \\
$${BACKUP_PATH} 2>> /logs/backup.log | gzip > $${BACKUP_PATH}/backup.tar.gz
else
echo \"[$$(date)] 执行增量备份\" >> /logs/backup.log
# 获取最新的全量备份作为基础
LATEST_FULL=$$(ls -t $${BACKUP_DIR}/full/ | head -1)
if [ -z \"$${LATEST_FULL}\" ]; then
echo \"[$$(date)] 错误: 没有找到全量备份,无法执行增量备份\" >> /logs/backup.log
exit 1
fi
innobackupex \\
--host=$${MYSQL_HOST} \\
--port=$${MYSQL_PORT} \\
--user=$${MYSQL_USER} \\
--password=$${MYSQL_PASSWORD} \\
--parallel=$${PARALLEL_THREADS} \\
--incremental \\
--incremental-basedir=$${BACKUP_DIR}/full/$${LATEST_FULL} \\
--compress \\
--stream=tar \\
$${BACKUP_PATH} 2>> /logs/backup.log | gzip > $${BACKUP_PATH}/backup.tar.gz
fi
# 验证备份文件
if [ -f \"$${BACKUP_PATH}/backup.tar.gz\" ] && [ -s \"$${BACKUP_PATH}/backup.tar.gz\" ]; then
echo \"[$$(date)] 备份成功: $${BACKUP_PATH}/backup.tar.gz\" >> /logs/backup.log
echo \"[$$(date)] 备份文件大小: $$(du -h $${BACKUP_PATH}/backup.tar.gz | cut -f1)\" >> /logs/backup.log
else
echo \"[$$(date)] 错误: 备份文件创建失败或为空\" >> /logs/backup.log
exit 1
fi
# 清理旧备份
echo \"[$$(date)] 清理超过 $${BACKUP_RETENTION_DAYS} 天的备份\" >> /logs/backup.log
find $${BACKUP_DIR} -type d -mtime +$${BACKUP_RETENTION_DAYS} -exec rm -rf {} + 2>/dev/null || true
echo \"[$$(date)] 备份完成: $${BACKUP_PATH}\" >> /logs/backup.log
EOF
# 设置脚本执行权限
chmod +x /scripts/backup.sh &&
# 设置 cron 任务
echo \"$${BACKUP_SCHEDULE} /scripts/backup.sh\" > /etc/cron.d/mysql-backup &&
chmod 0644 /etc/cron.d/mysql-backup &&
# 启动 cron 服务
service cron start &&
# 立即执行一次备份
echo '执行初始备份...' &&
/scripts/backup.sh &&
# 保持容器运行
echo 'MySQL 5.7 备份服务已启动,等待定时任务...' &&
tail -f /logs/backup.log
"
# 资源限制
deploy:
resources:
limits:
memory: 1G
cpus: '1.0'
reservations:
memory: 256M
cpus: '0.25'
# 备份监控服务 (可选)
backup-monitor:
image: nginx:alpine
container_name: backup-monitor
restart: unless-stopped
ports:
- "8080:80" # 监控界面端口
volumes:
- ./backup:/usr/share/nginx/html/backup:ro
- ./monitor:/usr/share/nginx/html:ro
networks:
- backup-network
depends_on:
- mysql-backup
# 网络配置
networks:
backup-network:
driver: bridge
# 卷配置
volumes:
backup-data:
driver: local
backup-logs:
driver: local