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

    • 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 全量热备

导学

mysqldump 备份 100GB 的数据库可能需要几小时,恢复更要翻倍。对于生产环境的大库,Percona XtraBackup 是行业标准——它在不锁表的情况下复制 InnoDB 数据文件,备份速度快、体积小、对业务零影响。

定义

XtraBackup:Percona 开源的 MySQL 物理热备工具,基于 InnoDB 的崩溃恢复机制,在备份期间复制数据文件并记录 redo log 变化,最终生成与备份结束时一致的物理数据文件副本。MySQL 5.7 对应 XtraBackup 2.4 版本。

安装 XtraBackup 2.4

# CentOS / RHEL
yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm
percona-release enable-only tools release
yum install percona-xtrabackup-24

# 验证版本
xtrabackup --version
# 预期:xtrabackup version 2.4.x based on MySQL server 5.7.x

场景一:全量热备

当前数据状态:company 库正在运行,业务持续写入。

USE company;
SELECT emp_name, score FROM employees;
emp_namescore
大翔100
白歌NULL

操作语句(命令行,需 root 权限或备份专用账号):

# 创建备份目录
mkdir -p /backup

# 执行全量热备
xtrabackup --backup \
  --target-dir=/backup/full_backup \
  --user=backup_user \
  --password=BackupPass123 \
  --socket=/var/lib/mysql/mysql.sock

备份过程输出(关键片段):

240115 02:00:00  version_check Connecting to MySQL server with DSN...
240115 02:00:01 >> log scanned up to (12345678)
240115 02:00:02 Executing FLUSH NO_WRITE_TO_BINLOG TABLES...
240115 02:00:02 Executing FLUSH TABLES WITH READ LOCK...
240115 02:00:02 Starting to backup non-InnoDB tables and files
240115 02:00:03 Completing FLUSH TABLES WITH READ LOCK...
240115 02:00:03 Executing UNLOCK TABLES
240115 02:00:03 All tables unlocked
240115 02:00:04 Backup created in directory '/backup/full_backup/'
240115 02:00:04 completed OK!

结果解读:

  • --backup 表示执行备份操作
  • 备份期间 InnoDB 表不锁表(利用 MVCC 快照),MyISAM 和系统表会短暂加读锁(通常 < 1 秒)
  • --target-dir 指定备份输出目录,包含 ibdata1、.ibd 文件、xtrabackup_logfile 等
  • 备份完成后目录结构:
    /backup/full_backup/
    ├── ibdata1              # 系统表空间
    ├── ib_logfile0          # redo log 副本
    ├── mysql/               # 系统库文件
    ├── company/
    │   ├── employees.ibd    # 员工表数据文件
    │   └── scores.ibd
    ├── xtrabackup_checkpoints  # 备份元数据
    └── xtrabackup_info         # 备份信息(时间、binlog 位置等)
    

场景二:查看备份元数据

操作语句:

cat /backup/full_backup/xtrabackup_info

预期输出:

uuid = 550e8400-e29b-41d4-a716-446655440000
name =
tool_name = xtrabackup
tool_command = --backup --target-dir=/backup/full_backup --user=backup_user
tool_version = 2.4.28
ibbackup_version = 2.4.28
server_version = 5.7.44-log
start_time = 2024-01-15 02:00:00
end_time = 2024-01-15 02:05:32
lock_time = 0
binlog_pos = filename 'mysql-bin.000015', position '1234'
innodb_from_lsn = 0
innodb_to_lsn = 12345678

结果解读:

  • binlog_pos 记录了备份结束时的 binlog 文件名和位置,和 mysqldump 的 --master-data=2 作用相同,是 point-in-time 恢复的锚点
  • innodb_to_lsn 是备份结束时的 LSN(Log Sequence Number),prepare 阶段需要将 redo log 重放到这个 LSN
  • lock_time = 0 表示锁表时间为 0(纯 InnoDB 环境),证明热备未阻塞业务

场景三:压缩备份

操作语句:备份时直接压缩,减少磁盘占用。

xtrabackup --backup \
  --target-dir=/backup/full_backup \
  --compress \
  --compress-threads=4 \
  --user=backup_user \
  --password=BackupPass123

验证:

ls -lh /backup/full_backup/company/employees.ibd*

预期输出包含 .qp 后缀(QuickLZ 压缩格式):

-rw-r--r-- 1 root root 1.2M Jan 15 02:05 employees.ibd.qp

结果解读:--compress 使用 QuickLZ 算法压缩数据文件,通常可节省 30%~50% 空间。--compress-threads=4 用 4 个线程并行压缩,加速备份过程。恢复前需先解压:xtrabackup --decompress --target-dir=/backup/full_backup。

场景四:流式备份到远程

操作语句:将备份直接通过管道传输到远程服务器,不占用本地磁盘。

# 本地备份并通过 ssh 传输到远程存储
xtrabackup --backup \
  --user=backup_user \
  --password=BackupPass123 \
  --stream=xbstream \
  --target-dir=/tmp | \
  ssh backup_server "xbstream -x -C /remote/backup/full_backup"

结果解读:

  • --stream=xbstream 将备份输出为 xbstream 格式(类似 tar),通过管道传输
  • 本地 /tmp 只作为临时缓冲,不占大量磁盘空间
  • 远程服务器用 xbstream -x 解压到 /remote/backup/full_backup
  • 适合本地磁盘紧张、或备份目标在 NAS/对象存储的场景

常见误区

误区正解
"xtrabackup 完全不锁表"InnoDB 不锁表,但 MyISAM 和系统表会短暂加读锁(通常 < 1 秒)。纯 InnoDB 环境可做到零锁表时间。
"备份完就能直接启动 MySQL"不能。备份文件是"崩溃时"的状态,必须经过 prepare(应用 redo log)才能一致。
"xtrabackup 可以备份 MyISAM"可以,但 MyISAM 表备份时会加读锁,且不支持热备。建议将所有表转为 InnoDB。
"备份目录可以直接复制到另一台服务器"复制后仍需 prepare 才能用。且目标服务器 MySQL 版本必须相同。

面试考点

Q:xtrabackup 为什么能做到不锁表热备?

基于 InnoDB 的 MVCC 和崩溃恢复机制。备份开始时记录 LSN,然后复制数据文件(此时文件可能正在被修改)。同时后台线程持续复制 redo log 变更到 xtrabackup_logfile。备份结束后,prepare 阶段用 redo log 将数据文件恢复到备份结束时的一致状态,就像 InnoDB 崩溃后自动恢复一样。

Q:xtrabackup 备份和 mysqldump 备份的核心区别?

xtrabackup 是物理备份:复制 InnoDB 数据文件 + redo log,速度快、体积小、恢复快(文件级复制),但依赖相同版本。 mysqldump 是逻辑备份:生成 SQL 文本,跨版本兼容、可编辑,但速度慢、体积大、恢复慢(逐行 INSERT)。

Q:xtrabackup 2.4 和 8.0 有什么区别?

XtraBackup 2.4 对应 MySQL 5.6/5.7;XtraBackup 8.0 对应 MySQL 8.0。两者不兼容,MySQL 5.7 必须用 2.4 版本。

小结

  • xtrabackup 是 InnoDB 物理热备工具,备份快、不锁表、体积小
  • 全量备份:xtrabackup --backup --target-dir=/path
  • 备份文件不能直接启动,必须经过 prepare 阶段应用 redo log
  • 压缩备份用 --compress,流式备份用 --stream=xbstream 配合管道
  • MySQL 5.7 对应 XtraBackup 2.4 版本

下一章引子:每天全量备份大库仍然耗时,增量备份只复制变化的数据页,能大幅缩短备份窗口。

上一页
mysqldump 恢复与导入
下一页
xtrabackup 准备与恢复