首页/数据/备份与容灾速查/mysqldump 一致性快照备份
数据库与云备份56 条

mysqldump 一致性快照备份

用 --single-transaction 在可重复读事务里导出 InnoDB,得到一致时间点快照且不阻塞写入;MyISAM 等非事务表不受该保护。

备份与容灾速查数据更新于 2026-10-13

一致性快照备份是什么

--single-transaction 让 mysqldump 在一个可重复读事务里读取数据,导出期间看到的是事务开始那一刻的一致快照,因此不需要长时间锁表,InnoDB 表的写入也不受影响。前提是被导出的表都在事务引擎上,MyISAM 这类非事务表不受该机制保护。

基本信息

原理开启事务并读取一致性快照,导出过程走 MVCC 读视图
适用InnoDB 等事务引擎
不适用MyISAM、MEMORY 等非事务表仍可能不一致
常见搭配--source-data=2 记录位点,--routines 与 --events 补全对象

一致性热备

一致性热备
mysqldump -u root -p --single-transaction --source-data=2 \
  --routines --events --triggers \
  --databases appdb > appdb-consistent-$(date +%F).sql
# 产物开头可见位点注释,供后续从该坐标回放 binlog
grep -n "CHANGE REPLICATION SOURCE TO" appdb-consistent-$(date +%F).sql

相关参数对照

参数作用注意
--single-transaction走事务快照,不锁表仅对事务引擎有效
--lock-all-tables全局读锁保证一致会阻塞写入,不用于在线库
--source-data=2记录位点取位点时短暂加锁
--flush-logs导出前切换日志文件便于把归档切在备份点之后

使用要点

  • 导出时长越长,回滚段与历史版本保留压力越大,大实例应安排在业务低峰
  • 导出期间不要执行 DDL:建表删表会隐式提交,破坏快照一致性
  • 临时表与混合引擎的库要单独确认:非事务表在快照之外仍可能被改动
  • 与其他参数组合时注意顺序与互斥关系,例如与加锁选项同时使用不会得到预期效果
  • 导出完成后立即核对产物大小与关键表是否存在,避免得到一份看似正常的空文件
导出期间避免对目标库执行 DDL(ALTER、DROP 等),DDL 会隐式提交并破坏快照一致性,得到的产物可能跨越多个时间点。
该参数与 binlog 位点记录配合,才构成可以做时间点恢复的完整逻辑备份;只有数据没有位点时,恢复精度只能到备份完成时刻。

不适用与该避开的情形

  • 库中混有 MyISAM 表:这些表在导出期间仍可能被修改,得到不一致数据
  • 需要导出系统库或权限表:这类表自身不是 InnoDB,应单独处理
  • 正在进行结构变更:DDL 提交会打断快照,变更应与备份错峰安排
  • 实例上存在超长事务:会显著拉长历史版本链,加剧回滚段占用

易错点

  • 长备份事务会推高 undo 保留与历史版本读压力,大实例应选低峰执行
  • 对混合引擎库只靠该参数无法覆盖 MyISAM 表的一致性
  • 导出期间执行 DDL 会破坏快照,产物跨时间点且难以察觉
  • 误以为不锁表就没有任何影响:取位点与 flush logs 阶段仍会有短暂停顿

数据来源与参考

  • MySQL 8.0 Reference Manual(mysqldump --single-transaction)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌