前言
Percona XtraBackup 是一款开源的 MySQL物理热备份工具。请根据你的 MySQL 版本选择对应的 XtraBackup 版本,它可以来对整个数据库节点(所有库)来进行备份,恢复,备份时可以进行压缩。
注:这里是以 mysql8.0来进行操作
使用建议
- 在安装过程中,如果遇到依赖问题,可以尝试运行
sudo apt --fix-broken install来修复 - Toolkit 常用于分析慢日志(
pt-query-digest)或在线修改表结构(pt-online-schema-change)。 - XtraBackup 常用于生产环境的物理热备份,因为它在备份时不会锁表。
一、安装基础组件
1、添加percona官方源
首先下载并安装 percona的仓库配置包
bash
wget https://repo.percona.com/apt/percona-release_latest.$(lsb_release -sc)_all.deb
sudo dpkg -i percona-release_latest.$(lsb_release -sc)_all.deb
不然会报错"E: Unable to locate package percona-xtrabackup-80"
2、更新软件包列表
bash
sudo apt update
3、安装 Percona Tookit
执行以下命令进行安装
bash
sudo apt install percona-toolkit
4、验证安装结果
查看索引工具的版本(分析MySQL 查询日志并识别未被使用的索引)
bash
sudo pt-index-usage --version
二、安装XtraBackup
可以根据不同mysql版本来进行安装
- MySQL 8.0 对应 Percona XtraBackup 8.0 (
percona-xtrabackup-80) - MySQL 5.7 对应 Percona XtraBackup 2.4 (
percona-xtrabackup-24)
以下步骤以安装 XtraBackup 8.0 为例:
1、配置仓库
bash
sudo percona-release enable-only tools release
2、安装XtraBackup
bash
sudo apt install percona-xtrabackup-80
如果需要安装 2.4 版本,只需将命令中的 percona-xtrabackup-80 替换为 percona-xtrabackup-24 即可。
3、验证安装
如果输出信息中包含 8.0,说明安装正确
bash
sudo xtrabackup --version
三、恢复数据
1、先停止 mysql 服务
在恢复数据之前,必须停止数据库服务,否则会导致文件冲突或数据损坏
bash
sudo systemctl stop mysqld
2、备份/清空原数据目录
为了防止误操作,将现有的数据目录重命名(作为备份),然后再新建和原来同名的空目录
具体的 datadir目录在/etc/my.cnf 中可以看到,以宝塔为例,数据库目录在/www/server/data
bash
# 1、重命名旧数据目录
sudo mv /www/server/data /www/server/data_back_$(date +%F)
# 2、创建新的空目录
sudo mkdir -p /www/server/data
3、解压数据
3.1 如果是.tar 或 .tar.gz
bash
# 如果是tar.gz
sudo tar -zxvf backup.tar.gz -C /root/data-backup
# 如果是纯tar
sudo tar -xvf backup.tar -C /root/data-backup
3.2 如果是.xbstream 文件
bash
# 需要安装 xbstream 工具 (通常随 xtrabackup 安装),并启用4个线程来解压
sudo xbstream -x --parallel=4 -C /root/data-backup < backup.xbstream
3.3 v cdfgbv 如果解压出来都是带有.qp(qpress)压缩文件
需要再一次解压才行
XtraBackup 的 --compress 选项通常生成 .qp 文件。你需要先解压它们:
- 推荐使用
bash
# 推荐使用 xtrabackup 自带的解压功能,并启用 4 个线程来解压
sudo xtrabackup --decompress --parallel=4 --target-dir=/root/data-backup/
- --decompress,表示解压缩.qp文件自带的
- --parallel=4,启用 4 个线程并行处理,文件多的时候,可以启用这个,可以加快速度
- qpress
在服务器上没有的,需要安装
bash
# 解压所有 .qp 文件
sudo for i in *.qp; do qpress -d $i $(dirname $i); done
4、检查文件是否正常
检查方法
bash
sudo cat /root/data-backup/xtrabackup_info
- 如果
cat命令输出为空,或者显示乱码,说明备份文件已损坏(可能是磁盘满了、传输中断或备份时被意外终止)。 - 解决方法:这种情况下无法修复,必须重新执行备份。
5、权限问题
有时候文件属性可能会被锁定,确保文件可读
bash
sudo chmod 644 /root/data-backup/xtrabackup_info
6、执行恢复(核心)
重要,必须要执行的:
xtrabackup --prepare 的作用表示准备数据,将备份数据恢复到一个一致的、可恢复的状态,相当于对备份执行一次"崩溃恢复"(crash recovery),使其能够安全地用于启动 MySQL 服务
bash
sudo xtrabackup --prepare --target-dir=/root/data-backup
看到 "completed OK" 才算成功。
最后执行恢复:
bash
# 恢复数据
sudo xtrabackup --defaults-file=/etc/my.cnf --copy-back --target-dir=/root/data-backup/
注:这里恢复的是全量数据
6.1、恢复增量备份
**注:**合并增量数据时,需要按顺序进行合并。存在多个日期的目录,则需要将全量备份作为基础,再按日期从小到大合并进来
1、准备基础全量备份(注意 --apply-log-only 参数)
bash
xtrabackup --prepare --apply-log-only --target-dir=/root/data-backup
2、合并第一次增量备份数据
bash
xtrabackup --prepare --apply-log-only \
--target-dir=/root/data-backup \
--incremental-dir=/root/data-backup_inc2026-05-09
--incremental-dir依次往下推。批次合并。
7、修复权限+启动 mysql
bash
sudo chown -R mysql:mysql /www/server/data
sudo chmod -R 750 /www/server/data
# 启动mysql
sudo systemctl start mysqld
四、备份数据
1、创建mysql的专用备份账号
为了系统安全,强烈建议不要直接使用mysql的root账号进行备份。创建一个权限最小化的专用备份账号
这样做的好处:
- 遵循最小权限原则:避免因备份脚本或操作失误导致的数据风险。
- 便于审计:可以清晰地追踪和监控所有备份相关的操作。
创建:
bash
# 1. 创建名为 'backup_user' 的用户,并设置一个强密码
CREATE USER 'backup_user'@'localhost' IDENTIFIED BY '密码';
# 2. 授予备份所需的核心权限
GRANT BACKUP_ADMIN, PROCESS, RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* TO 'backup_user'@'localhost';
# 3. 授予查询 performance_schema 的权限,用于获取状态信息
GRANT SELECT ON performance_schema.* TO 'backup_user'@'localhost';
# 4. 刷新权限使其生效
FLUSH PRIVILEGES;
- 权限说明:
| 权限 (Privilege) | 用途说明 |
|---|---|
| RELOAD | 执行 FLUSH 操作,确保数据一致性。 |
| LOCK TABLES | 锁定非 InnoDB 引擎的表(如 MyISAM),保证备份期间数据不变。 |
| PROCESS | 查看当前运行的线程,用于监控备份进程。 |
| REPLICATION CLIENT | 获取二进制日志(Binlog)的位置信息,对增量备份和主从复制至关重要。 |
| BACKUP_ADMIN | MySQL 8.0+ 必需,用于执行实例级别的备份锁定。 |
2、执行全量备份
对于第一次备份,就做一个全量备份。以下命令使用 backup_user 用户进行备份,并将备份文件存放在指定目录。
bash
xtrabackup \
--user=backup_user \
--password='密码' \
--host=localhost \
--compress \
--parallel=4 \
--backup \
--target-dir=/data/backups/mysql/full_$(date +%F)
注:/data/backup/mysql目录需要先创建好,不然就会报错。它不会自动创建
--user:必填,备份账号--password:必填,密码,--host就是指定哪个mysql实例节点--backup: 必填参数,不仅仅是来备份,还是来监控 innodb的redo log--compress: 可选,压缩备份文件,节省磁盘空间。--parallel=4: 可选,使用4个线程并行备份,提升速度。--incremental-basedir:可选,用来做增量备份的锚点,它决定了你的新备份是相对于哪个时间点开始记录变化的,不加表示全量备份。(第一次备份)通常都不带这个参数,而从第二次开始的备份命令才会带上它。--no-timestamp:可选,工具会直接把备份文件存放在你指定的路径下,不再创建时间戳子目录,方便脚本化管理。mysql8.0中已经去掉了,不需要再使用了。
3、执行增量备份
增量备份是基于上一次的备份目录来的,在--incremental-basedir参数中设置上一次备份目录
bash
xtrabackup \
--user=backup_user \
--password='密码' \
--host=localhost \
--compress \
--parallel=4 \
--backup \
--target-dir=/data/backups/mysql/inc_$(date +%F) \
--incremental-basedir=/data/backups/mysql/full_2026-05-08
--incremental-basedir:必填,指向上一次的增量备份目录--target-dir:必填,这个时候名字也要改成相应的增量目录
执行成功后是这样子的:

结语
percona相关的工具非常强大,值得系统学习下的