乐途乐途
主页
  • 计算机基础

    • TCP/IP协议
    • Linux命令
    • HTTP协议
  • 数据库

    • SQL
    • MySQL 5.7
  • 编程语言

    • C语言
    • Python2
    • Python3
  • 数据格式

    • JSON
    • XML
  • 认证与安全

    • JWT
  • 工具

    • Markdown
  • Git

    • GitFlow
  • Quartz

    • Quartz
  • Java

    • MyBatis
    • Spring
    • Spring MVC
    • Maven 入门
    • Maven 进阶
    • Java 设计模式
  • 缓存

    • Redis
联系
阿里云
主页
  • 计算机基础

    • TCP/IP协议
    • Linux命令
    • HTTP协议
  • 数据库

    • SQL
    • MySQL 5.7
  • 编程语言

    • C语言
    • Python2
    • Python3
  • 数据格式

    • JSON
    • XML
  • 认证与安全

    • JWT
  • 工具

    • Markdown
  • Git

    • GitFlow
  • Quartz

    • Quartz
  • Java

    • MyBatis
    • Spring
    • Spring MVC
    • Maven 入门
    • Maven 进阶
    • Java 设计模式
  • 缓存

    • Redis
联系
阿里云
  • 学习路径
  • 第1章 数据库基础与安装

    • MySQL 简介
    • MySQL 5.6 到 5.7 到 8.0 关键差异速查
    • 安装 MySQL 5.7
    • 连接与断开服务器
    • 创建数据库
    • 创建数据表
    • 数据库与数据表
    • 加载数据
    • 获取数据库信息
    • 批处理模式
    • SHOW 语句汇总
    • FLUSH 与 RESET 语句
    • my.cnf 核心参数
    • 字符集与排序规则
  • 第2章 SQL基础查询

    • SELECT
    • WHERE
    • ORDER BY
    • LIMIT
    • COUNT
    • 聚合函数
    • 比较运算符
    • 逻辑运算符
    • 算术运算符
    • 模式匹配
    • NULL 值处理
    • UPDATE
    • DELETE
    • REPLACE
    • SELECT INTO
  • 第3章 数据类型与运算符

    • 数值类型
    • 字符串类型
    • 日期时间类型
    • BIT 类型
    • ENUM 类型
    • SET 类型
    • JSON 类型
    • 类型转换
  • 第4章 函数与表达式

    • 字符串函数
    • 数值函数
    • 日期函数
    • 全文检索函数
  • 第5章 高级查询与子查询

    • JOIN
    • 子查询
    • UNION
    • GROUP BY
    • HAVING
    • DISTINCT
  • 第6章 表与索引

    • 数据定义语言
    • 修改表结构
    • 视图
    • 修改视图与检查选项
    • 外键
    • 索引
    • 唯一索引
    • 复合索引
    • 存储引擎对比
    • 分区表
    • 第一范式与第二范式
    • 第三范式与 BC 范式
    • 反范式设计
  • 第7章 存储过程与函数

    • 存储过程
    • 存储函数
    • 变量
    • 流程控制
    • 游标
    • 预处理语句
  • 第8章 事务与锁

    • 事务
    • 事务隔离级别
    • 锁机制
    • MVCC
    • 死锁专题分析
    • LOCK TABLES
    • XA 事务
  • 第9章 用户管理与安全

    • 用户管理
    • 权限管理
    • 角色
    • SQL 注入防范
  • 第10章 性能优化入门

    • 执行计划
    • 索引优化
    • 查询优化
    • 查询优化器提示
    • 慢查询日志
    • InnoDB 深入机制
    • InnoDB 专项优化
    • Performance Schema
    • sys Schema
  • 第11章 复制与高可用

    • 主从复制原理
    • 半同步复制配置
    • binlog 开启与 point-in-time 恢复
    • mysqldump 全库备份
    • mysqldump 单表与条件备份
    • mysqldump 恢复与导入
    • xtrabackup 全量热备
    • xtrabackup 准备与恢复
    • xtrabackup 增量与流式备份
  • 第12章 触发器与事件

    • 触发器
    • 事件调度器
  • 参考

    • MySQL 5.7 专业术语大全
    • MySQL 5.7 关键字与保留字大全

xtrabackup 增量与流式备份

导学

每天全量备份 500GB 的数据库,备份窗口可能长达数小时。增量备份只复制自上次备份以来发生变化的数据页,通常只需几分钟。配合流式备份直接传输到远程存储,可以实现高效的备份策略。

定义

增量备份:只备份自上次全量或增量备份以来被修改过的 InnoDB 数据页。XtraBackup 通过比较 LSN(Log Sequence Number)判断哪些页发生了变化。流式备份:将备份数据实时输出到标准输出,通过管道直接传输到远程存储或归档设备,不占用本地备份磁盘。

场景一:基于全备的增量备份

前置条件:周日已完成全量备份。

# 周日全备
xtrabackup --backup --target-dir=/backup/sunday_full \
  --user=backup_user --password=BackupPass123

当前数据状态:周一业务运行后,company 库新增了一条员工记录。

INSERT INTO employees (emp_name, dept, score) VALUES ('孔蓝', '产品部', 88);

操作语句:周一执行增量备份。

xtrabackup --backup \
  --target-dir=/backup/monday_incr \
  --incremental-basedir=/backup/sunday_full \
  --user=backup_user --password=BackupPass123

验证增量备份目录:

ls -la /backup/monday_incr/

预期输出包含大量 .delta 文件(增量数据页):

-rw-r--r-- 1 root root  16K Jan 15 02:00 ibdata1.delta
-rw-r--r-- 1 root root 4.0K Jan 15 02:00 company/employees.ibd.delta

查看增量备份元数据:

cat /backup/monday_incr/xtrabackup_info

关键字段:

incremental = Y
from_lsn = 12345678
to_lsn = 12346000

结果解读:

  • --incremental-basedir 指向上次备份(全备或增量备)的目录
  • XtraBackup 读取基础备份的 xtrabackup_checkpoints 中的 to_lsn,只备份 LSN 大于该值的数据页
  • 增量备份目录只包含变化的 .delta 文件,体积通常只有全备的 5%~15%
  • from_lsn 和 to_lsn 记录了本次增量备份覆盖的 LSN 范围

场景二:多级增量备份链

操作语句:周二基于周一增量再做增量。

xtrabackup --backup \
  --target-dir=/backup/tuesday_incr \
  --incremental-basedir=/backup/monday_incr \
  --user=backup_user --password=BackupPass123

周三基于周二:

xtrabackup --backup \
  --target-dir=/backup/wednesday_incr \
  --incremental-basedir=/backup/tuesday_incr \
  --user=backup_user --password=BackupPass123

备份链结构:

/backup/
├── sunday_full/          # 全备(LSN: 0 -> 12345678)
├── monday_incr/          # 增量 1(LSN: 12345678 -> 12346000)
├── tuesday_incr/         # 增量 2(LSN: 12346000 -> 12346500)
└── wednesday_incr/       # 增量 3(LSN: 12346500 -> 12347000)

结果解读:

  • 增量备份可以链式进行,每次基于上一次的备份目录
  • 恢复时必须按顺序应用:全备 -> 周一增量 -> 周二增量 -> 周三增量
  • 链条过长会增加恢复复杂度和风险,建议每周做一次全备,重置链条

场景三:流式增量备份到远程

操作语句:将增量备份直接流式传输到远程服务器。

xtrabackup --backup \
  --user=backup_user --password=BackupPass123 \
  --incremental-basedir=/backup/sunday_full \
  --stream=xbstream \
  --target-dir=/tmp | \
  ssh backup_server "xbstream -x -C /remote/backup/monday_incr"

结果解读:

  • --stream=xbstream 将增量备份输出为流格式
  • 增量备份的 .delta 文件通过管道实时传输到远程
  • 远程服务器用 xbstream -x 解压到指定目录
  • 适合本地磁盘空间不足、或备份目标在异地数据中心的场景

场景四:压缩增量备份

操作语句:

xtrabackup --backup \
  --target-dir=/backup/monday_incr \
  --incremental-basedir=/backup/sunday_full \
  --compress \
  --compress-threads=2 \
  --user=backup_user --password=BackupPass123

验证:

ls -lh /backup/monday_incr/company/

预期输出:

-rw-r--r-- 1 root root 2.1K Jan 15 02:00 employees.ibd.delta.qp

结果解读:增量备份本身已经很小,再压缩后通常只有全备的 1%~5%。适合网络带宽有限、需要长期保留多份增量备份的场景。

常见误区

误区正解
"增量备份可以独立恢复"不能。增量备份必须基于全备,恢复时先恢复全备,再按顺序应用每个增量。
"增量备份链条越长越好"不是。链条过长增加恢复时间和失败风险。建议每周做一次全备,重置链条。
"增量备份只备份 InnoDB"默认只增量备份 InnoDB 数据页。MyISAM 表在增量备份中会被完整复制(因为 MyISAM 没有 LSN 机制)。
"增量备份后不需要 prepare"需要。增量备份的 .delta 文件必须在 prepare 阶段合并到全备中。

面试考点

Q:增量备份的原理是什么?

XtraBackup 通过比较 InnoDB 数据页的 LSN(Log Sequence Number)判断哪些页自上次备份后发生了变化。只复制 LSN 大于基础备份 to_lsn 的数据页,生成 .delta 文件。恢复时将这些 .delta 页合并到全备的数据文件中。

Q:全备 + 增量备份的恢复顺序?

  1. prepare 全备(--apply-log --redo-only);2. 按顺序 prepare 每个增量(--apply-log --redo-only --incremental-dir=incrN);3. 最后一个增量 prepare 时不加 --redo-only(允许回滚未提交事务);4. copy-back 到数据目录。

Q:增量备份适合什么场景?

数据量大(> 100GB)、变化率较低(日变更 < 10%)、备份窗口有限的场景。如果每天 80% 的数据都变化,增量备份体积接近全备,不如直接全备。

小结

  • 增量备份只复制变化的数据页,体积通常为全备的 5%~15%
  • --incremental-basedir 指向上次备份目录,XtraBackup 通过 LSN 判断变化页
  • 增量备份可以链式进行,但建议每周做一次全备重置链条
  • 恢复时必须按顺序应用:全备 -> 增量 1 -> 增量 2 -> ...
  • 流式备份和压缩进一步节省磁盘和网络资源

下一章引子:备份文件生成后,必须经过 prepare 阶段才能用于恢复。这是 xtrabackup 与 mysqldump 最大的流程差异。

上一页
xtrabackup 准备与恢复