XtraDB Backup(Percona XtraBackup)备份MySQL详细介绍
一、XtraDB Backup(Percona XtraBackup)介绍
MySQL冷备、mysqldump、MySQL热拷贝都无法实现对数据库进行增量备份。在实际生产环境中增量备份是非常实用的,如果数据大于50G或100G,存储空间足够的情况下,可以每天进行完整备份,如果每天产生的数据量较大,需要定制数据备份策略。例如每周实用完整备份,周一到周六实用增量备份。而Percona-Xtrabackup就是为了实现增量备份而出现的一款主流备份工具,xtrabakackup有2个工具,分别是xtrabakup、innobakupe。
XtraBackup 是由 Percona 开发的开源工具,专门用于 MySQL 及兼容数据库(如 MariaDB、Percona Server)的在线热备份。它支持 InnoDB/XtraDB 存储引擎的高效备份,具有以下核心特性:
- 非阻塞备份:备份过程中不阻塞数据库的读写操作。
- 增量备份:仅备份自上次备份以来更改的数据,节省时间和存储。
- 快速恢复:支持通过全量+增量备份链快速恢复数据。
- 备份压缩与加密:可选压缩(如
--compress)和加密功能,优化存储安全。 - 自动实现备份检验
- 开源,免费
XtraBackup 对备份 MySQL 数据表类型的支持
众所周知,Xtrabackup是一个对InnoDB做数据备份的工具,支持在线热备份(备份时不影响数据读写),是商业备份工具InnoDB Hotbackup的一个很好的替代品。但是在公司生产环境常用的版本还是MySQL v5.7 及之前的版本,也有一些业务升级到了MySQL 8.0版本,不同的业务使用的表类型不同,在使用Xtrabackup我们要了解它的适用范围以及会有哪些影响。
在 Percona XtraBackup 的历史版本中,2.4 版本 是最后一个支持同时备份 InnoDB 和 MyISAM 表的版本。
关键点:
-
XtraBackup 2.4:
- 支持 InnoDB(包括 XtraDB)的热备份(不锁表)。
- 支持 MyISAM 的备份,但会短暂锁定表(
FLUSH TABLES WITH READ LOCK)。 - 适用于 MySQL 5.1、5.5、5.6 和 5.7 (5.7.9 ~ 5.7.28)(部分版本)。
-
XtraBackup 8.0+:
- 从 XtraBackup 8.0 开始,Percona 移除了对 MyISAM 表的支持,仅专注于 InnoDB 和 Percona Server 的增强功能。
- 适用于 MySQL 8.0 及更高版本。
建议:
- 如果你的数据库包含 MyISAM 表,并且需要完整备份,请使用 XtraBackup 2.4。
- 如果只有 InnoDB 表,建议使用最新的 XtraBackup 8.0+ 以获得更好的性能和兼容性。
额外说明:
- XtraBackup 2.4 仍然可以备份 MyISAM 表,但备份期间会短暂锁表,可能影响写入操作。
- 对于纯 InnoDB 环境,推荐升级到 XtraBackup 8.0+ 以支持 MySQL 8.0 的新特性(如 redo log 格式变更)。
XtraBackup 工具介绍
xtrabackup工具文件组成:
- Xtrabackup2.2 版之前包括4个可执行文件:
- innobackupex: Perl 脚本
- xtrabackup: C/C++,编译的二进制程序
- xbcrypt: 加解密
- xbstream: 支持并发写的流文件格式
xtrabackup 是用来备份 InnoDB 表的,不能备份非InnoDB 表,和 MySQLServer 没有交互
innobackupex 脚本用来备份非InnoDB 表,同时会调用 xtrabackup 命令来备份 InnoDB 表,还会和 MySQLServer 发送命令进行交互,如加全局读锁(FTWRL)、获取位点(SHOW SLAVESTATUS)等。即innobackupex是在 xtrabackup 之上做了一层封装实现的
xtrabackup的新版变化
xtrabackup版本升级到2.4后,相比之前的2.1有了比较大的变化:innobackupex 功能全部集成到 xtrabackup 里面,只有一个 binary程序,另外为了兼容考虑,innobackupex作为xtrabackup的软链接,即xtrabackup现在支持非Innodb表备份,并且Innobackupex在下一版本中移除,建议通过xtrabackup替换innobackupex
xtrabackup备份流程图
二、XtraBackup 与 MySQL 的版本对应规则
1. 匹配规则
| XtraBackup 版本 | 兼容的 MySQL 版本 | 说明 |
|---|---|---|
| 8.0.x | MySQL 8.0、Percona Server 8.0 | 支持 MySQL 8.0 的新特性(如 REDO/UNDO 日志格式变更、数据字典优化) |
| 2.4.x | MySQL 5.6、5.7、Percona 5.7 | 支持 MySQL 5.6/5.7,不兼容 MySQL 8.0 |
| 2.3.x 及以下 | MySQL 5.5 或更早版本 | 已逐渐淘汰 |
关键注意事项:
- MySQL 8.0 必须使用 XtraBackup 8.0+,否则备份会直接报错(例如
Unsupported redo log format)。 - MySQL 5.7 建议使用 XtraBackup 2.4.x,部分 8.0 版本可能兼容但需验证。
- Percona Server 需与 XtraBackup 版本对齐(如 Percona Server 5.7 → XtraBackup 2.4)。
2. 版本升级与降级策略
1. MySQL 升级(如 5.7 → 8.0)
- 步骤:
- 升级 XtraBackup 到 8.0+。
- 创建新备份(旧备份可能无法直接恢复至 MySQL 8.0)。
2. XtraBackup 降级
- 步骤:
1 2 3 4 5# 卸载当前版本 sudo yum remove percona-xtrabackup-80 # 安装旧版本 sudo yum install percona-xtrabackup-24
三、安装 XtraBackup
1. 安装 XtraBackup
1. 添加 Percona 官方仓库
避免使用默认仓库(可能版本过旧),优先通过 Percona 仓库安装:
|
|
2. 查看可安装的 XtraBackup 版本
|
|
3. 安装指定版本
根据 MySQL 版本选择对应的包:
- MySQL 8.0:
1sudo yum install percona-xtrabackup-80 - MySQL 5.6/5.7:
1sudo yum install percona-xtrabackup-24 - 离线安装指定的版本
1 2 3 4 5 6 7# In RPM-based distribution (like CentOS 7), you need to: sudo yum install cmake gcc gcc-c++ libaio libaio-devel bison ncurses-devel \ libgcrypt-devel libcurl-devel libev-devel python-sphinx vim-common # 或者直接通过 yum 安装来解决依赖的问题 sudo yum install -y percona-xtrabackup-24-2.4.20-1.el7.x86_64.rpm sudo rpm -qa |grep xtrabackup percona-xtrabackup-24-2.4.20-1.el7.x86_64
4. 验证安装版本
|
|
三、使用 XtraBackup 进行增量备份及还原
1. 全量备份
2. 执行全量备份
|
|
--target-dir:指定备份文件存储目录,目录不需要提前创建- 备份完成后,输出提示
completed OK!表示成功。 - 全量备份可以一周或者一天执行一次
查看备份信息
|
|
2. 备份文件结构
- 全量备份:包含所有数据文件。
- 增量备份:仅含变化的数据页(文件后缀
.delta和.meta)。
2. 还原全量备份
- 还原前需要停掉MySQL 服务
- 确保MySQL 数据目录是清空状态
1. 预整理
预整理,目的是将未完成的事务进行回滚
|
|
2. 最终准备并恢复数据
|
|
停止 MySQL 服务,清空数据目录,将备份文件复制回数据目录:
3.复制到数据库目录
例如数据库主机宕机或者挂掉了,将备份的数据拷贝到新的主机或者修复的数据库主机目录下
|
|
4.还原属性
修改所属者和所属组
|
|
/var/lib/mysql是默认目录,可通过/etc/my.cnf来进行查看,如有修改动态调整
5.启动服务
|
|
MySQL 增量备份
MySQL 增量备份(基于 xtrabackup)
1. 基于 LSN 的增量备份
XtraBackup 通过 LSN(Log Sequence Number)追踪数据页变化,增量备份需基于上一次全量或增量备份:
|
|
--incremental-basedir:指向上次备份的目录(全量或增量)。- 备份生成三个备份目录
/path/to/{full_backup,inc_backup_1,inc_backup_2}
MySQL 增量备份(基于 xtrabackup)还原
- 还原前需要停掉MySQL 服务
- 确保MySQL 数据目录是清空状态
1. 准备全量备份
预准备:确保数据一致,阻止回滚未完成的事务
|
|
- –apply-log-only阻止回滚未完成的事务,它仅执行redo日志的应用而不执行undo操作。这意味着事务不会被回滚。
适用场景:当计划应用增量备份(Incremental Backup)到全量备份时,需要先使用这个命令来准备全量备份。这样做是为了确保后续的增量备份可以正确地应用到基础备份上。 也就是说你的恢复策略包括先做一次全量备份,然后在此基础上应用一个或多个增量备份,则首先需要使用第一个命令(带–apply-log-only选项)准备全量备份,之后按照顺序逐一准备并应用每个增量备份(同样使用–apply-log-only直到最后一个增量备份)。最后,使用(不带–apply-log-only选项)来完成准备过程,使得整个备份集(包括全量和所有增量部分)可以用于恢复。
2. 还原合并增量备份
合并增量备份到全量备份:
|
|
3.复制到数据库目录
例如数据库主机宕机或者挂掉了,将备份的数据拷贝到新的主机或者修复的数据库主机目录下
|
|
- 这里也可以使用 cp 命令进行复制
4.还原属性
修改所属者和所属组
|
|
/var/lib/mysql是默认目录,如有修改动态调整
5.启动服务
|
|
MySQL 增量备份(基于 Binlog)
1. 启用 Binlog
在 my.cnf 中配置:
|
|
2. 定期备份 Binlog
|
|
3. 使用 Binlog 恢复数据
|
|
五、方案对比与选择
| 备份方式 | XtraBackup 增量备份 | Binlog 增量备份 |
|---|---|---|
| 粒度 | 页面级(物理备份) | SQL 语句级(逻辑备份) |
| 恢复速度 | 快(直接文件替换) | 慢(需重放 SQL) |
| 适用场景 | 大型数据库快速恢复 | 精细恢复(如误删单表) |
| 存储占用 | 中等(仅变化页) | 较大(记录所有变更) |
六、 XtraBackup 2.4 常用参数
以下是 Percona XtraBackup 2.4 的常用参数解释表格,涵盖备份、恢复、压缩、加密等核心功能:
XtraBackup 2.4 核心参数表
| 参数 | 类型 | 说明 | 默认值 | 示例 |
|---|---|---|---|---|
| 通用参数 | ||||
--backup |
命令 | 执行全量备份。 | - | xtrabackup --backup --target-dir=/backup |
--prepare |
命令 | 准备备份文件(应用日志,使其可恢复)。 | - | xtrabackup --prepare --target-dir=/backup |
--copy-back |
命令 | 将备份文件复制到 MySQL 数据目录。 | - | xtrabackup --copy-back --target-dir=/backup |
--target-dir |
选项 | 指定备份文件的存储目录。 | - | --target-dir=/backup/full |
--datadir |
选项 | 指定 MySQL 数据目录路径。 | /var/lib/mysql |
--datadir=/data/mysql |
| 增量备份 | ||||
--incremental |
选项 | 执行增量备份。 | false |
--incremental --target-dir=/backup/inc1 |
--incremental-basedir |
选项 | 指定增量备份的基础目录(上一次全量或增量备份的路径)。 | - | --incremental-basedir=/backup/full |
--incremental-lsn |
选项 | 手动指定增量备份的起始 LSN(替代 --incremental-basedir)。 |
- | --incremental-lsn=12345678 |
| 压缩与解压 | ||||
--compress |
选项 | 启用备份文件压缩(使用 QuickLZ 算法)。 | false |
--compress |
--compress-threads |
选项 | 指定压缩线程数(并行压缩)。 | 1 |
--compress --compress-threads=4 |
--decompress |
选项 | 解压已压缩的备份文件(需在 --prepare 阶段使用)。 |
false |
xtrabackup --prepare --decompress --target-dir=/backup |
| 加密 | ||||
--encrypt |
选项 | 启用备份文件加密(支持 AES128/AES192/AES256)。 | false |
--encrypt=AES256 |
--encrypt-key |
选项 | 直接指定加密密钥(不推荐,存在安全风险)。 | - | --encrypt-key="MySecretKey123" |
--encrypt-key-file |
选项 | 从文件读取加密密钥(推荐方式)。 | - | --encrypt-key-file=/path/to/keyfile |
--encrypt-threads |
选项 | 指定加密线程数(并行加密)。 | 1 |
--encrypt=AES256 --encrypt-threads=4 |
| 并行处理 | ||||
--parallel |
选项 | 指定备份或恢复时的并行线程数(加速大文件操作)。 | 1 |
--parallel=4 |
--use-memory |
选项 | 指定 --prepare 阶段可用的内存大小(提高处理速度)。 |
100MB |
--use-memory=2G |
| 日志与监控 | ||||
--log |
选项 | 指定日志文件路径。 | 输出到标准错误流 | --log=/var/log/xtrabackup.log |
--stream |
选项 | 将备份流式传输到标准输出(通常结合压缩或加密使用)。 | false |
--stream=xbstream | gzip > backup.xbstream.gz |
--stats |
选项 | 输出备份统计信息(需配合 --backup 使用)。 |
false |
--stats |
| 高级选项 | ||||
--slave-info |
选项 | 备份从库时记录复制信息(用于构建新从库)。 | false |
--slave-info |
--safe-slave-backup |
选项 | 停止复制线程以确保备份一致性(从库备份时使用)。 | false |
--safe-slave-backup |
--throttle |
选项 | 限制备份时的 I/O 操作速率(单位:IOPS)。 | 0(无限制) |
--throttle=100 |
--version-check |
选项 | 检查 Percona Server 或 MySQL 版本兼容性。 | true |
--version-check=false |
关键参数使用示例
1. 全量备份 + 压缩 + 加密
|
|
2. 增量备份
|
|
3. 准备备份并解压
|
|
补充 安装 qpress 解压缩
qpress 便携式高速文件归档器
当全量备份进行压缩后,在还原时解压需要解压时需要qpress命令
|
|
注意事项
-
加密密钥管理:
- 优先使用
--encrypt-key-file替代--encrypt-key,避免密钥泄露。 - 密钥文件需严格限制权限(如
chmod 600)。
- 优先使用
-
并行与资源占用:
- 高并发(
--parallel、--compress-threads)可能显著增加 CPU 和内存消耗。 - 生产环境中建议根据硬件资源调整。
- 高并发(
-
版本兼容性:
- XtraBackup 2.4 支持 MySQL 5.1~5.7 和 Percona Server 对应版本。
- 确保备份工具与数据库版本匹配。
-
增量备份依赖链:
- 增量备份必须基于完整的全量备份链,恢复时需按顺序合并所有增量。
- 定期清理过时的备份链以节省存储空间。
通过合理组合这些参数,可以实现高效、安全的数据库备份与恢复操作。
七、生产环境数据库备份策略
一、备份频率建议
1. 全量备份频率
- 建议周期:每周 1 次全量备份
- 理由:
- 全量备份是恢复的基础,确保数据的完整性。
- 如果数据量较小(如 TB 级以下),建议每周执行一次全量备份。
- 如果数据量极大(如数十 TB),可延长至每 2 周一次,但需结合增量备份策略降低风险。
- 执行时间:
- 选择业务低峰期(如凌晨)以减少对 I/O 和 CPU 的影响。
- 理由:
2. 增量备份频率
- 建议周期:每日 1 次增量备份
- 理由:
- 增量备份仅捕获自上次全量或增量后的数据变化,资源占用低。
- 每日一次可平衡 RPO(恢复点目标)与存储成本。
- 特殊情况调整:
- 若数据变更频繁(如电商大促期间),可缩短至每小时一次增量备份。
- 若数据变更极少(如静态配置库),可放宽至每 2-3 天一次。
- 理由:
二、备份策略示例
|
|
三、关键注意事项
1. 备份保留策略
- 保留至少 2-3 个全量备份链(如最近 2 周的备份),防止备份损坏或误删。
- 增量备份需与其依赖的全量备份共同保留,确保恢复链完整。
2. 恢复时间优化
- 增量备份链不宜过长(建议不超过 7 次增量),否则恢复时合并时间可能超出 RTO。
- 若增量链过长,可调整全量备份频率(如每 3 天一次全量)。
3. 结合 Binlog 实现精细化恢复
- 启用 MySQL Binlog,按需(如每 5-15 分钟)归档 Binlog 文件。
- 恢复时,先通过 XtraBackup 还原到最近备份点,再通过 Binlog 恢复到精确时间点。
4. 监控与验证
- 监控备份任务状态,确保无失败或遗漏。
- 定期演练恢复流程(如每季度一次),验证备份有效性。
四、典型场景调整建议
| 场景 | 全量备份频率 | 增量备份频率 | 备注 |
|---|---|---|---|
| 小型数据库(< 100GB) | 每周 1 次 | 每日 1 次 | 恢复速度快,资源压力小。 |
| 中型数据库(100GB~1TB) | 每周 1 次 | 每日 1 次(或 12h/次) | 增量频率可根据白天/夜间负载调整。 |
| 大型数据库(> 1TB) | 每周 1 次 | 每日 2-4 次 | 缩短增量间隔,避免单次增量过大。 |
| 超高写入负载数据库 | 每 3 天 1 次 | 每小时 1 次 | 通过更频繁全量备份减少增量链长度。 |
总结
- 核心原则:全量备份频率由数据量和恢复时间容忍度决定,增量备份频率由数据变更速度决定。
- 平衡点:在存储成本、备份资源开销、RTO/RPO 之间找到最佳平衡。
- 动态调整:根据业务周期(如节假日、促销)灵活调整备份策略。
八、关键注意事项
- 定期验证备份:通过恢复测试确保备份有效性。
- 监控备份任务:结合 cron 或工具(如 Rundeck)自动化备份。
- 备份保留策略:保留多个全量+增量备份点,避免单点故障。
- 混合使用策略:XtraBackup + Binlog 提供双重保障,支持时间点恢复(PITR)。
通过合理选择工具和策略,可确保 MySQL 数据的高效备份与可靠恢复。
九、最佳实践
- 始终检查版本兼容性:在升级 MySQL 或 XtraBackup 前,查阅 Percona 官方文档。
- 测试备份恢复流程:在非生产环境验证备份文件的可用性。
- 自动化版本管理:使用 Ansible/Puppet 等工具确保环境版本一致。
- 将被备份数据放到远程数据库主机下:提升安全性