mysqldump --single-transaction 在 mysql 5.7 中仅对 innodb 表实现无锁一致性快照,因依赖 mvcc;对 myisam 表无效,遇混合引擎会退化为锁表,故非真正热备。

mysqldump 在 MySQL 5.7 中不是真正意义上的热备份工具,但它能在 InnoDB 表上实现近似热备的效果——前提是正确使用 --single-transaction,且数据库中不含 MyISAM 表或混合引擎时需额外处理。
为什么 mysqldump --single-transaction 不等于“完全热备”
--single-transaction 依赖 InnoDB 的 MVCC 机制,在导出开始时启动一个一致性快照事务,后续所有读操作都基于该快照。这意味着:
- 导出过程中,InnoDB 表可正常读写,不锁表;
- 但该选项对 MyISAM 表无效(MyISAM 不支持事务),遇到 MyISAM 表时
mysqldump会自动退回到--lock-tables模式,全局加读锁,写操作会被阻塞; - 如果库中混用引擎(比如
mysql系统库含 MyISAM 表),整个 dump 过程仍可能触发锁表,实际变成“准冷备”。
常见错误现象:mysqldump 执行时业务写入明显卡顿、慢查询陡增,甚至超时,大概率是碰到了 MyISAM 表或未显式指定 --single-transaction。
只对 InnoDB 表做真正无锁导出的实操条件
要让 mysqldump 在 5.7 中尽可能“热”:
- 必须确保目标库/表全部为 InnoDB 引擎(可用
SELECT TABLE_SCHEMA, TABLE_NAME, ENGINE FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'your_db';验证); - 显式加上
--single-transaction,不能省略; -
禁用
--lock-tables(默认开启,会覆盖--single-transaction); - 避免同时使用
--master-data=2和--single-transaction以外的锁类参数(如--lock-all-tables); - 若需导出存储过程/触发器,追加
--routines --triggers即可,它们不破坏事务一致性。
示例命令:
mysqldump -uroot -p --single-transaction --routines --triggers --set-gtid-purged=OFF mydb > mydb_$(date +%Y%m%d).sql
注意:--set-gtid-purged=OFF 是为了防止恢复时 GTID 冲突,尤其在非 GTID 环境或仅做本地备份时推荐关闭。
混合引擎下如何最小化影响
一旦发现库中存在 MyISAM 表(比如 mysql、performance_schema 库中的部分表,或业务自建的 MyISAM 表):
- 不要强行去掉
--lock-tables,否则导出数据可能不一致; - 可考虑分库导出:把纯 InnoDB 的业务库用
--single-transaction,MyISAM 表所在的库(如仅含日志类小表)单独用--lock-tables快速导出; - 或提前转换表引擎:
ALTER TABLE tbl_name ENGINE=InnoDB;(需评估锁表时间与业务容忍度); -
mysqldump --all-databases默认会锁所有表,除非你确认所有库都无 MyISAM,否则不建议直接使用。
另一个容易被忽略的点:即使只 dump 一张 InnoDB 表,如果该表上有正在执行的 ALTER TABLE 或长事务未提交,--single-transaction 仍可能被阻塞,导致 dump 延迟甚至失败——这时需检查 INFORMATION_SCHEMA.INNODB_TRX。
备份后验证一致性比“是否锁表”更重要
真正决定一次备份能否用于恢复的,不是它“热不热”,而是导出内容是否满足一致性要求:
- 检查输出 SQL 文件开头是否有
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ和START TRANSACTION; - 对比导出前后
SELECT COUNT(*)和关键字段校验和(如CRC32(CONCAT(...))); - 若启用
--master-data=2,确认注释里 binlog 位点是否合理(CHANGE MASTER TO MASTER_LOG_FILE='xxx', MASTER_LOG_POS=yyy;); - 大库导出后别急着删源文件,先用
mysql -e "CHECK TABLE tbl_name;"在恢复环境快速验表结构。
InnoDB 的一致性快照只保证逻辑一致性,不保证物理连续性;而真正的热备(如 Percona XtraBackup)能复制 ibd 文件并重放 redo。对 5.7 来说,mysqldump --single-transaction 是成本最低的“够用”方案,但它的边界必须清楚——一旦跨出 InnoDB+无长事务+无 MyISAM 的三角区,就不再是热备。











