Percona XtraBackup 工具使用指南,从安装配置到全量/增量备份恢复的完整流程。
Percona XtraBackup MySQL 热备份工具手册(详细版)
——从零开始 · 原理图解 · 命令详解 · 生产实战
基于 Percona XtraBackup 8.0.25-17 适用对象:DBA / 运维工程师 编制日期:2026年6月
第一章 XtraBackup 是什么
第二章 工作原理(含原理图)
第三章 安装与环境配置
第四章 完整备份(含流程图)
第五章 增量备份(含流程图)
第六章 备份的 Prepare(准备)
第七章 恢复数据(含流程图)
第八章 压缩备份
第九章 加密备份
第十章 流式备份与远程备份
第十一章 高级备份方式(含流程图)
第十二章 备份策略与规划(含全景图)
第十三章 权限与配置
第十四章 常用选项速查
第十五章 常见问题与排查
第十六章 GoldenDB 集成实战
附录 A 备份文件说明
附录 B 完整备份脚本模板
Percona XtraBackup 是一款开源的 MySQL 热备份工具,由 Percona 公司开发维护。它可以在 MySQL 服务不停止、不锁表的情况下,对 InnoDB 和 XtraDB 存储引擎的数据进行在线备份。
简单来说:XtraBackup 能在你的数据库正常运行、用户正常读写的时候,把数据完整地备份出来,而且备份过程中数据库几乎不受影响。
传统的 MySQL 备份方式有几种,但都有明显的缺点:
| 备份方式 | 优点 | 缺点 |
|---|---|---|
| mysqldump | 简单、逻辑备份 | 锁表、速度慢、大库耗时 |
| FLUSH TABLES WITH READ LOCK | 一致性好 | 全局锁、阻塞所有写入 |
| LVM 快照 | 几乎不锁表 | 需要 LVM 支持、操作复杂 |
| XtraBackup | 热备份、不锁表、速度快 | 需要安装额外工具 |
XtraBackup 有两个主要版本线:
• XtraBackup 2.4:支持 MySQL 5.5/5.6/5.7,使用 innobackupex 脚本(已废弃)
• XtraBackup 8.0:支持 MySQL 8.0+,直接使用 xtrabackup 命令(推荐)
本手册基于 XtraBackup 8.0.25-17 编写,GoldenDB 服务器上已安装在 /opt/aio/airflow/tools/mysql/xtrabackup/8.0-linux-x86_64/
XtraBackup 的核心原理是:拷贝 InnoDB 数据文件 + 持续跟踪 Redo Log,实现不锁表的热备份。
要理解 XtraBackup,首先要理解 InnoDB 的崩溃恢复机制:
InnoDB 使用 Redo Log(重做日志)来保证事务的持久性。当数据库崩溃重启时,InnoDB 会自动将 Redo Log 中已提交但未写入数据文件的事务重新应用,使数据恢复到一致状态。
XtraBackup 正是利用了这个机制:
1. 拷贝数据文件(即使拷贝过程中有修改也没关系)
2. 同时记录 Redo Log 的变化
3. 备份完成后,将 Redo Log 应用到数据文件上(Prepare)
4. 这样数据文件就达到了崩溃恢复后的一致状态
LSN 是 InnoDB 中的一个 64 位递增计数器,每写入一条 Redo Log 就会递增。XtraBackup 通过 LSN 来判断:
• from_lsn:备份开始时的 LSN
• to_lsn:备份结束时的 LSN
• 最近检查点(last checkpoint):已刷盘的 LSN
增量备份就是通过对比 LSN 来识别"哪些页面在备份期间被修改过"。
XtraBackup 在备份过程中使用两种锁:
• LOCK TABLES FOR BACKUP(Percona Server 特有):阻止 DDL 操作,但允许 DML(读写)继续
• LOCK INSTANCE FOR BACKUP(MySQL 8.0+):类似功能,锁定实例元数据
这意味着备份期间应用可以正常读写数据,只是不能执行 DDL(如 ALTER TABLE、CREATE TABLE 等)。
在 GoldenDB 集群中,XtraBackup 已经预装在服务器上:
# XtraBackup 8.0(推荐,支持 MySQL 8.0)
/opt/aio/airflow/tools/mysql/xtrabackup/8.0-linux-x86_64/xtrabackup
# XtraBackup 2.4(支持 MySQL 5.7)
/opt/aio/airflow/tools/mysql/xtrabackup/2.4-linux-x86_64/xtrabackup
# 查看版本
/opt/aio/airflow/tools/mysql/xtrabackup/8.0-linux-x86_64/xtrabackup --version
注意:GoldenDB 自带的 xtrabackup(在 /data/zxdb4/bin/ 下)需要 libdn_os.so 库,这是定制版本。直接使用 Percona 原版更稳定。
为了方便使用,可以创建软链接:
# 创建软链接
ln -s /opt/aio/airflow/tools/mysql/xtrabackup/8.0-linux-x86_64/xtrabackup /usr/local/bin/xtrabackup
# 验证
xtrabackup --version
运行 XtraBackup 的数据库用户需要以下权限:
-- 创建备份专用用户
CREATE USER 'xtrabackup'@'localhost' IDENTIFIED BY 'your_password';
-- 授权
GRANT RELOAD, LOCK TABLES, REPLICATION CLIENT, BACKUP_ADMIN ON *.* TO 'xtrabackup'@'localhost';
FLUSH PRIVILEGES;
权限说明:
• RELOAD:执行 FLUSH 操作
• LOCK TABLES:锁定表
• REPLICATION CLIENT:查看 Binlog 位置
• BACKUP_ADMIN:执行 LOCK INSTANCE FOR BACKUP、访问 performance_schema.log_status
下图展示了 XtraBackup 完整备份的完整流程:
一条命令就能完成完整备份:
# 最简备份(使用默认值)
xtrabackup --backup --target-dir=/data/backup/full
# 指定用户名密码
xtrabackup --backup \
--user=xtrabackup --password=your_password \
--target-dir=/data/backup/full
备份过程中会输出很多信息,关键看这几行:
xtrabackup: Transaction log of lsn (15188961605) to (15188961790) was copied.
completed OK! ← 看到这个就说明备份成功了
备份完成后,目标目录包含以下内容:
| 文件/目录 | 说明 | 重要程度 |
|---|---|---|
| xtrabackup_checkpoints | 备份类型、LSN范围、状态 | ⭐⭐⭐ 必看 |
| xtrabackup_binlog_info | 备份时的Binlog文件和位置 | ⭐⭐⭐ 必看 |
| backup-my.cnf | Prepare时使用的InnoDB配置 | ⭐⭐ 重要 |
| xtrabackup_logfile | Redo Log数据(Prepare用) | ⭐⭐ 重要 |
| <数据目录>/ | 拷贝的数据文件(.ibd等) | ⭐⭐⭐ 核心数据 |
# 查看 xtrabackup_checkpoints
cat /data/backup/full/xtrabackup_checkpoints
# 输出示例:
backup_type = full-backuped ← 备份类型
from_lsn = 0 ← 起始LSN
to_lsn = 15188961605 ← 结束LSN
last_lsn = 15188961790 ← 最新LSN(包含备份后的变化)
# 查看 Binlog 位置
cat /data/backup/full/xtrabackup_binlog_info
# 输出:binlog.000003 15188961605
增量备份只拷贝自上次备份以来发生变化的数据页面,大大节省存储空间和备份时间:
增量备份基于 LSN(Log Sequence Number)工作:
1. XtraBackup 在备份时记录当前的 LSN
2. 对比数据文件中每个页面的 LSN,只拷贝 LSN 大于上次备份 to_lsn 的页面
3. 将拷贝的页面记录到 .delta 文件中
这意味着:增量备份的大小取决于"有多少数据被修改",而不是"数据总量"。
# 第一步:完整备份(作为增量的基础)
xtrabackup --backup \
--user=xtrabackup --password=your_password \
--target-dir=/data/backup/full
# 第二步:基于完整备份做增量
xtrabackup --backup \
--user=xtrabackup --password=your_password \
--target-dir=/data/backup/inc1 \
--incremental-basedir=/data/backup/full
# 第三步:基于上一次增量做新的增量
xtrabackup --backup \
--user=xtrabackup --password=your_password \
--target-dir=/data/backup/inc2 \
--incremental-basedir=/data/backup/inc1
查看各备份的 LSN 范围,确认增量链是否完整:
# Full 备份
cat /data/backup/full/xtrabackup_checkpoints
backup_type = full-backuped
from_lsn = 0
to_lsn = 15188961605
# Incr1 备份
cat /data/backup/inc1/xtrabackup_checkpoints
backup_type = incremental
from_lsn = 15188961605 ← 必须等于 Full 的 to_lsn
to_lsn = 15188962100
# Incr2 备份
cat /data/backup/inc2/xtrabackup_checkpoints
backup_type = incremental
from_lsn = 15188962100 ← 必须等于 Incr1 的 to_lsn
to_lsn = 15188962500
⚠️ 关键:如果增量备份的 from_lsn 不等于上次备份的 to_lsn,说明增量链断裂,恢复时会失败。
XtraBackup 备份出来的数据文件不能直接用于恢复。在恢复之前,必须执行 Prepare 操作,将 Redo Log 应用到数据文件上,使数据达到一致状态。
可以理解为:备份时拷贝的数据文件就像是"崩溃后的数据库文件",Prepare 就是"模拟崩溃恢复"的过程。
# Prepare 完整备份
xtrabackup --prepare --target-dir=/data/backup/full
# 看到以下输出说明 Prepare 完成:
InnoDB: Log sequence number...
InnoDB: ...shutdown complete
xtrabackup: completed OK!
增量备份的 Prepare 需要按顺序合并:先 Prepare Full,再逐个 Apply Incremental。
⚠️ 中间步骤必须加 --apply-log-only,只有最后一步不加!
# Step 1: Prepare Full(加 --apply-log-only)
xtrabackup --prepare --apply-log-only \
--target-dir=/data/backup/full
# Step 2: Apply Incremental 1(加 --apply-log-only)
xtrabackup --prepare --apply-log-only \
--target-dir=/data/backup/full \
--incremental-basedir=/data/backup/inc1
# Step 3: Apply Incremental 2(不加 --apply-log-only)
xtrabackup --prepare \
--target-dir=/data/backup/full \
--incremental-basedir=/data/backup/inc2
为什么最后一步不能加 --apply-log-only?因为不加这个参数,XtraBackup 会在最后执行一个 "roll back uncommitted transactions" 的操作,确保所有未提交的事务被回滚。如果加了,这个步骤会被跳过,数据可能不一致。
Step 1:停止 MySQL 服务
systemctl stop mysqld
Step 2:清理数据目录
# ⚠️ 这会删除所有数据!确认后再执行
rm -rf /var/lib/mysql/*
Step 3:恢复数据
# 使用 --copy-back(拷贝备份文件到数据目录)
xtrabackup --copy-back \
--target-dir=/data/backup/full \
--datadir=/var/lib/mysql
# 或者使用 --move-back(移动,节省磁盘空间)
xtrabackup --move-back \
--target-dir=/data/backup/full \
--datadir=/var/lib/mysql
Step 4:修改文件权限
chown -R mysql:mysql /var/lib/mysql
Step 5:启动 MySQL
systemctl start mysqld
恢复完成后,验证数据是否正确:
# 连接 MySQL
mysql -u root -p
# 检查数据库列表
SHOW DATABASES;
# 检查关键表的数据
SELECT COUNT(*) FROM important_table;
# 检查 Binlog 位置
SHOW MASTER STATUS;
完整备份可能非常大(几十GB甚至上百GB)。压缩可以大幅减少磁盘占用:
• ZSTD 压缩(默认):压缩比 3:1 ~ 5:1,速度最快,推荐使用
• LZ4 压缩:压缩比 2:1 ~ 3:1,速度极快,适合 CPU 敏感场景
# ZSTD 压缩(默认算法,推荐)
xtrabackup --backup \
--user=xtrabackup --password=your_password \
--target-dir=/data/backup/full_compressed \
--compress --compress-threads=4
# LZ4 压缩
xtrabackup --backup \
--user=xtrabackup --password=your_password \
--target-dir=/data/backup/full_compressed \
--compress --compress-algorithm=LZ4 --compress-threads=4
参数说明:
• --compress:启用压缩
• --compress-threads=N:并发压缩线程数,推荐设为 CPU 核心数/2
• --compress-algorithm:压缩算法,默认 zstd
压缩备份在 Prepare 之前需要先解压:
# Step 1: 解压
xtrabackup --decompress --target-dir=/data/backup/full_compressed
# Step 2: 删除 .qp 文件(可选,节省空间)
find /data/backup/full_compressed -name "*.qp" -delete
# Step 3: Prepare
xtrabackup --prepare --target-dir=/data/backup/full_compressed
备份文件可能包含敏感数据(用户信息、财务数据等)。加密可以防止备份文件被未授权访问。
# 生成加密密钥文件
openssl rand -base64 32 > /etc/xtrabackup_key
# 加密备份
xtrabackup --backup \
--user=xtrabackup --password=your_password \
--target-dir=/data/backup/full_encrypted \
--encrypt=AES256 \
--encrypt-key-file=/etc/xtrabackup_key
支持的加密算法:
• AES128:128位密钥,速度快
• AES192:192位密钥,平衡选择
• AES256:256位密钥,安全性最高(推荐)
# Step 1: 解密
xtrabackup --decrypt=AES256 \
--encrypt-key-file=/etc/xtrabackup_key \
--target-dir=/data/backup/full_encrypted
# Step 2: 删除加密文件(可选)
find /data/backup/full_encrypted -name "*.xbcrypt" -delete
# Step 3: Prepare
xtrabackup --prepare --target-dir=/data/backup/full_encrypted
流式备份将备份数据直接输出到标准输出,而不是写入本地目录。这样可以:
• 通过管道传到远程服务器,无需本地存储空间
• 通过 gzip 压缩,减少网络传输量
• 实时传输,边备份边传输
# 流式输出到文件
xtrabackup --backup \
--user=xtrabackup --password=your_password \
--stream=xbstream > /data/backup/full.xbstream
# 流式 + 压缩
xtrabackup --backup \
--user=xtrabackup --password=your_password \
--stream=xbstream | gzip > /data/backup/full.xb.gz
# 流式到远程服务器
xtrabackup --backup \
--user=xtrabackup --password=your_password \
--stream=xbstream | ssh root@remote "cat > /data/backup/full.xbstream"
# Step 1: 从 xbstream 文件提取
xbstream -x < /data/backup/full.xbstream -C /data/backup/extracted
# Step 2: 如果压缩了,先解压
gzip -d < /data/backup/full.xb.gz | xbstream -x -C /data/backup/extracted
# Step 3: Prepare
xtrabackup --prepare --target-dir=/data/backup/extracted
# Step 4: 恢复
xtrabackup --copy-back --target-dir=/data/backup/extracted
生产环境推荐的备份方式是:压缩 + 加密 + 流式,一条命令搞定:
# 生产级备份命令(压缩+加密+流式+限速)
xtrabackup --backup \
--user=xtrabackup --password=your_password \
--stream=xbstream \
--compress --compress-threads=4 \
--encrypt=AES256 --encrypt-key-file=/etc/xtrabackup_key \
--throttle=10 \
| ssh root@backup-server "cat > /data/backup/full_$(date +%Y%m%d).xbstream"
当服务器负载较高时,可以限制备份速度:
# --throttle=N 限制为 N*10 MB/s
# throttle=1 ≈ 10 MB/s(慢速,适合生产高峰)
# throttle=5 ≈ 50 MB/s(中速,适合一般负载)
# throttle=10 ≈ 100 MB/s(快速,适合低负载时段)
xtrabackup --backup \
--user=xtrabackup --password=your_password \
--target-dir=/data/backup/full \
--throttle=5
⚠️ 注意:throttle 太低可能导致 Redo Log 环形缓冲区被覆盖。如果担心这个问题,建议增大 innodb_redo_log_capacity。
有时只需要备份特定的数据库或表:
# 备份指定数据库
xtrabackup --backup \
--user=xtrabackup --password=your_password \
--databases="mydb1 mydb2" \
--target-dir=/data/backup/partial
# 备份指定表(正则匹配)
xtrabackup --backup \
--user=xtrabackup --password=your_password \
--tables="^mydb\.users$" \
--target-dir=/data/backup/partial
这是业界公认的备份最佳实践:
• 3 份数据副本:原始数据 + 本地备份 + 异地备份
• 2 种不同介质:如本地磁盘 + NAS/SAN,或 SSD + 磁带
• 1 份异地存储:防止机房级灾难
| 备份类型 | 频率 | 保留策略 | 适用场景 |
|---|---|---|---|
| 完整备份 | 每日凌晨 | 7天 | 通用场景 |
| 增量备份 | 每小时 | 48小时 | 数据变化频繁 |
| 压缩全量 | 每周日 | 4周 | 长期归档 |
| 恢复演练 | 每月一次 | 永久 | 验证备份可用性 |
• RPO(Recovery Point Objective):你能承受丢失多长时间的数据?
- 每小时增量 → RPO < 1小时
- 每分钟增量 → RPO < 1分钟
• RTO(Recovery Time Objective):恢复需要多长时间?
- 完整备份恢复 → RTO = 数据量/恢复速度
- 增量恢复 → RTO = Full恢复时间 + N个增量合并时间
-- 最小权限集
CREATE USER 'xtrabackup'@'localhost' IDENTIFIED BY 'xxx';
GRANT RELOAD, LOCK TABLES, REPLICATION CLIENT, BACKUP_ADMIN ON *.* TO 'xtrabackup'@'localhost';
-- 如果只需要备份特定数据库
GRANT SELECT, RELOAD, LOCK TABLES, REPLICATION CLIENT, BACKUP_ADMIN ON mydb.* TO 'xtrabackup'@'localhost';
运行 XtraBackup 的系统用户需要:
• 对 MySQL 数据目录的读权限(READ)
• 对 MySQL 数据目录的执行权限(EXECUTE,用于遍历目录)
• 对备份目标目录的写权限(WRITE)
XtraBackup 可以通过配置文件设置默认参数:
# /etc/my.cnf 或 ~/.my.cnf
[xtrabackup]
user = xtrabackup
password = your_password
target_dir = /data/backup/
compress = 1
compress_threads = 4
encrypt = AES256
encrypt_key_file = /etc/xtrabackup_key
注意:配置文件中的参数会被命令行参数覆盖。
以下是 XtraBackup 最常用的命令行选项:
| 选项 | 说明 | 示例 |
|---|---|---|
| --backup | 执行备份操作 | xtrabackup --backup |
| --target-dir | 备份输出目录 | --target-dir=/data/backup |
| --user | MySQL用户名 | --user=xtrabackup |
| --password | MySQL密码 | --password=xxx |
| --host | MySQL主机 | --host=127.0.0.1 |
| --port | MySQL端口 | --port=3306 |
| --incremental | 执行增量备份 | --incremental |
| --incremental-basedir | 增量备份的基准目录 | --incremental-basedir=/data/backup/full |
| --prepare | 准备备份(应用日志) | --prepare |
| --apply-log-only | 只应用日志不回滚 | --apply-log-only |
| --copy-back | 拷贝备份到数据目录 | --copy-back |
| --move-back | 移动备份到数据目录 | --move-back |
| --compress | 启用压缩 | --compress |
| --compress-threads | 压缩线程数 | --compress-threads=4 |
| --compress-algorithm | 压缩算法 | --compress-algorithm=ZSTD |
| --encrypt | 启用加密 | --encrypt=AES256 |
| --encrypt-key-file | 加密密钥文件 | --encrypt-key-file=/path/key |
| --stream | 流式输出格式 | --stream=xbstream |
| --throttle | 限速(N*10MB/s) | --throttle=5 |
| --parallel | 并行拷贝线程数 | --parallel=4 |
原因:用户名密码错误,或用户权限不足。
解决:检查用户名密码,确认用户有 RELOAD、LOCK TABLES、REPLICATION CLIENT 权限。
原因:备份目录路径错误,或者备份不完整。
解决:检查 --target-dir 是否指向正确的备份目录,确认 xtrabackup_checkpoints 文件存在。
原因:增量备份链断裂(比如中间做过完整备份但没有重新开始增量链)。
解决:查看各备份的 xtrabackup_checkpoints,确认 LSN 链条完整。如果断裂,需要从新的完整备份重新开始。
原因:MySQL 数据目录不为空。
解决:先清理数据目录(rm -rf /var/lib/mysql/*),再执行 copy-back。⚠️ 确认已备份!
原因:备份数据量超过可用磁盘空间。
解决:使用 --compress 压缩备份,或使用 --stream 流式传输到远程服务器。
原因:XtraBackup 8.0 不能备份 MySQL 5.7,反之亦然。
解决:确保 XtraBackup 版本与 MySQL 版本匹配。GoldenDB 8.0 用 XtraBackup 8.0。
GoldenDB 自带的 dbtool 已经集成了 XtraBackup,推荐使用:
# 全量备份 mount2 集群的所有 Group
cd /data/zxmanager && export HOME=/data/zxmanager
./bin/dbtool -cm -backup \
-strategy=master \
-clusterid=3 \
-groupid=0 \
-type=full \
-backup-start-binlog=no
# 增量备份 prod 集群的 Group 1
dbtool -cm -backup \
-strategy=slave \
-clusterid=4 \
-groupid=1 \
-type=inrc \
-auto-adjust=no
如果需要对单个 DN 做精细控制,可以直连 DN 使用 XtraBackup:
# SSH 到 DN 所在服务器
ssh root@10.7.16.66
# 备份 DN(端口 5504)
xtrabackup --backup \
--user=xtrabackup --password=xxx \
--host=127.0.0.1 --port=5504 \
--target-dir=/data/backup/dn11_full \
--compress --compress-threads=4
# Prepare
xtrabackup --decompress --target-dir=/data/backup/dn11_full
xtrabackup --prepare --target-dir=/data/backup/dn11_full
以下是一个生产级的自动化备份脚本模板:
#!/bin/bash
# GoldenDB XtraBackup 自动化脚本
set -euo pipefail
BACKUP_BASE=/data/backup
DATE=$(date +%Y%m%d_%H%M%S)
CLUSTER_ID=3
XTRABACKUP=/opt/aio/airflow/tools/mysql/xtrabackup/8.0-linux-x86_64/xtrabackup
# 执行备份
cd /data/zxmanager && export HOME=/data/zxmanager
./bin/dbtool -cm -backup \
-strategy=master -clusterid=$CLUSTER_ID -groupid=0 -type=full \
-backup-start-binlog=no 2>&1 | tee /var/log/xtrabackup_${DATE}.log
# 检查结果
if grep -q "completed OK" /var/log/xtrabackup_${DATE}.log; then
echo "备份成功: $DATE"
else
echo "备份失败: $DATE" | mail -s "GoldenDB备份告警" admin@example.com
fi
# 清理 7 天前的备份
find $BACKUP_BASE -maxdepth 1 -type d -mtime +7 -exec rm -rf {} +
| 文件名 | 说明 | 何时使用 |
|---|---|---|
| xtrabackup_checkpoints | 备份类型、LSN范围 | 查看备份信息、确认增量链 |
| xtrabackup_binlog_info | Binlog文件和位置 | PITR(基于时间点恢复) |
| backup-my.cnf | Prepare时的InnoDB配置 | Prepare阶段自动读取 |
| xtrabackup_logfile | Redo Log数据 | Prepare阶段应用日志 |
| xtrabackup_slave_info | CHANGE MASTER语句 | 搭建从库 |
| xtrabackup_galera_info | Galera/PXC状态信息 | PXC集群备份 |
| *.delta | 增量备份的页面变化 | 增量备份恢复 |
以下脚本包含完整备份、增量备份、Prepare、清理等完整流程:
#!/bin/bash
# ============================================
# XtraBackup 完整备份脚本模板
# 用法: ./backup.sh [full|incremental|prepare|restore]
# ============================================
set -euo pipefail
# === 配置区 ===
MYSQL_USER="xtrabackup"
MYSQL_PASS="your_password"
MYSQL_HOST="127.0.0.1"
MYSQL_PORT="3306"
BACKUP_BASE="/data/backup"
LOG_DIR="/var/log/xtrabackup"
DATE=$(date +%Y%m%d_%H%M%S)
RETENTION_DAYS=7
# === 函数区 ===
do_full_backup() {
local DIR="${BACKUP_BASE}/full_${DATE}"
echo "[$(date)] 开始完整备份 → $DIR"
xtrabackup --backup \
--user=$MYSQL_USER --password=$MYSQL_PASS \
--host=$MYSQL_HOST --port=$MYSQL_PORT \
--target-dir=$DIR \
--compress --compress-threads=4 \
--stream=xbstream 2>> "${LOG_DIR}/backup_${DATE}.log" \
| gzip > "${DIR}.xb.gz"
echo "[$(date)] 完整备份完成"
}
do_incremental_backup() {
local BASE=$(ls -dt ${BACKUP_BASE}/full_* ${BACKUP_BASE}/incr_* 2>/dev/null | head -1)
local DIR="${BACKUP_BASE}/incr_${DATE}"
echo "[$(date)] 开始增量备份 → $DIR (基于 $BASE)"
xtrabackup --backup --incremental \
--user=$MYSQL_USER --password=$MYSQL_PASS \
--host=$MYSQL_HOST --port=$MYSQL_PORT \
--target-dir=$DIR --incremental-basedir=$BASE \
--compress --compress-threads=4 2>> "${LOG_DIR}/backup_${DATE}.log"
echo "[$(date)] 增量备份完成"
}
cleanup_old_backups() {
find $BACKUP_BASE -maxdepth 1 -type d -mtime +$RETENTION_DAYS -exec rm -rf {} +
echo "[$(date)] 已清理 ${RETENTION_DAYS} 天前的备份"
}
# === 主逻辑 ===
case "${1:-full}" in
full) do_full_backup ;;
incremental) do_incremental_backup ;;
cleanup) cleanup_old_backups ;;
*) echo "用法: $0 [full|incremental|cleanup]" ;;
esac