一、前言
在生产MySQL运维中,单靠定时快照、逻辑备份无法满足企业级数据安全要求。XtraBackup作为InnoDB最优物理备份工具,支持无锁热备、压缩备份、增量备份,不影响业务正常读写。
本文为生产落地标准版,适配 CentOS7 + MySQL8.0.30 + XtraBackup8.0.30-23,实现:周日全量备份、工作日增量备份、自动过期清理、钉钉异常告警、Binlog异地冗余同步,搭建完整常态化数据备份体系。
二、环境基础规范
引导说明:统一标准化目录结构,集中管理备份文件、脚本、日志、binlog归档,避免文件散乱、权限混乱、查找困难。
模块用途:规范运维目录,统一后续所有备份、恢复、同步脚本路径,提升可维护性。
bash
# 初始化统一备份目录
mkdir -p /home/mysql/backup/mysql/{full,incremental,binlog,scripts,logs}
chown -R mysql:mysql /home/mysql/backup/mysql
chmod 750 /home/mysql/backup/mysql
三、核心工具安装(XtraBackup)
引导说明:使用 Percona XtraBackup 物理备份工具,适配MySQL8.0,搭建物理备份运行环境,是整库备份、增量备份、数据恢复的核心依赖。
模块用途:提供InnoDB引擎无损物理备份能力,支持压缩备份、增量备份、数据恢复,适配生产稳定运行。
bash
# 安装系统依赖
yum install -y wget yum-utils epel-release libaio-devel openssl-devel libev zstd
安装规范 :官网下载Percona XtraBackup 8.0.30-23(CentOS7 x86_64),仅安装主rpm包。
官网地址:https://www.percona.com/downloads/
版本要求:严格匹配 MySQL8.0.30,版本不一致会直接导致备份/恢复失败。

bash
# 验证安装有效性
xtrabackup --version
四、备份专属最小权限账号
引导说明:遵循最小权限原则,创建独立备份账号,不使用root高权限账号执行备份,保障数据库安全。
模块用途:满足XtraBackup备份所需权限,规避root账号泄露、误操作风险,符合生产安全规范。
sql
# 登录MySQL执行
mysql -uroot -p你的密码
# 创建专用备份账号并授权
CREATE USER 'bkuser'@'localhost' IDENTIFIED BY 'Backup@2026';
GRANT BACKUP_ADMIN, RELOAD, LOCK TABLES, REPLICATION CLIENT, PROCESS ON *.* TO 'bkuser'@'localhost';
GRANT SELECT ON performance_schema.* TO 'bkuser'@'localhost';
FLUSH PRIVILEGES;
五、钉钉告警配置
引导说明:接入钉钉机器人Webhook,绑定备份、binlog同步脚本,实现任务结果实时推送。
模块用途:杜绝备份静默失败、同步异常无人知晓,实现运维可视化监控。
配置方式:钉钉群新增自定义机器人,获取Webhook Token,替换脚本内对应参数即可生效。
六、自动全量+增量备份脚本(生产定稿)
引导说明:基于 XtraBackup 工具实现自动化物理备份,周日全量备份、工作日增量备份,自动清理过期备份、自动钉钉告警。
模块用途:常态化数据基线兜底,兼顾存储成本与数据完整性,实现无人值守自动化备份。
1. 脚本完整内容
bash
#!/bin/bash
BK_USER="bkuser"
BK_PASS="Backup@2026"
SOCKET="/tmp/mysql.sock"
BACKUP_DIR="/home/mysql/backup/mysql"
LOG_DIR="/home/mysql/backup/mysql/logs"
RETENTION_DAY=30
DING_WEBHOOK="你的钉钉token"
THROTTLE=40
THREADS=4
[ -z "${WEEK_DAY}" ] && WEEK_DAY=$(date +%w)
DATE=$(date +%Y%m%d)
LOG_FILE="${LOG_DIR}/xtra_backup_${DATE}.log"
mkdir -p ${BACKUP_DIR}/full ${BACKUP_DIR}/incremental ${LOG_DIR}
# 钉钉告警函数
send_ding() {
curl -X POST -H "Content-Type: application/json" -d "{\"msgtype\":\"text\",\"text\":{\"content\":\"$1\"}}" ${DING_WEBHOOK} >/dev/null 2>&1
}
# 自动清理30天前过期备份
find ${BACKUP_DIR} -type d -mtime +${RETENTION_DAY} -exec rm -rf {} \;
# 周日全量备份,工作日增量备份
if [ ${WEEK_DAY} -eq 0 ];then
TARGET_DIR="${BACKUP_DIR}/full/full_${DATE}"
xtrabackup --user=${BK_USER} --password=${BK_PASS} --socket=${SOCKET} --backup --compress --compress-threads=${THREADS} --parallel=${THREADS} --throttle=${THROTTLE} --target-dir=${TARGET_DIR} >> ${LOG_FILE} 2>&1
else
FULL_BASE=$(ls -d ${BACKUP_DIR}/full/full_* 2>/dev/null | sort | tail -n1)
[ -z "${FULL_BASE}" ] && send_ding "【备份失败】无基础全量备份" && exit 1
TARGET_DIR="${BACKUP_DIR}/incremental/incr_${DATE}"
xtrabackup --user=${BK_USER} --password=${BK_PASS} --socket=${SOCKET} --backup --compress --compress-threads=${THREADS} --parallel=${THREADS} --throttle=${THROTTLE} --incremental-basedir=${FULL_BASE} --target-dir=${TARGET_DIR} >> ${LOG_FILE} 2>&1
fi
# 备份结果告警
ret=$?
if [ ${ret} -eq 0 ];then
send_ding "【备份成功】${DATE}备份完成:${TARGET_DIR}"
else
send_ding "【备份失败】${DATE}备份异常,日志:${LOG_FILE}"
exit 1
fi
2. 脚本授权与测试
bash
# 授权脚本
chmod +x /home/mysql/backup/mysql/scripts/xtra_backup.sh
chown mysql:mysql /home/mysql/backup/mysql/scripts/xtra_backup.sh
# 手动测试全量备份
WEEK_DAY=0 bash /home/mysql/backup/mysql/scripts/xtra_backup.sh
# 手动测试增量备份
bash /home/mysql/backup/mysql/scripts/xtra_backup.sh
七、Binlog异地归档同步(增量数据兜底)
引导说明:使用 rsync 工具定时同步本地binlog至异地服务器,规避本地磁盘损坏、日志自动清理、误删导致增量数据丢失问题。
模块用途:物理备份只能留存基线数据,binlog归档兜底增量数据,实现最大程度数据零丢失。
1. 同步脚本内容
bash
#!/bin/bash
BINLOG_DIR="/home/mysql/mysql8/binlog"
LOG_FILE="/home/mysql/backup/mysql/logs/binlog_sync.log"
REMOTE_USER="root"
REMOTE_IP="192.168.1.200"
REMOTE_BINLOG_PATH="/data/mysql_binlog_backup"
DING_WEBHOOK="你的钉钉token"
# 钉钉告警
send_ding() {
curl -X POST -H "Content-Type: application/json" -d "{\"msgtype\":\"text\",\"text\":{\"content\":\"$1\"}}" ${DING_WEBHOOK} >/dev/null 2>&1
}
# 日志输出
log_print() {
echo "[$(date +%Y-%m-%d\ %H:%M:%S)] $1" >> ${LOG_FILE}
}
log_print "===== 开始同步 ====="
# 排除当前正在写入的活跃binlog,避免文件占用同步失败
ACTIVE_BINLOG=$(ls -lt ${BINLOG_DIR}/mysql-bin.* | head -1 | awk '{print $NF}')
rsync -av --delete --exclude=${ACTIVE_BINLOG} ${BINLOG_DIR}/mysql-bin.* ${REMOTE_USER}@${REMOTE_IP}:${REMOTE_BINLOG_PATH}/
if [ $? -eq 0 ];then
log_print "同步成功"
send_ding "【Binlog同步成功】"
else
log_print "同步失败"
send_ding "【严重告警】Binlog异地同步失败"
fi
2. 授权与免密配置(必做)
bash
# 脚本授权
chmod +x /home/mysql/backup/mysql/scripts/binlog_sync.sh
chown mysql:mysql /home/mysql/backup/mysql/scripts/binlog_sync.sh
# 配置异地服务器免密登录
ssh-keygen
ssh-copy-id root@192.168.1.200
# 远端服务器SSH权限固化(防止免密失效)
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
八、全局定时任务(常态化无人值守)
引导说明:依托Linux Crontab实现定时触发备份与binlog同步,全程无人值守。
模块用途:固化运维流程,杜绝人工漏执行、遗忘操作,保障数据防护常态化。
bash
crontab -e
# 每日0点20分 自动执行全量/增量备份
20 0 * * * /bin/bash /home/mysql/backup/mysql/scripts/xtra_backup.sh
# 每30分钟 同步一次binlog日志至异地
*/30 * * * * /bin/bash /home/mysql/backup/mysql/scripts/binlog_sync.sh
九、总结
本篇完成了生产MySQL完整备份防护体系搭建:标准化目录、专属备份账号、自动化全量/增量备份、异地binlog冗余、钉钉实时告警、定时任务固化。实现基线数据+增量数据双重兜底,彻底解决生产备份失效、数据丢失、运维无感知问题。
下一篇预告 :讲解基于本篇备份文件,实现 MySQL整库故障恢复 + MySQL8.0专属单表ibd精准恢复,最小化业务故障影响。