第一篇:MySQL8.0生产备份实战|XtraBackup全自动全量+增量备份(钉钉告警+异地Binlog归档)

一、前言

在生产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精准恢复,最小化业务故障影响。

相关推荐
山峰哥1 小时前
‌Explain实战:打开数据库执行计划的黑盒‌
大数据·服务器·数据库·sql·深度优先·宽度优先
wzy06232 小时前
VIP + Orchestrator + 自定义脚本 MySQL 高可用方案
mysql·orchestrator
ClickHouseDB2 小时前
ClickHouse 26.6 版本发布说明
数据库
Wang's Blog2 小时前
Java框架快速入门:深入MyBatis-Plus高级DML操作(ID策略·逻辑删除·乐观锁)
java·数据库·mybatis
小二·13 小时前
RAG + 向量数据库实战:ChromaDB / Milvus / FAISS 选型与性能横评
数据库·milvus·faiss
矜持的左手13 小时前
电子小白的枕边书:电子学(The Art of Electronics)
数据库·restful
吴声子夜歌13 小时前
Redis 5.x——布隆过滤器
数据库·redis·缓存
蓝天下的守望者14 小时前
svt_apb_if里的宏定义问题
运维·服务器·数据库