Xtrabackup 2.4 异机流式备份:SSH免密配置与30天自动清理脚本

📅 2026/7/6 21:57:10 👁️ 阅读次数 📝 编程学习
Xtrabackup 2.4 异机流式备份:SSH免密配置与30天自动清理脚本

Xtrabackup 2.4 异机流式备份:SSH免密配置与30天自动清理实战指南

1. 生产环境备份方案设计思考

凌晨三点,当数据库告警短信突然响起时,有多少运维工程师曾后悔没有建立可靠的备份机制?Xtrabackup作为Percona公司开源的物理备份工具,已成为MySQL生态中事实上的备份标准。但仅仅会使用基础备份功能远远不够——真正的挑战在于构建一套完整、安全、自动化的备份体系。

我们需要的不仅是一次性备份,而是具备以下特性的解决方案:

  • 跨主机安全传输:避免备份文件与数据库同机存放的风险
  • 无人工干预:从备份到清理全流程自动化
  • 可验证机制:每次备份都有明确的成功/失败状态记录
  • 空间管理:防止陈旧备份耗尽磁盘空间

本文将呈现一个经生产环境验证的解决方案,包含SSH免密登录的安全配置、带错误检查的备份脚本,以及智能化的过期备份清理方案。不同于简单的命令集合,这是一个开箱即用的企业级备份框架。

2. SSH免密登录:安全与便利的平衡术

2.1 密钥对生成最佳实践

在备份服务器(假设IP为192.168.1.100)执行:

# 使用更强的ed25519算法替代传统RSA ssh-keygen -t ed25519 -f ~/.ssh/backup_key -N "" -C "xtrabackup-auto-$(date +%Y%m%d)"

关键参数解析:

  • -t ed25519:比RSA更安全高效的算法
  • -N "":设置空密码(生产环境建议使用密码短语)
  • -C:添加可识别的注释

生成的密钥对应严格设置权限:

chmod 600 ~/.ssh/backup_key chmod 644 ~/.ssh/backup_key.pub

2.2 安全传输与配置

将公钥传送到数据库服务器(192.168.1.101):

ssh-copy-id -i ~/.ssh/backup_key.pub mysql@192.168.1.101

在数据库服务器上加固SSH配置(/etc/ssh/sshd_config):

PermitRootLogin no PasswordAuthentication no AllowUsers mysql@192.168.1.100

验证连接:

ssh -i ~/.ssh/backup_key mysql@192.168.1.101 "echo Connection established"

3. 全量备份脚本架构剖析

3.1 基础备份命令优化

#!/bin/bash # 定义关键参数 BACKUP_DIR=/backups/xtrabackup REMOTE_HOST="mysql@192.168.1.101" REMOTE_DIR="/remote_backups" LOG_FILE="${BACKUP_DIR}/backup_$(date +%Y%m%d).log" SSH_KEY="~/.ssh/backup_key" # 创建当日备份目录 mkdir -p ${BACKUP_DIR}/$(date +%Y%m%d) # 执行流式备份 innobackupex \ --defaults-file=/etc/mysql/my.cnf \ --user=backup_user \ --password=$(cat /etc/mysql/backup_password) \ --stream=xbstream \ --compress \ --compress-threads=4 \ --parallel=4 \ --extra-lsndir=${BACKUP_DIR}/checkpoints \ ${BACKUP_DIR}/$(date +%Y%m%d) 2>${LOG_FILE} | \ ssh -i ${SSH_KEY} ${REMOTE_HOST} \ "xbstream -x -C ${REMOTE_DIR}/$(date +%Y%m%d)"

关键优化点:

  • --compress-threads:启用多线程压缩
  • --parallel:并行备份多个数据库
  • extra-lsndir:单独保存LSN信息

3.2 错误处理机制

在脚本中添加状态检查:

# 检查备份结果 if ! tail -1 ${LOG_FILE} | grep -q "completed OK!"; then echo "[ERROR] Backup failed at $(date)" | tee -a ${LOG_FILE} send_alert "Backup failed - check ${LOG_FILE}" exit 1 else echo "[INFO] Backup completed successfully at $(date)" | tee -a ${LOG_FILE} fi

4. 增量备份策略实现

4.1 基于LSN的增量备份

LAST_BACKUP=$(ls -d ${REMOTE_DIR}/*/ | sort | tail -n1) LSN_FILE="${LAST_BACKUP}/xtrabackup_checkpoints" innobackupex \ --incremental \ --incremental-lsn=$(awk '/to_lsn/ {print $3}' ${LSN_FILE}) \ --stream=xbstream \ --compress \ /tmp 2>>${LOG_FILE} | \ ssh -i ${SSH_KEY} ${REMOTE_HOST} \ "xbstream -x -C ${REMOTE_DIR}/incr_$(date +%Y%m%d_%H%M)"

4.2 备份验证流程

# 验证备份集一致性 ssh -i ${SSH_KEY} ${REMOTE_HOST} \ "innobackupex --apply-log --redo-only ${LAST_BACKUP} \ --incremental-dir=${REMOTE_DIR}/incr_$(date +%Y%m%d_%H%M)"

5. 自动化清理方案

5.1 基于find的清理脚本

#!/bin/bash BACKUP_ROOT=/remote_backups RETENTION_DAYS=30 # 删除过期全量备份 find ${BACKUP_ROOT} -maxdepth 1 -type d -name "20*" -mtime +${RETENTION_DAYS} \ -exec rm -rf {} \; # 删除过期增量备份 find ${BACKUP_ROOT} -maxdepth 1 -type d -name "incr_*" -mtime +${RETENTION_DAYS} \ -exec rm -rf {} \; # 清理空目录 find ${BACKUP_ROOT} -type d -empty -delete

5.2 安全增强措施

# 先打印将要删除的内容(dry run) find ${BACKUP_ROOT} -maxdepth 1 -type d -name "20*" -mtime +${RETENTION_DAYS} \ -exec echo "Will delete: {}" \; # 实际执行前确认剩余空间 MIN_SPACE=20 # GB available=$(df -BG ${BACKUP_ROOT} | awk 'NR==2 {print $4}' | tr -d 'G') if [ ${available} -lt ${MIN_SPACE} ]; then send_alert "Low disk space - cleanup required" fi

6. 完整方案集成

6.1 备份主脚本整合

#!/bin/bash # 全局配置 source /etc/xtrabackup_config.conf # 日志函数 log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a ${LOG_FILE} } # 备份函数 run_backup() { local backup_type=$1 local extra_args="" if [ "${backup_type}" = "incr" ]; then local last_backup=$(ssh -i ${SSH_KEY} ${REMOTE_HOST} \ "ls -d ${REMOTE_DIR}/20* | sort | tail -n1") extra_args="--incremental --incremental-lsn=\ $(ssh -i ${SSH_KEY} ${REMOTE_HOST} \ "awk '/to_lsn/ {print \$3}' ${last_backup}/xtrabackup_checkpoints")" fi innobackupex \ --defaults-file=${MY_CNF} \ --user=${DB_USER} \ --password=${DB_PASS} \ --stream=xbstream \ --compress \ --compress-threads=4 \ --parallel=4 \ --extra-lsndir=/tmp/checkpoints \ ${extra_args} \ /tmp 2>>${LOG_FILE} | \ ssh -i ${SSH_KEY} ${REMOTE_HOST} \ "mkdir -p ${REMOTE_DIR}/${BACKUP_NAME}; xbstream -x -C ${REMOTE_DIR}/${BACKUP_NAME}" } # 主流程 case $1 in full) BACKUP_NAME=$(date +%Y%m%d_%H%M-full) run_backup "full" ;; incr) BACKUP_NAME=$(date +%Y%m%d_%H%M-incr) run_backup "incr" ;; *) echo "Usage: $0 {full|incr}" exit 1 ;; esac

6.2 Crontab配置示例

# 每周日凌晨2点全量备份 0 2 * * 0 /usr/local/bin/xtrabackup_wrapper.sh full # 每天凌晨1点增量备份(除周日) 0 1 * * 1-6 /usr/local/bin/xtrabackup_wrapper.sh incr # 每月1号凌晨3点清理旧备份 0 3 1 * * /usr/local/bin/cleanup_backups.sh

7. 监控与异常处理

7.1 备份状态监控

# 检查最近备份是否成功 check_backup_status() { local last_log=$(ls -t ${BACKUP_DIR}/*.log | head -1) local last_backup=$(ssh -i ${SSH_KEY} ${REMOTE_HOST} \ "ls -dt ${REMOTE_DIR}/*/ | head -1") # 检查日志结尾 if ! tail -5 ${last_log} | grep -q "completed OK!"; then return 1 fi # 检查备份文件完整性 if ! ssh -i ${SSH_KEY} ${REMOTE_HOST} \ "[ -f ${last_backup}/xtrabackup_info ]"; then return 2 fi return 0 }

7.2 邮件报警集成

send_alert() { local subject="[Xtrabackup Alert] $1" local body="Error details:\n$2\n\nServer: $(hostname)\nTime: $(date)" echo -e "${body}" | mailx -s "${subject}" admin@example.com } # 使用示例 if ! check_backup_status; then send_alert "Backup verification failed" \ "Last backup may be corrupted. Please check ${LOG_FILE}" fi

8. 性能优化技巧

8.1 网络传输优化

# 使用更高效的压缩算法 innobackupex ... --compress --compress-threads=4 | \ ssh -i ${SSH_KEY} ${REMOTE_HOST} "xbstream -x -C ${REMOTE_DIR}" # 网络带宽限制(避免影响业务) --throttle=50 # 限制为50MB/s

8.2 内存与IO调整

# 增加读缓冲区 --use-memory=2G # 控制IO优先级 ionice -c2 -n7 innobackupex ...

9. 恢复演练流程

9.1 异机恢复步骤

# 在目标服务器准备备份 mkdir -p /restore/full /restore/incr scp -i backup_key user@backup_server:/remote_backups/* /restore/ # 应用日志 innobackupex --apply-log --redo-only /restore/full innobackupex --apply-log /restore/full --incremental-dir=/restore/incr # 恢复数据 innobackupex --copy-back /restore/full

10. 安全审计增强

10.1 SSH连接日志记录

# 在/etc/ssh/sshd_config中添加 LogLevel VERBOSE

10.2 备份文件校验

# 生成校验和 ssh -i ${SSH_KEY} ${REMOTE_HOST} \ "find ${REMOTE_DIR} -type f -exec sha256sum {} \; > ${REMOTE_DIR}/checksums.txt" # 验证校验和 ssh -i ${SSH_KEY} ${REMOTE_HOST} \ "cd ${REMOTE_DIR} && sha256sum -c checksums.txt"