MySQL备份实战:从小白到熟练使用Percona XtraBackup

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节)

七、避坑指南与最佳实践

  1. 版本匹配:务必使用与 MySQL 主版本对应的 XtraBackup(如 MySQL 8.0 必须用 xtrabackup 8.0)。

  2. 磁盘空间:备份目录所在磁盘要留有足够空间,压缩备份虽省空间但解压时仍需临时空间。

  3. 备份验证:定期在测试环境执行恢复演练,确保备份文件可用。

  4. 安全存放:备份文件务必传到异地或异机,避免"机器和备份一起被删"。

  5. 权限问题 :恢复后务必 chown -R mysql:mysql,否则 MySQL 启动会报错。

  6. 压缩坑 :使用 --compress 后,恢复前必须先执行 --decompress;注意安装 qpress 工具。


结语

通过本文,你已从备份概念一路走到了 XtraBackup 的实战操作。无论是全量、增量、差异还是压缩备份,背后的原理都是相通的。亲手搭建一套备份恢复环境并模拟一次真实故障,会让你对数据安全有更深刻的体会。希望这篇保姆级教程能帮助你迈出数据库备份的第一步,为你的数据加上一道坚固的保险。

相关推荐
周杰伦的稻香2 小时前
MySQL8.0+中引入的SET_USER_ID权限迭代SUPER权限指定 DEFINER
数据库·mysql
韩楚风4 小时前
【参天引擎】Cantian 服务端框架全景解析:进程架构、模块组成与交互关系
数据库·mysql·架构·cantian
vigor5126 小时前
MySQL通过Mango实现分库分表
android·数据库·mysql
KASH_SHADOW8 小时前
8-Mysql的安装与配置
数据库·mysql·adb
_陈陆亮11 小时前
MySQL 运维高频 SQL:一条语句快速定位长事务与锁阻塞
运维·sql·mysql
Full Stack Developme11 小时前
正则表达式设计及工作原理
数据库·mysql·正则表达式
谢慧琼11 小时前
免费版收银系统支持多账号同时登录吗?
mysql
rebibabo11 小时前
Java基础(24) | MySQL 原理与优化:事务、存储引擎、索引与锁
mysql··存储引擎·explain·视图·最左前缀·事务acid
渣渣灰飞14 小时前
MySQL 系统学习 第二阶段 SQL 第一章:DDL(Data Definition Language)
数据库·学习·mysql