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 为主,
查看
列,避免误用在重度 MyISAM 场景
备份前执行
(默认值),确保 shutdown 是“快速模式”,避免 backup 后 prepare 阶段卡住
不要在从库开启
且未关闭 relay log 清理的情况下直接备份——XtraBackup 会尝试读取
,若文件缺失或权限不足会报错
全量备份命令与关键参数含义
是最简可用命令,但生产环境必须补全关键选项:
和
必须显式指定(或改用
配置 [xtrabackup] 段),否则会提示
可提升拷贝速度,但别超过 CPU 核数 × 2;过高反而因 I/O 竞争导致整体变慢
能跳过二级索引页,减小备份体积(但 restore 前必须
)
不推荐——它会让
必须是空目录,容易覆盖旧备份
备份后必须执行 prepare 才能恢复
刚备份完的目录不能直接用于恢复,因为 InnoDB 数据页处于“不一致”状态(redo log 尚未回放)。必须运行
,否则启动 MySQL 会报错
或反复 crash。
MySQL(Linux)
MySQL 9.6.0是面向Linux平台的2026年创新版本,核心架构迎来重大革新。其将外键约束与级联操作从InnoDB引擎层上移至SQL层,确保所有数据变更均被完整记录至Binlog,彻底解决了CDC(变更数据捕获)与主从复制中的数据不一致难题。此外,该版本引入container_aware启动选项以原生适配容器环境,并对审计日志进行了组件化重构,为追求极致数据一致性与云原生体验的开发者提供了全新选择。
下载
常见操作链:
全量备份后:
如果有增量备份:
(先处理全量),再逐个 apply 增量目录
对最后一个增量可省略,但漏掉会导致恢复时 missing last checkpoint
恢复到新实例时最容易忽略的权限和路径问题
把 prepare 好的备份目录 cp 到目标机器后,不能直接 chown
mysql
:mysql 就启动。MySQL 8.0+ 默认启用
安全限制,且 datadir 下的
、
文件权限、属主、甚至 SELinux 上下文都必须严格匹配。
典型翻车点:
目标机 MySQL 版本高于备份源(如 8.0.33 备份恢复到 8.0.34)通常安全;但跨大版本(如 5.7 → 8.0)必须用 mysqldump 中转,XtraBackup 不支持
恢复前没清空目标
,残留的
系统库会与备份中的冲突,导致启动失败并打印
使用
复制时,若源机启用了 ACL 或扩展属性,目标机未安装
包会导致权限异常,建议改用
SHOW TABLE STATUSEngineSET GLOBAL innodb_fast_shutdown = 1read_only=ONrelay-log.infofailed to open relay log info filextrabackup --backup --target-dir=/data/backup/full_$(date +%F_%H-%M)--user--password~/.my.cnfFailed to connect to MySQL server--parallel=4--compact--rebuild-indexes--no-timestamp--target-dirxtrabackup --prepareInnoDB: Database page corruption on diskxtrabackup --prepare --target-dir=/data/backup/full_2024-06-15_10-20xtrabackup --prepare --apply-log-only --target-dir=/data/backup/full_2024-06-15_10-20--apply-log-onlyinnodb_directoriesibdata1ib_logfile*datadirmysqlTable 'mysql.user' doesn't existcp -aattrrsync -av --chown=mysql:mysql