mysql如何使用XtraBackup进行热备份_mysql高效备份工具

来源:这里教程网 时间:2026-02-28 20:52:30 作者:

为什么 XtraBackup 备份时 MySQL 还能正常写入

因为 XtraBackup 通过复制 InnoDB 的 redo log 并结合数据文件的物理拷贝实现热备,全程不锁表(对 InnoDB 表),只在备份结束前对非 InnoDB 表(如 MyISAM)加短暂 FLUSH TABLES WITH READ LOCK。这意味着业务连接持续可用,但要注意:如果实例中存在大量 MyISAM 表,这个锁等待可能明显拖慢备份完成时间。

实操建议:

确认主库引擎以 InnoDB 为主,
SHOW TABLE STATUS
查看
Engine
列,避免误用在重度 MyISAM 场景
备份前执行
SET GLOBAL innodb_fast_shutdown = 1
(默认值),确保 shutdown 是“快速模式”,避免 backup 后 prepare 阶段卡住
不要在从库开启
read_only=ON
且未关闭 relay log 清理的情况下直接备份——XtraBackup 会尝试读取
relay-log.info
,若文件缺失或权限不足会报错
failed to open relay log info file

全量备份命令与关键参数含义

xtrabackup --backup --target-dir=/data/backup/full_$(date +%F_%H-%M)
是最简可用命令,但生产环境必须补全关键选项:

--user
--password
必须显式指定(或改用
~/.my.cnf
配置 [xtrabackup] 段),否则会提示
Failed to connect to MySQL server
--parallel=4
可提升拷贝速度,但别超过 CPU 核数 × 2;过高反而因 I/O 竞争导致整体变慢
--compact
能跳过二级索引页,减小备份体积(但 restore 前必须
--rebuild-indexes
--no-timestamp
不推荐——它会让
--target-dir
必须是空目录,容易覆盖旧备份

备份后必须执行 prepare 才能恢复

刚备份完的目录不能直接用于恢复,因为 InnoDB 数据页处于“不一致”状态(redo log 尚未回放)。必须运行

xtrabackup --prepare
,否则启动 MySQL 会报错
InnoDB: Database page corruption on disk
或反复 crash。

常见操作链:

全量备份后:
xtrabackup --prepare --target-dir=/data/backup/full_2024-06-15_10-20
如果有增量备份:
xtrabackup --prepare --apply-log-only --target-dir=/data/backup/full_2024-06-15_10-20
(先处理全量),再逐个 apply 增量目录
--apply-log-only
对最后一个增量可省略,但漏掉会导致恢复时 missing last checkpoint

恢复到新实例时最容易忽略的权限和路径问题

把 prepare 好的备份目录 cp 到目标机器后,不能直接 chown mysql:mysql 就启动。MySQL 8.0+ 默认启用

innodb_directories
安全限制,且 datadir 下的
ibdata1
ib_logfile*
文件权限、属主、甚至 SELinux 上下文都必须严格匹配。

典型翻车点:

目标机 MySQL 版本高于备份源(如 8.0.33 备份恢复到 8.0.34)通常安全;但跨大版本(如 5.7 → 8.0)必须用 mysqldump 中转,XtraBackup 不支持 恢复前没清空目标
datadir
,残留的
mysql
系统库会与备份中的冲突,导致启动失败并打印
Table 'mysql.user' doesn't exist
使用
cp -a
复制时,若源机启用了 ACL 或扩展属性,目标机未安装
attr
包会导致权限异常,建议改用
rsync -av --chown=mysql:mysql

相关推荐