1.MySQL数据备份与恢复
1.0核心概念
1.物理备份/逻辑备份:描述的是备份方法(如何备份)
2.完全/增量/差异备份:描述的是备份策略(备份什么数据)
3.完全/增量/差异备份既可以通过物理备份实现,也可以通过逻辑备份实现
1.1按备份的数据范围(备份周期策略)
|------|-----------------------|-------------------------------------|
| 类型 | 描述 | 特点 |
| 完全备份 | 对数据库进行一次完整全面的备份 | 恢复简单,文件大,耗时长 |
| 增量备份 | 备份自上一次任何类型备份之后发生变化的数据 | 恢复复杂,备份速度快,文件小,必须依赖上一个备份文件,并按顺序逐个恢复 |
| 差异备份 | 备份自上一次完全备份所发送变化的数据 | 恢复一般,恢复只需要一个完全备份和最近一次差异备份 |
[MySQL数据备份类型]
增量备份

差异备份

1.2按备份的实现方式(备份内容形态)
|------|------------------------------------|----------------------------|------------------------------------------------|
| 备份类型 | 描述 | 特点 | 工具 |
| 逻辑备份 | 备份数据库的逻辑结构和数据,保存为SQL语句或特定格式文本(CSV) | 可读,恢复数据需数据库引擎执行SQL重建数据,速度慢 | mysqldump |
| 物理备份 | 直接拷贝数据库在磁盘上的物理数据文件、日志文件 | 不可读,恢复快,文件大,与MySQL版本强相关 | XtraBackup MySQL Enterprise Backup 文件系统(逻辑卷)快照 |
[MySQL备份实现方式]
1.3按备份时数据库的服务状态(业务影响)
|-----|----------------------------------|-----------------------------|
| 类型 | 描述 | 特点 |
| 热备份 | 在数据库正常运行时进行备份,期间所有读写不受影响 | 对业务零干扰,实现高可用首选,技术最复杂 |
| 冷备份 | 数据库完全关闭后备份 | 备份与恢复简单,但备份期间服务完全中断,不可用 |
| 温备份 | 在数据库运行时备份,备份期间会锁定数据库,通常只允许读,不允许写 | 介于热备与冷备之间,对业务有一定影响,但实现比热备简单 |
[MySQL数据库备份服务状态]
2.RTO与RPO(恢复时间与恢复目标点的速度)
RTO 和 RPO 是两个非常重要的容灾与备份恢复指标,它们与备份策略的选择密切相关。
|----|------------------------|--------------------|
| 分类 | RTO(恢复目标时间) | RPO(恢复点目标) |
| 描述 | 从故障发生到系统恢复服务所需的最大可接受时间 | 系统在故障后允许丢失的数据量时间长度 |
| 目标 | 越短越好(更快的恢复手段) | 越接近0越好(实时备份或实时复制) |
[RTO与RPO]
2.1备份策略与RTO/RPO的关系
|------|---------|--------------------|
| 备份类型 | 对RTO的影响 | 对RPO的影响 |
| 完全备份 | 恢复快 | 取决于备份频率,频率低则 RPO 高 |
| 增量备份 | 恢复慢 | RPO低 |
| 差异备份 | 恢复中等 | RPO中等 |
| 逻辑备份 | 恢复慢 | 取决于备份频率 |
| 物理备份 | 恢复快 | 取决于备份频率 |
| 热备份 | RTO可控 | 可配合实时复制实现低 RPO |
| 冷备份 | RTO高 | RPO高 |
[备份策略与RTO/RPO的关系]
2.2结合 RTO/RPO 设计备份策略
场景:电商数据库,要求 RTO < 1小时,RPO < 5分钟
推荐策略:
- 每日凌晨 2:00 执行一次 物理完全热备份
- 每 4 小时执行一次 物理增量热备份
- 开启 MySQL 主从复制(实时同步)
- 使用 XtraBackup 实现物理热备份与快速恢复
- RTO 保障:物理备份恢复快,XtraBackup 支持快速应用日志,满足 1 小时内恢复。
- RPO 保障:增量备份频率高(4小时),结合主从复制,实际数据丢失可控制在秒级。
3.物理备份XtraBackup
数据库版本:MySQL 8.0.44
- 备份目录:
全量备份目录:
/backups/full第一次增量备份目录:
/backups/inc1(基于全量备份)第二次增量备份目录:
/backups/inc2(基于第一次增量备份inc1)第三次增量备份目录:
/backups/inc3(基于第二次增量备份inc2)数据目录(datadir):
- RPM包安装:
/var/lib/mysql- 源码安装:
/usr/local/mysql/data
3.1安装XtraBackup
官方网站:https://www.percona.com/downloads

安装XtraBackup
wget https://downloads.percona.com/downloads/Percona-XtraBackup-8.0/Percona-XtraBackup-8.0.35-34/binary/redhat/9/x86_64/percona-xtrabackup-80-8.0.35-34.1.el9.x86_64.rpm
dnf -y localinstall percona-xtrabackup-80-8.0.35-34.1.el9.x86_64.rpm
查看版本
xtrabackup --version
3.2完全备份&恢复
完全备份流程:
1.xtrabackup --backup --target-dir=存储完全备份路径 --user=mysql用户 --password=密码
完全恢复流程:
1.xtrabackup --prepare --apply-log-only --target-dir=完全备份路径
2.xtrabackup --prepare --target-dir=完全备份路径
3.xtrabackup --copy-back --target-dir=完全备份路径
4.chown mysql:mysql /var/lib/mysql
3.2.1实验环境准备(以下完全备份,增量备份,差异备份)
创建用户
CREATE USER root@'%' IDENTIFIED BY "Root@123";

创建存储路径
mkdir /backups
授予BACKUP_ADMIN权限(MySQL内操作)
GRANT BACKUP_ADMIN,RELOAD,LOCK TABLES,PROCESS,REPLICATION CLIENT ON *.* TO root@'%';
flush privileges; -刷新

数据准备(完全备份,增量备份)
CREATE DATABASE Cloud2026;
USE Cloud2026;
CREATE TABLE t1(id INT,name VARCHAR(20));
INSERT INTO t1 VALUES (1,'jack'),(2,'tom');


退出MySQL
3.2.2完全备份
xtrabackup --backup --target-dir=指定备份文件存放路径 --user=指定MySQL用户 --password=指定MySQL密码
解释
--backup -执行备份操作
--target-dir -指定备份文件存放路径
--user -指定MySQL用户
--password -指定MySQL用户密码
xtrabackup --backup --target-dir=/backups/$(date +%F-%H:%M) --user=root --password=Root@123

查看备份结果
ls /backups/
ls /backups/2026-01-20-13\:43/

3.2.3完全恢复
准备仅应用
xtrabackup --prepare --apply-log-only --target-dir=目标备份
解释
--prepare -进入准备阶段
--apply-log-only -只应用日志,不进行回滚
--target-dir -指定备份文件目录
xtrabackup --prepare --apply-log-only --target-dir=/backups/2026-01-20-13\:43/
准备
xtrabackup --prepare --target-dir=/backups/2026-01-20-13\:43/ -去掉--apply-log-only
xtrabackup --prepare --target-dir=/backups/2026-01-20-13\:43/
模拟数据丢失
systemctl stop mysqld -关闭数据库服务
rm -rf /var/lib/mysql/* -删除数据库所有日志
ls /var/lib/mysql -检查是否删除
恢复数据
xtrabackup --copy-back --target-dir=目标备份
解释
--copy-back -拷贝
xtrabackup --copy-back --target-dir=/backups/2026-01-20-13\:43/ -完全恢复
chown -R mysql:mysql /var/lib/mysql -将文件所有者说有组给MySQL
验证
systemctl start mysqld -启动MySQL
mysql -uroot -p'Root@123' -登录MySQL
SELECT * FROM Cloud2026.t1; -查看是否恢复

3.3增量备份&恢复
增量备份流程:
xtrabackup --backup --target-dir=增量备份路径 --incremental-basedir=上一个备份路径 --user=mysql用户 --password=密码
增量恢复流程:
1.xtrabackup --prepare --apply-log-only --target-dir=完全备份所在路径
2.xtrabackup --prepare --apply-log-only --target-dir=完全备份所在路径 --incremental-dir=增量备份1所在位置
xtrabackup --prepare --apply-log-only --target-dir=完全备份所在路径 --incremental-dir=增量备份2所在位置
3.xtrabackup --prepare --target-dir=完全备份路径
4.xtrabackup --copy-back --target-dir=完整备份路径
5.chown mysql:mysql /var/lib/mysql
3.3.1实验环境准备
数据准备
CREATE DATABASE Cloud2026;
USE Cloud2026;
CREATE TABLE t1(id INT,name VARCHAR(20));
INSERT INTO t1 VALUES (1,'jack'),(2,'tom');

3.3.2先完全备份
xtrabackup --backup --target-dir=/backups/$(date +%F-%H:%M) --user=root --password='Root@123'

插入一条数据(tony)
INSERT INTO Cloud2026.t1 VALUES (3,'tony'); -插入一条数据
SELECT * FROM Cloud2026.t1;

3.3.3增量备份1(基于完全备份)
xtrabackup --backup --target-dir=/backups/inc1-$(date +%F-%H:%M) --incremental-basedir=/backups/2026-01-20-15\:54/ --user=root --password='Root@123'

查看备份
ls /backups/

在插入一条数据(jams)
INSERT INTO Cloud2026.t1 VALUES (4,'jams');
SELECT * FROM Cloud2026.t1;

3.3.4增量备份2(基于增量备份1)
xtrabackup --backup --target-dir=/backups/inc2-$(date +%F-%H:%M) --incremental-basedir=/backups/inc1-2026-01-20-16\:04/ --user=root --password='Root@123'

查看备份
ls /backups/

在插入一条数据(alice)
INSERT INTO Cloud2026.t1 VALUES (5,'alice');
SELECT * FROM Cloud2026.t1;

3.3.5增量备份3(基于增量备份2)
xtrabackup --backup --target-dir=/backups/inc3-$(date +%F-%H:%M) --incremental-basedir=/backups/inc2-2026-01-20-16\:17/ --user=root --password='Root@123'

查看备份

在插入一条数据(该条数据回复后应该不存在)
INSERT INTO Cloud2026.t1 VALUES (6,'ajiakes');
SELECT * FROM Cloud2026.t1;

3.3.6增量恢复
这是恢复过程中最关键的一步。绝对不能 直接将增量备份拷贝到数据目录。必须首先将所有增量备份应用(Apply)到全量备份上,形成一个统一的、一致的数据镜像。
3.3.6.1准备阶段
1.准备仅应用完全备份
xtrabackup --prepare --apply-log-only --target-dir=/backups/2026-01-20-15\:54/
2.将第一次增量备份应用到全量备份上
xtrabackup --prepare --apply-log-only --target-dir=/backups/2026-01-20-15\:54/ --incremental-dir=/backups/inc1-2026-01-20-16\:04/

3.将第二次增量备份应用到全量备份上
xtrabackup --prepare --apply-log-only --target-dir=/backups/2026-01-20-15\:54/ --incremental-dir=/backups/inc2-2026-01-20-16\:17/

4.将第三次增量备份应用到全量备份上
xtrabackup --prepare --apply-log-only --target-dir=/backups/2026-01-20-15\:54/ --incremental-dir=/backups/inc3-2026-01-20-16\:25/

5.最后,准备完全备份(完成最终回滚)
xtrabackup --prepare --target-dir=/backups/2026-01-20-15\:54/
3.3.7数据恢复
模拟数据丢失
systemctl stop mysqld
rm -rf /var/lib/mysql/*
ls /var/lib/mysql
恢复数据
xtrabackup --copy-back --target-dir=/backups/2026-01-20-15\:54/

将/var/lib/mysql下的所有文件所有者所有组改为mysql
chown -R mysql:mysql /var/lib/mysql
验证结果
systemctl start mysqld
mysql -uroot -p'Root@123'
SELECT * FROM Cloud2026.t1;

3.4差异备份
差异备份流程:
xtrabackup --backup --target-dir=差异备份路径 --incremental-basedir=完全备份路径 --user=mysql用户 --password=密码
差异恢复流程:
1.xtrabackup --prepare --apply-log-only --target-dir=完全备份所在路径
2.xtrabackup --prepare --apply-log-only --target-dir=完全备份所在路径 --incremental-dir=最后一个差异备份所在位置
3.xtrabackup --prepare --target-dir=完全备份路径
4.xtrabackup --copy-back --target-dir=完整备份路径
5.chown mysql:mysql /var/lib/mysql
实验环境准备
CREATE TABLE Cloud2026.t2(id INT,name VARCHAR(10));
INSERT INTO Could2026.t2 VALUES (1,'tom');

3.4.1全量备份
xtrabackup --backup --target-dir=/backups/$(date +%F-%H:%M) --user=root --password='Root@123'


插入一条数据(toms)
INSERT INTO Cloud2026.t2 VALUES (2,'toms');

3.4.2差异备份1
xtrabackup --backup --target-dir=/backups/dif-$(date +%F-%H:%M) --incremental-basedir=/backups/2026-01-20-17\:30/ --user=root --password='Root@123'


插入一条数据(jack)
INSERT INTO Cloud2026.t2 VALUES (3,'jack');

3.4.3差异备份2
xtrabackup --backup --target-dir=/backups/dif2-$(date +%F-%H:%M) --incremental-basedir=/backups/2026-01-20-17\:30/ --user=root --password='Root@123'


插入一条数据(tony)
INSERT INTO Cloud2026.t2 VALUES (4,'tony');

3.4.4差异备份3
xtrabackup --backup --target-dir=/backups/dif3-$(date +%F-%H:%M) --incremental-basedir=/backups/2026-01-20-17\:30/ --user=root --password='Root@123'


插入一条数据(alice)(恢复后不显示)
INSERT INTO Cloud2026.t2 VALUES (5,'alice');

3.5差异恢复
3.5.1模拟数据丢失
systemctl stop mysqld
rm -rf /var/lib/mysql/*
ls /var/lib/mysql
3.5.2准备阶段
1.准备仅备份
xtrabackup --prepare --apply-log-only --target-dir=/backups/2026-01-20-17\:30/

2.将差异备份应用到全量备份
xtrabackup --prepare --apply-log-only --target-dir=/backups/2026-01-20-17\:30/ --incremental-dir=/backups/dif3-2026-01-20-19\:03/

3.将完全备份回滚
xtrabackup --prepare --target-dir=/backups/2026-01-20-17\:30/
3.5.3恢复阶段
1.将完全备份恢复
xtrabackup --copy-back --target-dir=/backups/2026-01-20-17\:30/

2.修改权限
chown -R mysql:mysql /var/lib/mysql
3.验证数据
systemctl start mysqld
mysql -uroot -p'Root@123'
SELETC * FROM Cloud2026.t2;

3.6注意事项
1.基本流程:备份 → 准备→ 停止服务 → 清空原有数据 → 拷贝数据(恢复)→ 改权限 → 启动服务
|-----------------------|---------------|
| --incremental-basedir | 备份时指定"基础备份" |
| --incremental-dir | 准备时指定要应用的增量备份 |
| --apply-log-only | 只应用事务日志,不执行回滚 |
[关键参数]