跳转到主内容
新派编程网 - 新潮编程理念,全新技术课堂!

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

XtraBackup 备份时 MySQL 仍可写入,因其对 InnoDB 表采用热备机制(复制 redo log + 物理拷贝),仅在结尾对 MyISAM 表加短暂全局读锁;需确保主库以 InnoDB 为主、fast_shutdown=1、避免 read_only 从库未清理 relay log 等问题。 为什么 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。 MySQL(Linux) MySQL 9.6.0是面向Linux平台的2026年创新版本,核心架构迎来重大革新。其将外键约束与级联操作从InnoDB引擎层上移至SQL层,确保所有数据变更均被完整记录至Binlog,彻底解决了CDC(变更数据捕获)与主从复制中的数据不一致难题。此外,该版本引入container_aware启动选项以原生适配容器环境,并对审计日志进行了组件化重构,为追求极致数据一致性与云原生体验的开发者提供了全新选择。 下载 常见操作链: 全量备份后:
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

相关文章