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