--single-transaction是mysqldump针对InnoDB表的无锁备份机制,通过MVCC创建一致性快照实现不阻塞写入;但仅对InnoDB有效,遇MyISAM表、长事务或冲突参数(如--lock-all-tables)会退化为锁表。

mysqldump --single-transaction 是什么
--single-transaction 是 mysqldump 针对 InnoDB 表提供的逻辑备份选项,它通过在备份开始时启动一个一致性快照(基于 MVCC),让整个导出过程在同一个事务视图下进行。这意味着:不锁表、不阻塞写入、也不要求停业务。
但它只对 InnoDB 有效;对 MyISAM 表会自动退化为加全局读锁(FLUSH TABLES WITH READ LOCK),此时写操作会被阻塞——这点极易被忽略。
为什么加了 --single-transaction 还会卡住写入
常见错误现象:mysqldump --single-transaction -u root -p mydb > backup.sql 执行后,应用突然报“Lock wait timeout”或写请求明显变慢。
- MyISAM 表混在库中:哪怕只有一个 MyISAM 表,
--single-transaction就失效,mysqldump会尝试加全局读锁 - 长事务未结束:如果备份开始前已有长时间运行的事务(比如未提交的
UPDATE或SELECT ... FOR UPDATE),MVCC 快照无法清理旧版本,会导致 undo log 膨胀、备份变慢甚至失败 - 显式使用了
--lock-tables或--lock-all-tables:这两个参数和--single-transaction冲突,优先级更高,会直接覆盖掉无锁行为
正确使用 --single-transaction 的实操要点
确保真正实现无锁,需同时满足以下条件:
- 目标库中所有表必须是 InnoDB 引擎(可用
SELECT table_name, engine FROM information_schema.tables WHERE table_schema = 'mydb';检查) - 命令中不能出现
--lock-tables、--lock-all-tables、--master-data(除非搭配--single-transaction且 MySQL ≥5.6.5;否则--master-data会隐式触发锁) - 避免在业务高峰执行;提前 kill 掉滞留的长事务(查
SELECT * FROM information_schema.INNODB_TRX;) - 若需包含 binlog 位置(如用于主从搭建),用
--single-transaction --master-data=2,MySQL 5.6.5+ 已优化该组合的锁行为
典型安全命令:mysqldump --single-transaction --routines --triggers -u root -p mydb > mydb.sql
备份大库时 --single-transaction 的隐藏代价
无锁 ≠ 无开销。它依赖 MVCC 快照,对内存和磁盘 I/O 有实际压力:
- 备份期间所有被修改过的数据页版本都保留在 undo log 中,可能引发
ibdata1突增或磁盘写满 - 导出速度受事务快照生成时刻的数据库负载影响,不是“越快越好”,而是“越稳越准”——尤其当备份耗时超过几十分钟时
- 不适用于需要精确到秒级 RPO 的场景;因为快照时间点是 START TRANSACTION 的那一刻,之后的写入不会进备份
真正关键的不是“有没有加参数”,而是确认引擎类型、检查长事务、避开锁冲突参数——这三步漏掉任何一项,--single-transaction 就只是个摆设。


















