
在这个数据为王的时代,备份做不好,年终奖怕是都要打水漂。
已经看过很多系统的数据备份是使用mysqldump方式进行的,也看到过出现的故障: 例如一个已经超过1T的MySQL数据库业,依旧使用逻辑备份,而且也不加single-transaction,虽然备份在凌晨开始进行,但是由于表比较大,且凌晨也有其他的定时统计任务运行,导致到上班时间备份依旧在运行,数据库负责很大,应用系统响应超时,此时业务部门直接堵在门口“问候”,领导直接站着身后盯着优化处理。
因此,对于数据量比较大的数据库还是采用Percona XtraBackup进行物理备份更佳。本文我们就探讨一下使用Percona XtraBackup进行MySQL8.4的备份(MySQL8.0之后,备份方式已经丰富了很多了,但是还是习惯用Percona XtraBackup来进行),并且附加了详细的原理流程图,也可以供大家参考,尤其准备年后金三银四面试的伙伴们,内容稍微有点长,建议收藏备用。
一、 Percona XtraBackup备份实操案例
1. 工具下载及部署
从percona官网进行下载,对应地址:https://www.percona.com/downloads, 下拉找到ercona XtraBackup,选择对应的版本,操作系统,然后按照自己操作系统的glibc版本选择对应的软件包下载即可。本次我选择的是MySQL8.4版本,如图

下载完成后上传至服务器,解压即可使用
tar -zxvf percona-xtrabackup-8.4.0-2-Linux-x86_64.glibc2.17.tar.gz
# 添加软链接
ln -s percona-xtrabackup-8.4.0-2-Linux-x86_64.glibc2.17 xtrabackup 

完成后进行测试,查看是否有异常,如果出现如下情况,则代表可以正常使用
[root@vbox xtrabackup]# bin/xtrabackup --version
2026-02-03T03:42:32.338476-05:00 0 [Note] [MY-011825] [Xtrabackup] recognized server arguments: --datadir=/var/lib/mysql
bin/xtrabackup version 8.4.0-2 based on MySQL server 8.4.0 Linux (x86_64) (revision id: d4373834)

2. 进行备份
2.1 创建数据库账号并授权
根据官方文档说明(Percona XtraBackup 8.4版本),可以创建如下备份账号,并根据需求进行授权:
-- 创建备份专用用户
CREATE USER 'backup' IDENTIFIED BY 'Backup@2026';
-- 授予核心备份权限
GRANT BACKUP_ADMIN, PROCESS, RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* TO 'backup' ;
-- 授予性能模式表查询权限
GRANT SELECT ON performance_schema.log_status TO 'backup' ;
GRANT SELECT ON performance_schema.keyring_component_status TO 'backup' ;
GRANT SELECT ON performance_schema.replication_group_members TO 'backup' ;
-- 授予备份历史记录功能权限(可选)
GRANT CREATE, ALTER, INSERT, SELECT ON PERCONA_SCHEMA.xtrabackup_history TO 'backup' ;
-- 授予单个表恢复权限(可选)
GRANT CREATE TABLESPACE ON *.* TO 'backup' ;
-- 授予复制环境相关权限(可选)
GRANT REPLICATION_SLAVE_ADMIN ON *.* TO 'backup' ;
-- 刷新权限
FLUSH PRIVILEGES;
2.2 配置备份脚本
生产环境需要定时任务或者调用脚本的方式进行备份,因此,可以编写一个shell脚本进行备份,例如:
生成一个full_backup.sh文件,添加如下内容(按照实际内容进行修改):
#! /bin/bash
IPADDRESS='192.168.56.102'
PORT=3306
BACKUP_USER='backup'
BACKUP_PASSWORD='XXXXXXXX'
BACKUP_DIR='/data/backup'
BACKUP_DATE=$(date +%Y%m%d)
BACKUP_FILE="$BACKUP_DIR/ALL_BACKUP-$PORT-$IPADDRESS-$BACKUP_DATE.tar.gz"
mkdir -p ${BACKUP_DIR}/dbbackup
rm -rf ${BACKUP_DIR}/dbbackup/*
# 执行备份操作
/usr/local/xtrabackup/bin/xtrabackup --defaults-file=/data/mysql/mysql3306/etc/my.cnf --host=${IPADDRESS} --port=${PORT} --backup --user=${BACKUP_USER} --password=${BACKUP_PASSWORD} --parallel=2 --compress --compress-threads=4 --tmpdir=/data/backup --target-dir=${BACKUP_DIR}/dbbackup >> /data/backup/backup.log 2>&1
# 检查备份是否成功
if [ $? -eq 0 ]; then
# 执行打包操作
tar -czvf ${BACKUP_FILE} -C ${BACKUP_DIR}/dbbackup .
echo "备份成功:$(date +%Y-%m-%d_%H:%M:%S)"
rm -rf ${BACKUP_DIR}/dbbackup/*
# 清除历史备份
find $BACKUP_DIR -name "ALL_BACKUP-$PORT-*.tar.gz" -mtime +15 -exec rm -f {} \;
else
echo "备份失败:$(date +%Y-%m-%d_%H:%M:%S)"
rm -rf ${BACKUP_DIR}/dbbackup/*
fi执行脚本即可手动完成一次全量备份
sh full_backup.sh 
完整的执行日志在backup.log中可以查看,里面记录了详细的过程。
二、 XtraBackup备份流程拆解
下面我们结合日志及官方文档的内容,拆解一下 XtraBackup的备份流程。
1. 初始化和环境检测(21:01:08)
2026-02-03T21:01:08.799283-05:00 0 [Note] recognized server arguments: --server-id=1186 --datadir=/data/mysql/mysql3306/data...
2026-02-03T21:01:08.799640-05:00 0 [Note] recognized client arguments: --port=3306 --socket=/data/mysql/mysql3306/tmp/mysql.sock...
关键信息:
2. 连接和认证(21:01:08-21:01:09)
2026-02-03T21:01:08.915926-05:00 0 [Note] Connecting to MySQL server host: 192.168.56.102, user: backup, password: set, port: 3306
2026-02-03T21:01:09.079466-05:00 0 [Note] Using server version 8.4.7
流程解析:
3. 获取备份锁(21:01:09)
2026-02-03T21:01:09.139168-05:00 0 [Note] Executing LOCK INSTANCE FOR BACKUP ...技术要点:
4. InnoDB数据文件备份(21:01:09-21:01:12)
4.1 环境初始化
2026-02-03T21:01:09.150466-05:00 0 [Note] cd to /data/mysql/mysql3306/data
2026-02-03T21:01:09.164906-05:00 0 [Note] using the following InnoDB configuration:配置信息:
4.2 并行备份innodb表的数据文件传输
2026-02-03T21:01:10.958157-05:00 0 [Note] Starting 2 threads for parallel data files transfer
2026-02-03T21:01:10.973093-05:00 2 [Note] Compressing ./ibdata1 to /data/backup/dbbackup/ibdata1.zst
备份的文件包括:
技术特点:
5. 备份非InnoDB表备份(21:01:13)
2026-02-03T21:01:12.994963-05:00 0 [Note] Starting to backup non-InnoDB tables and files
备份的非InnoDB文件类型:
备份模式:
6. 二进制日志处理(21:01:13)
2026-02-03T21:01:13.510976-05:00 0 [Note] Executing FLUSH NO_WRITE_TO_BINLOG BINARY LOGS
2026-02-03T21:01:13.544013-05:00 0 [Note] Selecting LSN and binary log position from p_s.log_status
关键操作:
7. 完成和清理(21:01:13-21:01:15)
7.1 释放锁和统计
2026-02-03T21:01:14.593663-05:00 0 [Note] Executing UNLOCK INSTANCE
2026-02-03T21:01:14.594139-05:00 0 [Note] Total time Server is locked by LOCK INSTANCE FOR BACKUP is: 5.455 seconds
重要指标:
7.2 备份元数据生成
2026-02-03T21:01:14.598173-05:00 0 [Note] MySQL binlog position: filename 'mysql-bin.000019', position '198', GTID of the last change '801dab9b-f13d-11f0-bfbb-080027fd316d:1-16393'
生成的元数据文件:
7.3 备份完成确认
如无异常,则会出现备份完成的信号
2026-02-03T21:01:15.886071-05:00 0 [Note] completed OK!
8. XtraBackup的核心工作流程总结
从上面的过程可以看出,XtraBackup的巧妙之处在于它利用了InnoDB引擎自身的崩溃恢复机制。想象一下,这就像给高速行驶的汽车拍照,然后通过分析行车记录仪(redo log)来还原拍照瞬间的完整状态。下面我们根据上面的步骤及官网中补充的其他细节内容,绘制了一个较为全面的流程图,如下(如想获得高清版可联系我获取)

温馨提示: 本文所述流程基于Percona XtraBackup 8.4版本。不同版本存在细微差异,建议在生产环境部署前进行充分测试。
三、 结语
Percona XtraBackup之所以成为MySQL备份的事实标准,源于其巧妙的设计:
对于任何运行MySQL的生产环境,掌握XtraBackup都是必备技能。它不仅能解决备份时的业务中断问题,还能在灾难恢复时快速拉起服务,真正实现“备份不扰业务,恢复快人一步”。
你是否在MySQL运维中遇到过其他有趣的问题?欢迎在留言区分享你的经历和解决方案!
关注微信公众号「数据库干货铺」,获取更多数据库运维干货。