SET autocommit=0 是 mysqldump 工具默认添加的,用于保障导入原子性;--skip-autocommit 仅跳过写入该语句,不移除 START TRANSACTION 和结尾 COMMIT;彻底禁用需用 --skip-opt 或导出后手动删除相关语句。
导出 SQL 时 SET autocommit=0 是谁加的?
不是你写的,也不是 mysql 客户端主动加的——是 mysqldump 工具默认行为。只要没显式关掉,它就会在导出文件开头插入 set autocommit=0 和配套的 commit,目的是让整个导入过程原子化:要么全成功,要么全失败(配合事务表引擎如 innodb)。
mysqldump --skip-autocommit 真的能去掉它?
不能。这个参数名有误导性:--skip-autocommit 实际上只是跳过在 dump 文件里写 SET autocommit=0,但**不保证导入时自动提交关闭**;更重要的是,它不会移除 START TRANSACTION 和结尾的 COMMIT,所以事务控制逻辑依然存在。
真正有效的做法只有两个:
-
mysqldump --skip-extended-insert --skip-triggers --skip-routines --no-create-info --compact这类组合无法禁用 autocommit,别试 - 想彻底去掉所有事务包装,必须用
--skip-opt(等价于关闭一堆默认选项),再手动补回你需要的(比如--add-drop-table) - 最稳的方式:导出后用
sed或脚本删掉那几行 ——SET autocommit=0、START TRANSACTION、结尾的COMMIT
为什么有些导入会报 ERROR 1093 (HY000) 或锁表失败?
因为 SET autocommit=0 + START TRANSACTION 让整个导入变成一个长事务。如果导出文件里有大表、大批量 INSERT,或目标库用了 MyISAM(不支持事务),就会卡住、锁表、甚至触发超时。
常见症状:
- 导入中途被 kill,但表数据只进了一半
- 执行
SHOW PROCESSLIST看到状态卡在Updating或Writing to net - 错误信息里出现
Lock wait timeout exceeded或Deadlock found
这时不是“禁用 autocommit”就能解决,而是要拆事务:用 --skip-extended-insert 让每条 INSERT 独立提交(前提是服务端 autocommit=1),或者分表导出。
MySQL 8.0+ 的 mysqldump 默认更激进了
新版默认加了 SET NAMES utf8mb4、SET FOREIGN_KEY_CHECKS=0,还可能带 /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */ 这类兼容头。这些和 autocommit 无关,但一起出现时容易误判源头。
验证方法很简单:
- 导出小库:
mysqldump -u root test t1 > t1.sql - 搜第一行:
head -n 5 t1.sql,看有没有SET autocommit=0 - 加
--skip-opt再导一次对比
别信文档里“--disable-autocommit”这种不存在的参数,MySQL 官方没这玩意儿。










