MySQL备份实战:从小白到熟练使用Percona XtraBackup
前言
数据库里存放着公司的核心资产------数据。作为一名开发或运维人员,掌握数据库备份是必备的生存技能。一旦发生误删、硬件故障甚至勒索病毒,一份可靠的备份就是最后的救命稻草。本篇文章将从零开始,用最通俗的语言带你搞懂 MySQL 备份的基本概念,并手把手教你使用业界流行的物理备份工具 Percona XtraBackup 完成全量、增量、差异以及压缩备份。
一、数据库备份简介
简单说,备份就是把数据库在某一时刻的状态"拍照"保存下来,以便未来出现问题时可以恢复到该状态。
1.1 为什么需要备份?
-
硬件故障:磁盘损坏,服务器宕机。
-
人为误操作 :手滑
DROP了一张表或删错了数据。 -
自然灾害或灾难:机房断电、火灾等。
-
数据恢复测试:开发环境需要一份线上数据来进行测试。
1.2 备份的分类
按不同维度可以分为好几类,小白只需要先记住两种:
-
逻辑备份 vs 物理备份
-
逻辑备份 :备份 SQL 语句(如
mysqldump导出的.sql文件)。可读性好,跨版本恢复方便,但速度慢。 -
物理备份 :直接复制数据库的数据文件(如
.ibd,ibdata等)。速度快,适合大库,但跨平台性较差。
-
-
热备份 vs 冷备份
-
热备份:数据库正常运行期间进行备份,不影响业务读写。
-
冷备份:需要停掉数据库服务后复制文件,最安全但会造成停机。
-
Percona XtraBackup 正是一款能够对 MySQL 进行热物理备份的神器。
二、备份的三种模式:全量、增量、差异
在制定备份策略时,经常会听到这三个词,理解它们的区别非常重要。
| 备份类型 | 解释 | 优点 | 缺点 |
|---|---|---|---|
| 全量备份 | 完整拷贝整个数据库的全部数据 | 恢复时最方便,只依赖一个备份集 | 占用空间大,备份时间长 |
| 增量备份 | 只备份自上次备份(全量或增量)以来发生变化的数据 | 节省空间,备份速度快 | 恢复时需依次合并多个备份,链条长 |
| 差异备份 | 只备份自上次全量备份以来发生变化的数据 | 比增量恢复简单,只需全量+最后一次差异 | 随着时间推移,差异文件会变大 |
用一张图直观表示三者的区别(假设周日全备,其他天差异/增量):
-
增量链:周日全量 → 周一备份(相对周日变化) → 周二备份(相对周一变化) → 周三备份(相对周二变化) ...
-
差异链:周日全量 → 周一备份(相对周日变化) → 周二备份(相对周日变化) → 周三备份(相对周日变化) ...
恢复时:增量需要依次还原全量和每一天的增量;差异只需要还原全量加最新的一次差异备份。两者各有优劣,生产环境中差异备份更常用,因为恢复更快且风险更小。
三、认识 Percona XtraBackup
Percona XtraBackup 是由 Percona 公司开发的免费开源热备份工具,支持 MySQL 5.6/5.7/8.0 以及 Percona Server、MariaDB。它基于 InnoDB 的 crash-recovery 机制,在备份时拷贝数据文件并实时监控 redo log,确保备份数据的一致性,而且整个过程不会阻塞读写。
3.1 安装 XtraBackup
对于 MySQL 8.0,需要安装 percona-xtrabackup-80。以下以 CentOS 7/8 为例:
bash
sudo yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm -y
# 启用工具仓库
sudo percona-release enable-only tools release
# 安装XtraBackup 8.0
sudo yum install percona-xtrabackup-80 -y
# 检查版本
xtrabackup --version
如果使用压缩功能(--compress),还需要安装解压工具 qpress(或其他压缩工具):
bash
# 下载并安装 qpress
wget http://www.quicklz.com/qpress-11-linux-x64.tar
tar xvf qpress-11-linux-x64.tar
sudo mv qpress /usr/local/bin/
权限要求 :用于备份的 MySQL 用户需要拥有
PROCESS,RELOAD,LOCK TABLES,REPLICATION CLIENT,BACKUP_ADMIN(MySQL 8.0)等权限。简单起见,测试环境可以直接用root用户。
四、XtraBackup 常用命令与实战
下面所有操作均假设:
-
MySQL 数据目录:
/var/lib/mysql -
备份存放目录:
/data/backup -
MySQL 用户:
root,密码:your_password
4.1 全量备份
最基础也是最核心的备份。命令:
bash
xtrabackup --backup \
--target-dir=/data/backup/full \
--user=root --password=your_password \
--datadir=/var/lib/mysql
-
--backup:执行备份操作 -
--target-dir:备份保存的文件夹(需要为空或不存在) -
--datadir:MySQL 数据目录,通常可从/etc/my.cnf中查到
成功执行后,/data/backup/full 下会生成数据库文件的副本。
4.2 增量备份
增量备份必须基于一个"基础备份"。通常基于上一次全量备份,或上一次增量备份。
第一次增量(基于全量):
bash
xtrabackup --backup \
--target-dir=/data/backup/inc1 \
--incremental-basedir=/data/backup/full \
--user=root --password=your_password
--incremental-basedir:指向上一级备份目录(可以是全量,也可以是增量)
第二次增量(基于第一次增量):
bash
xtrabackup --backup \
--target-dir=/data/backup/inc2 \
--incremental-basedir=/data/backup/inc1 \
--user=root --password=your_password
这样,
inc1包含自full以来变化的数据,inc2包含自inc1以来变化的数据。形成增量链。
4.3 差异备份
XtraBackup 本身并没有"差异备份"专用选项,但我们可以通过始终指定 --incremental-basedir 为同一个全量备份目录来模拟差异备份的效果。
第一次差异(同增量,也是基于全量):
bash
xtrabackup --backup \
--target-dir=/data/backup/diff1 \
--incremental-basedir=/data/backup/full \
--user=root --password=your_password
第二次差异(仍然基于全量,而不是 diff1):
bash
xtrabackup --backup \
--target-dir=/data/backup/diff2 \
--incremental-basedir=/data/backup/full \ # 注意!还是full
--user=root --password=your_password
这样 diff2 包含了从全量到当前的所有变更,不再依赖 diff1,这就是差异备份的本质。
4.4 压缩备份
为了节省磁盘空间,可以在备份时启用压缩。XtraBackup 支持 --compress 选项,默认使用 qpress 算法(也可使用 lz4 等)。
bash
xtrabackup --backup \
--compress --compress-threads=4 \
--target-dir=/data/backup/compressed_full \
--user=root --password=your_password
-
--compress:开启压缩 -
--compress-threads=4:压缩使用的线程数
备份后的文件会以 .qp 结尾,体积明显缩小。
五、备份的"准备"与"恢复"
备份出来的数据文件不能直接使用,因为它们处于不一致的状态(拷贝过程中数据在变化)。需要通过 --prepare 步骤应用事务日志,使数据达到一致性,这步相当于"冲洗底片"。
5.1 准备全量备份
bash
xtrabackup --prepare --apply-log-only \
--target-dir=/data/backup/full
-
--prepare:准备备份 -
--apply-log-only:应用日志后不进行回滚操作。对于全量备份,最后一步恢复前不要加这个参数,但对于需要后续合并增量的全量备份,必须加上,防止日志回滚影响增量合并。
5.2 准备增量/差异备份 (合并)
假设我们要恢复到一个时间点,需要将所有增量(或差异)合并到全量备份中。
① 首先准备全量(带 --apply-log-only):
bash
xtrabackup --prepare --apply-log-only --target-dir=/data/backup/full
② 合并第一个增量 inc1(同样带 --apply-log-only):
bash
xtrabackup --prepare --apply-log-only --target-dir=/data/backup/full \
--incremental-dir=/data/backup/inc1
③ 合并最后一个增量 inc2(不加 --apply-log-only,让工具进行最终回滚):
bash
xtrabackup --prepare --target-dir=/data/backup/full \
--incremental-dir=/data/backup/inc2
对于差异备份,只需将差异目录(如
diff2)作为--incremental-dir合并到全量即可,也只执行一次合并。
④ 如果使用了压缩备份,需要先解压再准备:
bash
# 解压
xtrabackup --decompress --target-dir=/data/backup/compressed_full
# 注意:解压后可以删除 .qp 文件以节省空间
find /data/backup/compressed_full -name "*.qp" -delete
# 然后再执行 prepare 步骤(同上)
5.3 恢复数据到 MySQL
恢复操作需要先停止 MySQL 服务,并清空数据目录(或移走备份)。
bash
# 停止 MySQL
sudo systemctl stop mysqld
# 备份并清空原数据目录(非常重要!)
sudo mv /var/lib/mysql /var/lib/mysql_bak
sudo mkdir /var/lib/mysql
# 执行恢复(将准备好的全量备份复制回数据目录)
sudo xtrabackup --copy-back --target-dir=/data/backup/full
# 或者使用 --move-back(移动代替复制,节省空间但会清空备份目录)
# sudo xtrabackup --move-back --target-dir=/data/backup/full
# 修改数据目录权限为 mysql 用户
sudo chown -R mysql:mysql /var/lib/mysql
# 启动 MySQL
sudo systemctl start mysqld
-
--copy-back:将备份数据复制到--datadir指定的目录(默认读取配置文件,或使用--datadir手动指定)。 -
--move-back:移动数据,完成后备份目录会变空。
恢复完成后,用客户端连接 MySQL 验证数据是否完整。
六、完整示例:每周全量+每日差异备份策略
1. 周日 -- 全量备份
bash
xtrabackup --backup --target-dir=/backup/full_$(date +%F) \
--user=root --password=xxx
2. 周一至周六 -- 差异备份
bash
# 假设周五
xtrabackup --backup \
--target-dir=/backup/diff_$(date +%F) \
--incremental-basedir=/backup/full_2026-06-28 \
--user=root --password=xxx
3. 灾难恢复(比如周六恢复)
bash
# 准备全量 (带 apply-log-only)
xtrabackup --prepare --apply-log-only --target-dir=/backup/full_2026-06-28
# 合并周六的差异备份
xtrabackup --prepare --target-dir=/backup/full_2026-06-28 \
--incremental-dir=/backup/diff_2026-07-04
# 停库、清空目录、拷贝恢复、改权限、启动(参见5.3节)
七、避坑指南与最佳实践
-
版本匹配:务必使用与 MySQL 主版本对应的 XtraBackup(如 MySQL 8.0 必须用 xtrabackup 8.0)。
-
磁盘空间:备份目录所在磁盘要留有足够空间,压缩备份虽省空间但解压时仍需临时空间。
-
备份验证:定期在测试环境执行恢复演练,确保备份文件可用。
-
安全存放:备份文件务必传到异地或异机,避免"机器和备份一起被删"。
-
权限问题 :恢复后务必
chown -R mysql:mysql,否则 MySQL 启动会报错。 -
压缩坑 :使用
--compress后,恢复前必须先执行--decompress;注意安装qpress工具。
结语
通过本文,你已从备份概念一路走到了 XtraBackup 的实战操作。无论是全量、增量、差异还是压缩备份,背后的原理都是相通的。亲手搭建一套备份恢复环境并模拟一次真实故障,会让你对数据安全有更深刻的体会。希望这篇保姆级教程能帮助你迈出数据库备份的第一步,为你的数据加上一道坚固的保险。