首页/数据/数据库速查/mysqldump 一致性快照(--single-transaction)
备份与恢复56 条

mysqldump 一致性快照(--single-transaction)

InnoDB 场景必备参数:导出前开启 REPEATABLE READ 一致性快照,多表导出期间不锁表,得到同一时间点的数据视图。

数据库速查数据更新于 2026-10-13

一致性快照备份

单事务备份参数是 InnoDB 场景做逻辑备份的必备选项:它在导出开始时开启一个可重复读事务,之后所有表的数据都来自同一个快照,因此导出过程中的写入不会造成表间数据错位,也不会阻塞业务写入。要注意它只对事务引擎生效——库里若仍有 MyISAM 这类非事务表,那部分数据的一致性没有保障。

基本信息

用途不锁表的一致性备份
适用引擎仅 InnoDB,非事务引擎不提供保护
典型命令mysqldump --single-transaction --skip-lock-tables
配合参数逐行读取降低内存占用,导出存储程序与触发器
快照时长从导出开始持续到结束,导出越久保留越久
副作用会让逐表加锁选项失效

典型使用场景

  • 线上库例行备份:不阻塞写入,可以安排在业务时段内执行
  • 主从环境下在从库上做逻辑备份,进一步降低对主库的影响
  • 上线前变更兜底:变更前打一份快照导出作为回退依据
  • 单库迁移到新实例
  • 数据抽样导出到测试环境
  • 需要位点的场景:配合位点参数,备份可继续用于搭建复制

线上标准写法

线上标准写法
mysqldump -uroot -p --single-transaction --skip-lock-tables \
  --quick --routines --events --triggers \
  --default-character-set=utf8mb4 \
  --databases appdb > appdb_$(date +%F).sql   # 按库备份,恢复时可自动建库
grep -c 'CREATE TABLE' appdb_$(date +%F).sql   # 粗略核对导出表数量

备份前检查

备份前检查
SELECT COUNT(*) AS myisam_tables   # 混有非事务引擎表时要单独处理
FROM information_schema.tables
WHERE table_schema='appdb' AND engine <> 'InnoDB';
SHOW VARIABLES LIKE 'transaction_isolation';   # 确认隔离级别符合预期

参数组合与效果

参数作用注意
--single-transaction开启一致性快照,不锁表仅对 InnoDB 生效
--skip-lock-tables显式关闭逐表加锁与快照参数一起用,避免误锁
--quick逐行流式读取大表必备,降低客户端内存占用
--routines --events --triggers导出存储程序与触发器默认不导,最容易被遗漏
--set-gtid-purged控制是否写入 GTID 信息从库恢复前需评估
--flush-logs导出前切换一次二进制日志便于定位位点
--source-data=2把位点写进文件注释8.0.26 起用新名称,旧名仍兼容
备份期间尽量避免在线改表(ALTER、TRUNCATE):DDL 需要元数据锁,可能等住备份进程,也会破坏快照的一致性语义。
该选项只保护事务引擎:库里混有非事务表时,那部分数据仍会被导出期间的写入影响,发现存量非事务表应尽快安排改造。
快照在整个导出期间保持不释放,导出时间越长,实例需要维护的历史版本越多,回滚段与历史链表压力随之上升,备份任务应有人看耗时。

一致性备份检查清单

  • 确认目标表都是事务引擎,非事务表单独安排
  • 导出与恢复使用同一个字符集参数,避免中文乱码
  • 大表导出加逐行读取,避免客户端内存被吃满
  • 导出时段与业务高峰错开,减少 IO 争用
  • 导出后核对表数量与文件大小,并做一次抽样恢复验证
  • 记录备份位点,为后续搭建复制或时间点恢复做准备
在从库上做逻辑备份能显著降低对主库的影响,但要确认从库的复制延迟:延迟过大时备份出来的数据本身就落后于主库,恢复口径要以备份位点为准。

易错点

  • 只写快照参数、忘了显式关闭逐表加锁:某些参数组合下仍会对表加锁,业务写入被阻塞
  • 库里存在非事务引擎表:这部分数据在导出期间被写入,恢复后跨表不一致且很难发现
  • 备份期间执行在线改表:DDL 与备份争抢元数据锁,轻则备份变慢,重则业务与备份互相等待
  • 长时间导出无人监控:快照保留时间过长,历史版本膨胀,实例 IO 与空间压力持续上升
  • 用逻辑备份承担大数据量恢复任务:数据量越大恢复越慢,维护窗口长度无法预估

数据来源与参考

  • MySQL 8.0 Reference Manual: mysqldump --single-transaction

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌