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_name | score |
|---|---|
| 大翔 | 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 重放到这个 LSNlock_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 版本
下一章引子:每天全量备份大库仍然耗时,增量备份只复制变化的数据页,能大幅缩短备份窗口。