新闻详情

新闻详情

首页 / 资讯中心 / 详情

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

发布时间:2026/7/6 21:53:40
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.pub2.2 安全传输与配置将公钥传送到数据库服务器192.168.1.101ssh-copy-id -i ~/.ssh/backup_key.pub mysql192.168.1.101在数据库服务器上加固SSH配置/etc/ssh/sshd_configPermitRootLogin no PasswordAuthentication no AllowUsers mysql192.168.1.100验证连接ssh -i ~/.ssh/backup_key mysql192.168.1.101 echo Connection established3. 全量备份脚本架构剖析3.1 基础备份命令优化#!/bin/bash # 定义关键参数 BACKUP_DIR/backups/xtrabackup REMOTE_HOSTmysql192.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 \ --userbackup_user \ --password$(cat /etc/mysql/backup_password) \ --streamxbstream \ --compress \ --compress-threads4 \ --parallel4 \ --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} fi4. 增量备份策略实现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}) \ --streamxbstream \ --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_DAYS30 # 删除过期全量备份 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 -delete5.2 安全增强措施# 先打印将要删除的内容dry run find ${BACKUP_ROOT} -maxdepth 1 -type d -name 20* -mtime ${RETENTION_DAYS} \ -exec echo Will delete: {} \; # 实际执行前确认剩余空间 MIN_SPACE20 # GB available$(df -BG ${BACKUP_ROOT} | awk NR2 {print $4} | tr -d G) if [ ${available} -lt ${MIN_SPACE} ]; then send_alert Low disk space - cleanup required fi6. 完整方案集成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} \ --streamxbstream \ --compress \ --compress-threads4 \ --parallel4 \ --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 ;; esac6.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.sh7. 监控与异常处理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 bodyError details:\n$2\n\nServer: $(hostname)\nTime: $(date) echo -e ${body} | mailx -s ${subject} adminexample.com } # 使用示例 if ! check_backup_status; then send_alert Backup verification failed \ Last backup may be corrupted. Please check ${LOG_FILE} fi8. 性能优化技巧8.1 网络传输优化# 使用更高效的压缩算法 innobackupex ... --compress --compress-threads4 | \ ssh -i ${SSH_KEY} ${REMOTE_HOST} xbstream -x -C ${REMOTE_DIR} # 网络带宽限制避免影响业务 --throttle50 # 限制为50MB/s8.2 内存与IO调整# 增加读缓冲区 --use-memory2G # 控制IO优先级 ionice -c2 -n7 innobackupex ...9. 恢复演练流程9.1 异机恢复步骤# 在目标服务器准备备份 mkdir -p /restore/full /restore/incr scp -i backup_key userbackup_server:/remote_backups/* /restore/ # 应用日志 innobackupex --apply-log --redo-only /restore/full innobackupex --apply-log /restore/full --incremental-dir/restore/incr # 恢复数据 innobackupex --copy-back /restore/full10. 安全审计增强10.1 SSH连接日志记录# 在/etc/ssh/sshd_config中添加 LogLevel VERBOSE10.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
网站建设 高端定制 企业官网