一、什么是 Percona XtraBackup?

在数据库运维工作中,备份恢复是保障数据安全的底线。Percona XtraBackup 是 Percona 公司开源的 MySQL 物理热备份工具,也是全球唯一免费开源的 MySQL 热备解决方案。相比于传统的 mysqldump 逻辑备份,XtraBackup 的核心优势在于:

  • 热备无锁:备份过程不打断正在执行的事务,无需锁表,对业务影响极小;
  • 速度快:物理备份直接拷贝数据文件,恢复时也无需逐条执行 SQL,效率远高于逻辑备份;
  • 存储优化:支持压缩和增量备份,大幅节省磁盘空间和网络带宽。

二、不同 MySQL 版本如何选择对应的 XtraBackup 版本?

这是 XtraBackup 使用中最重要的一点。由于 MySQL 8.0 在数据字典、重做日志(redo log)和撤销日志(undo log)格式上与 5.7 及之前的版本发生了根本性变化,不同版本的 XtraBackup 并不互相兼容。

版本选择对照表:

MySQL 版本推荐 XtraBackup 版本最低版本要求
MySQL 5.6 / 5.7XtraBackup 2.4.x2.4.9 及以上
MySQL 8.0.xXtraBackup 8.0.x8.0.22-15 及以上
MySQL 8.1 / 8.4XtraBackup 8.1 / 8.4对应主版本号

⚠️ 重要提醒:

  • 不要跨版本混用:XtraBackup 2.4 无法备份 MySQL 8.0 的数据库,XtraBackup 8.0 也无法备份 MySQL 5.7。
  • 版本需匹配或高于 MySQL:若 MySQL 为 8.0.28,建议使用 XtraBackup 8.0.27-19 或更高版本,而非更低版本。
  • MySQL 8.0.20 后的特别提醒:XtraBackup 8.0.11 及更低版本与 MySQL 8.0.20 及以上版本不兼容,请务必升级 XtraBackup。

三、在线安装 XtraBackup(含依赖说明)

XtraBackup 依赖 libev 组件,安装前需确保此依赖已就位。使用包管理器安装时,系统会自动解决大部分依赖关系,无需手动逐一处理。

3.1 通过 YUM 安装(CentOS / RHEL / Rocky Linux)

# 步骤1:安装 Percona 官方 YUM 仓库
yum install -y https://repo.percona.com/yum/percona-release-latest.noarch.rpm

# 步骤2:根据 MySQL 版本安装对应包
# MySQL 5.6 / 5.7 环境
yum install -y percona-xtrabackup-24

# MySQL 8.0 环境
yum install -y percona-xtrabackup-80

# 步骤3:验证安装
xtrabackup --version

3.2 通过 APT 安装(Debian / Ubuntu)

# 步骤1:安装 Percona 仓库
wget https://repo.percona.com/apt/percona-release_latest.$(lsb_release -sc)_all.deb
dpkg -i percona-release_latest.$(lsb_release -sc)_all.deb
apt-get update

# 步骤2:根据 MySQL 版本安装对应包
# MySQL 5.7 环境
apt-get install -y percona-xtrabackup-24

# MySQL 8.0 环境
apt-get install -y percona-xtrabackup-80

# 步骤3:验证安装
xtrabackup --version

3.3 二进制包快速部署(推荐离线场景,详见第十章)

四、备份前的准备工作

4.1 数据库用户权限

XtraBackup 需要具备特定权限才能正常执行备份操作:

-- 创建专用备份用户(建议)
CREATE USER 'backup_user'@'localhost' IDENTIFIED BY 'secure_password';

-- 授予备份所需权限
GRANT RELOAD, LOCK TABLES, PROCESS, REPLICATION CLIENT, CREATE TABLESPACE, SUPER ON *.* TO 'backup_user'@'localhost';
FLUSH PRIVILEGES;

4.2 密码安全建议

避免在命令行直接输入密码(会在进程列表中暴露)。推荐使用配置文件方式:

# 创建 ~/.my.cnf
cat > ~/.my.cnf << EOF
[client]
user=backup_user
password=secure_password
EOF

chmod 600 ~/.my.cnf

之后执行 XtraBackup 命令时可省略 --user--password 参数。

五、全量备份

全量备份是备份体系的基础,记录了数据库在某一时刻的完整状态。执行全量备份的命令非常简单:

xtrabackup --backup --target-dir=/backup/mysql/full_$(date +%Y%m%d_%H%M%S)

实际生产环境示例:

#!/bin/bash
BACKUP_DIR="/backup/mysql/full"
TODAY=$(date +%Y%m%d)
FULL_BACKUP_PATH="${BACKUP_DIR}/${TODAY}"

mkdir -p "${FULL_BACKUP_PATH}"

if xtrabackup --backup \
    --target-dir="${FULL_BACKUP_PATH}" \
    --datadir=/var/lib/mysql; then
    echo "全量备份成功完成于 $(date)" >> /var/log/xtrabackup.log
else
    echo "全量备份失败于 $(date)" >> /var/log/xtrabackup.log
    exit 1
fi

可通过 crontab 设置每天凌晨执行全量备份:

0 2 * * * /usr/local/bin/full_backup.sh

六、增量备份

增量备份仅记录自上次备份以来的数据变化,可大幅减少备份时间和存储空间。XtraBackup 支持多级增量备份链,即每次增量可基于前一次增量进行。

6.1 执行增量备份

# 基于全量备份的第一次增量
xtrabackup --backup \
    --target-dir=/backup/mysql/inc_$(date +%Y%m%d_%H%M%S) \
    --incremental-basedir=/backup/mysql/full/20250101

# 基于前一次增量的第二次增量
xtrabackup --backup \
    --target-dir=/backup/mysql/inc2_$(date +%Y%m%d_%H%M%S) \
    --incremental-basedir=/backup/mysql/inc_20250102_020000

6.2 增量备份脚本示例

#!/bin/bash
# 全量备份目录
FULL_BACKUP_DIR="/backup/mysql/full"
# 增量备份目录
INCR_BACKUP_DIR="/backup/mysql/incr"
# 获取最近一次备份的 LSN 信息
LAST_BACKUP_DIR=$(ls -td ${FULL_BACKUP_DIR}/* ${INCR_BACKUP_DIR}/* 2>/dev/null | head -1)

if [ -z "$LAST_BACKUP_DIR" ]; then
    echo "错误:未找到任何全量或增量备份作为基础!请先执行全量备份。"
    exit 1
fi

INCR_NAME="incr_$(date +%Y%m%d_%H%M%S)"
INCR_PATH="${INCR_BACKUP_DIR}/${INCR_NAME}"

mkdir -p "${INCR_PATH}"

xtrabackup --backup \
    --target-dir="${INCR_PATH}" \
    --incremental-basedir="${LAST_BACKUP_DIR}"

if [ $? -eq 0 ]; then
    echo "增量备份成功:${INCR_PATH}" >> /var/log/xtrabackup_incr.log
else
    echo "增量备份失败" >> /var/log/xtrabackup_incr.log
    exit 1
fi

七、数据恢复步骤

XtraBackup 的恢复分为两大阶段:Prepare(准备)Restore(还原)

7.1 全量备份恢复

全量备份的恢复流程最为标准:

# 步骤1:停止 MySQL 服务
systemctl stop mysqld

# 步骤2:清空数据目录(务必备份原数据!)
mkdir -p /backup/mysql/old_data
mv /var/lib/mysql/* /backup/mysql/old_data/

# 步骤3:准备备份(应用 redo log,使数据一致)
xtrabackup --prepare --target-dir=/backup/mysql/full/20250101

# 步骤4:还原数据
xtrabackup --copy-back --target-dir=/backup/mysql/full/20250101

# 步骤5:修正目录权限
chown -R mysql:mysql /var/lib/mysql

# 步骤6:启动 MySQL
systemctl start mysqld

--prepare 步骤的核心作用是:将备份期间的事务日志(redo log)应用到数据文件中,并回滚未提交的事务,最终得到一个事务一致的数据副本。

7.2 增量备份恢复

增量备份的恢复比全量备份稍复杂,需要按备份链顺序依次应用。关键点在于:应用除最后一个增量外的所有增量时,必须添加 --apply-log-only 参数,以防止提前回滚未提交的事务,否则后续增量将无法继续应用。

假设备份链为:全量备份 -> 增量1 -> 增量2

# 步骤1:准备全量备份(跳过回滚阶段)
xtrabackup --prepare --apply-log-only --target-dir=/backup/mysql/full/20250101

# 步骤2:应用第一个增量(仍跳过回滚)
xtrabackup --prepare --apply-log-only \
    --target-dir=/backup/mysql/full/20250101 \
    --incremental-dir=/backup/mysql/incr/inc1

# 步骤3:应用最后一个增量(允许回滚,不加 --apply-log-only)
xtrabackup --prepare \
    --target-dir=/backup/mysql/full/20250101 \
    --incremental-dir=/backup/mysql/incr/inc2

# 步骤4:停止 MySQL 并清空数据目录
systemctl stop mysqld
rm -rf /var/lib/mysql/*

# 步骤5:还原数据
xtrabackup --copy-back --target-dir=/backup/mysql/full/20250101

# 步骤6:修正权限并启动
chown -R mysql:mysql /var/lib/mysql
systemctl start mysqld

⚠️ 注意事项:

  • 备份目录在还原前必须为空,否则 --copy-back 会失败。
  • 若备份文件体积庞大,可在 --prepare 阶段使用 --parallel=N 参数启用并发处理,显著缩短准备时间。

八、常见问题与解决方法

8.1 备份失败:权限不足(Access Denied)

原因:XtraBackup 用户权限不足,或密码配置不正确。表现为日志中出现“Access denied”错误。

解决方法:确认用户已具备 RELOAD、LOCK TABLES、PROCESS 等权限。若使用 ~/.my.cnf 文件,需确保文件权限为 600。

8.2 备份失败:Too many open files

原因:数据库文件数量过多,超过操作系统对单个进程的文件句柄限制。常见于含有大量分表的业务系统。

解决方法

# 临时提高当前会话的文件句柄限制
ulimit -n 65535

# 永久修改:编辑 /etc/security/limits.conf,添加
mysql soft nofile 65535
mysql hard nofile 65535

8.3 备份失败:No space left on device

原因:目标备份目录磁盘空间不足。这是最频繁出现的备份失败原因。

解决方法:使用 df -h 检查磁盘空间;清理旧的备份文件;考虑启用压缩备份(--compress 选项)以节省空间。

8.4 恢复失败:无法连接到 MySQL

原因:恢复后未正确修正数据目录权限,或 my.cnf 中的 socket 路径与实际不符。

解决方法

chown -R mysql:mysql /var/lib/mysql
# 检查 my.cnf 中的 datadir 和 socket 配置是否与当前环境一致

8.5 备份文件损坏或缺失 xtrabackup_checkpoints

原因:备份过程被中断或备份文件不完整,缺少关键的检查点文件,导致备份无法用于恢复。

解决方法:检查备份目录中是否存在 xtrabackup_checkpoints 文件。如缺失,该备份无效,需使用其他有效备份或重新执行备份。

九、最佳实践建议

  1. 定期验证备份:仅备份而不验证等于没有备份。建议每月至少执行一次恢复演练,在测试环境中验证备份的可恢复性。
  2. 备份保留策略:全量备份至少保留最近 2-3 份,增量备份保留最近 3-7 天的数据,配合定期全量备份使用。
  3. 加密传输:生产环境中建议启用压缩(--compress)和加密(xbcrypt)功能,备份文件通过 xbstreamtar 流式传输到远程存储。
  4. 监控与告警:将 XtraBackup 执行日志接入监控系统,当备份失败时及时发出告警。
  5. 版本对齐:每次升级 MySQL 版本前,务必确认 XtraBackup 版本与新 MySQL 版本兼容,并提前在测试环境验证。

十、离线环境安装 XtraBackup(附完整依赖清单)

对于生产环境或内网服务器,在线安装并非总是可行。本部分专门解决离线环境下的安装问题,涵盖不同操作系统、不同 XtraBackup 版本所需的完整依赖清单及安装步骤。

10.1 核心依赖概览

离线安装的难点在于:XtraBackup 的 RPM/DEB 包仅包含自身文件,运行时依赖的底层库需要额外下载和安装。

不同操作系统和 XtraBackup 版本的依赖项略有差异,下表为速查参考:

操作系统XtraBackup 版本核心依赖包
CentOS / RHEL 72.4.xlibev, perl, perl-DBD-MySQL, perl-Digest-MD5, libaio, libaio-devel, perl-Time-HiRes, numactl-libs, openssl
CentOS / RHEL 78.0.xlibev, libgcrypt, libaio, numactl-libs, openssl, procps-ng
CentOS / RHEL 8/98.0.xlibev, libgcrypt, libaio, numactl-libs, openssl, procps-ng, libcurl
Ubuntu / Debian2.4.xlibev4, libcurl4-openssl-dev, libdbd-mysql-perl, libaio1, perl, libnuma1
Ubuntu / Debian8.0.xlibev4, libgcrypt20, libaio1, libnuma1, libcurl4, libssl1.1

10.2 方法一:RPM 包离线安装(适用于 CentOS / RHEL / Rocky Linux)

此方法的思路是:在有网络的相同操作系统环境中下载所有需要的 RPM 包,然后打包传输到目标服务器进行安装。

10.2.1 依赖包完整清单及下载方法

准备一个有网络连接的、与目标服务器操作系统版本完全相同的环境。

Step 1:下载 XtraBackup 主程序包

访问 Percona 官方下载页面,导航到对应版本,下载适合你操作系统的 RPM 包。以 CentOS 7 + XtraBackup 2.4 为例:

wget https://downloads.percona.com/downloads/Percona-XtraBackup-2.4/Percona-XtraBackup-2.4.28/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.28-1.el7.x86_64.rpm

Step 2:使用 yumdownloader 下载所有依赖包

# 安装 yum-utils(获取 yumdownloader 工具)
yum install -y yum-utils

# 创建一个目录存放所有离线包
mkdir -p /tmp/xtrabackup-offline-packages
cd /tmp/xtrabackup-offline-packages

# 方案A:下载指定 RPM 包及其所有依赖(推荐)
yumdownloader --resolve --destdir=. percona-xtrabackup-24

# 方案B:如果服务器中有其他 RPM 包,也可指定具体文件名
yumdownloader --resolve --destdir=. percona-xtrabackup-24-2.4.28-1.el7.x86_64.rpm

执行后,yumdownloader 会自动解析依赖关系并下载全部所需的 RPM 包,通常包括:

  • percona-xtrabackup-24-*.rpm(主程序)
  • libev-*.rpm(事件循环库,CentOS 7 中 XtraBackup 8.0 必须预装)
  • perl-*.rpmperl-DBD-MySQL-*.rpm(Perl 相关依赖)
  • libaio-*.rpmlibaio-devel-*.rpm(异步 I/O 库)
  • numactl-libs-*.rpm(NUMA 支持库)
  • openssl-*.rpm(加密库)
  • 其他传递依赖

Step 3:将下载好的所有 RPM 包打包并传输到目标服务器

tar -czf xtrabackup-offline-bundle.tar.gz /tmp/xtrabackup-offline-packages/
# 使用 scp、U 盘或其他方式将 tar.gz 包传输到目标服务器

Step 4:在目标服务器上执行离线安装

# 解压离线包
tar -xzf xtrabackup-offline-bundle.tar.gz -C /tmp/

# 进入目录
cd /tmp/xtrabackup-offline-packages

# 方案A:使用 rpm 命令逐个安装(需手动处理依赖顺序)
rpm -ivh libev-*.rpm
rpm -ivh perl-*.rpm
rpm -ivh percona-xtrabackup-24-*.rpm

# 方案B:使用 yum localinstall 自动处理依赖顺序(推荐)
yum localinstall -y *.rpm

# 方案C:如遇依赖冲突,可跳过破损依赖
yum localinstall -y --skip-broken *.rpm

Step 5:验证安装

xtrabackup --version

10.2.2 常见 RPM 依赖问题及解决方法

问题1:提示 libev.so.4()(64bit) is needed by percona-xtrabackup-80

  • 原因:CentOS 7 及更早版本中,libev 默认未安装,需要从 EPEL 仓库获取。
  • 解决方法:下载 libev RPM 包并优先安装:

    wget https://dl.fedoraproject.org/pub/epel/7/x86_64/Packages/l/libev-4.15-7.el7.x86_64.rpm
    rpm -ivh libev-4.15-7.el7.x86_64.rpm

问题2:提示 libssl.so.10: cannot open shared object file

  • 原因:OpenSSL 库版本不匹配或缺失。
  • 解决方法:安装对应版本的 openssl 包,或创建符号链接:

    ln -s /usr/lib64/libssl.so.1.0.2k /usr/lib64/libssl.so.10

    推荐优先安装缺失的 RPM 包。

10.3 方法二:DEB 包离线安装(适用于 Ubuntu / Debian)

10.3.1 依赖包完整清单及下载方法

准备一个有网络连接的、与目标服务器操作系统版本完全相同的环境。

Step 1:下载 XtraBackup DEB 包

访问 Percona 官方下载页面,选择对应操作系统版本的 DEB 包。以 Ubuntu 20.04 + XtraBackup 8.0 为例:

wget https://downloads.percona.com/downloads/Percona-XtraBackup-8.0/Percona-XtraBackup-8.0.34-29/binary/debian/focal/x86_64/percona-xtrabackup-80_8.0.34-29-1.focal_amd64.deb

Step 2:使用 apt-get 下载所有依赖包

# 创建一个目录存放所有离线包
mkdir -p /tmp/xtrabackup-offline-debs
cd /tmp/xtrabackup-offline-debs

# 仅下载依赖包(不安装)
apt-get download $(apt-cache depends percona-xtrabackup-80 | grep -E 'Depends|PreDepends' | awk '{print $2}' | tr '\n' ' ')

# 也可以直接下载指定包及其依赖(需要 apt-offline 或 apt-rdepends)
apt-get install --download-only -o Dir::Cache::Archives=/tmp/xtrabackup-offline-debs percona-xtrabackup-80

XtraBackup 2.4 在 Ubuntu/Debian 下的依赖通常包括 libev4libcurl4-openssl-devlibdbd-mysql-perl 等。XtraBackup 8.0 的依赖则包括 libev4libgcrypt20libaio1 等。

Step 3:打包并传输到目标服务器

tar -czf xtrabackup-offline-bundle-deb.tar.gz /tmp/xtrabackup-offline-debs/

Step 4:在目标服务器上执行离线安装

# 解压离线包
tar -xzf xtrabackup-offline-bundle-deb.tar.gz -C /tmp/

# 进入目录
cd /tmp/xtrabackup-offline-debs

# 使用 dpkg 安装所有 deb 包
dpkg -i *.deb

# 如果提示依赖缺失,尝试自动修复(前提是离线包中包含所有依赖)
apt-get install -f -y

# 或直接使用 dpkg 强制安装
dpkg -i --force-depends *.deb

Step 5:验证安装

xtrabackup --version

10.4 方法三:二进制 Tarball 包安装(最简方案,推荐)

对于追求极简部署或希望避免依赖困扰的场景,使用官方提供的预编译二进制包(Binary Tarball)是最直接的方式。

二进制包已包含编译好的可执行文件及部分依赖库,解压后即可使用,对系统依赖的要求远低于 RPM/DEB 包。

10.4.1 下载与安装步骤

Step 1:下载对应版本的二进制 Tarball

访问 Percona XtraBackup 下载页面,选择 "Linux - Generic" 标签页下的 Tarball。

  • XtraBackup 2.4:选择 Percona-XtraBackup-2.4.28-Linux-x86_64.glibc2.17.tar.gz
  • XtraBackup 8.0:选择 Percona-XtraBackup-8.0.34-29-Linux-x86_64.glibc2.17.tar.gz

Step 2:上传并解压

# 上传 tar.gz 包到目标服务器
# 解压到 /usr/local 目录
tar -xzf Percona-XtraBackup-8.0.34-29-Linux-x86_64.glibc2.17.tar.gz -C /usr/local/

# 重命名以简化路径
mv /usr/local/percona-xtrabackup-8.0.34-29-Linux-x86_64.glibc2.17 /usr/local/xtrabackup

Step 3:配置环境变量

# 创建软链接(推荐)
ln -sf /usr/local/xtrabackup/bin/* /usr/local/bin/

# 或添加到 PATH 环境变量
echo 'export PATH=/usr/local/xtrabackup/bin:$PATH' >> /etc/profile
source /etc/profile

Step 4:验证安装

xtrabackup --version

Step 5:(可选)安装 qpress 工具

如果备份文件使用压缩格式,需要 qpress 来解压:

# 下载 qpress 二进制包
wget http://www.quicklz.com/qpress-11-linux-x64.tar
tar -xvf qpress-11-linux-x64.tar
cp qpress /usr/local/bin/
chmod +x /usr/local/bin/qpress

二进制 Tarball 方案的优势在于:

  • 依赖极少:仅需系统提供 glibc 2.17 及以上版本,主流 Linux 发行版均满足。
  • 开箱即用:解压后即可执行,无需处理复杂的依赖安装。
  • 版本纯净:不会污染系统包管理器的数据库。

10.5 离线安装常用技巧

  1. 优先尝试二进制 Tarball:如无特殊原因,离线环境下推荐使用二进制包方案,可绕过绝大部分依赖问题。
  2. 利用 Docker 镜像下载依赖:如果无法直接获取依赖列表,可在有网络的服务器上用 Docker 拉取相同操作系统镜像,在容器中执行 yumdownloaderapt-get download,将依赖包从容器中拷贝出来。
  3. 版本完全对齐:下载依赖包时,务必使用与目标服务器相同的操作系统版本(如 CentOS 7.9、Ubuntu 20.04),不同小版本间的包可能存在兼容性问题。
  4. 保留一份完整的离线仓库:建议将常用版本的 XtraBackup 及其所有依赖打包保存到公司内部的软件仓库或 NAS 中,供后续服务器统一使用,避免重复下载。
  5. 编译安装(最后手段):如果二进制包也无法运行,可考虑从源码编译安装。编译依赖包括 GCC 5.3 及以上、CMake 3 及以上、OpenSSL 开发库、Boost 库等。此方案复杂度较高,仅推荐在确实没有其他选择时使用。

Percona XtraBackup 作为 MySQL 生态中成熟稳定的物理备份工具,在生产环境中被广泛验证和使用。掌握全量备份与增量备份的原理和操作方法,搭配合理的备份策略和恢复演练,才能确保在真正的灾难面前从容应对。建议读者在实际部署前,先在测试环境中完整演练一遍从备份到恢复的全流程,做到心中有数。

最后修改:2026 年 04 月 10 日
如果觉得我的文章对你有用,请随意赞赏