Navicat导出时锁表是因为其GUI默认隐式加锁以保证一致性,尤其在“结构+数据”导出时易触发FLUSH TABLES WITH READ LOCK;唯一可靠解是命令行用mysqldump --single-transaction(仅InnoDB有效),GUI中只能取消“锁定表”等选项规避。
Navicat导出时为什么会锁表
默认情况下,navicat 的「导出向导」或「转储sql文件」对 mysql(innodb)会隐式执行 select 操作,而如果没加事务控制,某些导出路径(尤其是勾选了「锁定表」或使用老版本驱动)可能触发 flush tables with read lock 或全表扫描级的隐式锁。这不是你写的 sql 锁了表,而是 navicat 内部为保证一致性做的兜底行为——尤其在「结构+数据」一起导出时容易激活。
用 --single-transaction 绕过锁表(仅 InnoDB)
真正起效的方式是跳过 GUI,改用命令行调用 mysqldump,并显式传参:
mysqldump --single-transaction --no-create-info -u user -p db_name table_name > data.sql
-
--single-transaction是核心:它在导出开始时启动一个 REPEATABLE READ 事务,后续所有SELECT都基于该快照,不阻塞写入 -
--no-create-info可选:只导数据,避免重复生成CREATE TABLE - 该参数对 MyISAM 无效(MyISAM 本就不支持事务),必须搭配 InnoDB 引擎
- Navicat 自带的「转储SQL文件」界面里没有暴露这个开关,GUI 里勾选「仅数据」仍可能锁表
GUI 中能做的最小干预
如果你必须用 Navicat 界面操作,以下设置可降低锁风险:
- 导出前确认表引擎:
SHOW CREATE TABLE table_name,确保是ENGINE=InnoDB - 在「转储SQL文件」向导中,取消勾选「锁定表」(Lock Tables),这是最直接的 UI 开关
- 不要勾选「导出触发器」「导出存储过程」:这些对象导出时会额外执行
SHOW TRIGGERS等元数据查询,部分场景下会加剧锁竞争 - 若导出大表且允许脏读(如报表快照),可在自定义查询中手动加
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;,再执行SELECT→ 导出结果
哪些操作根本不会锁表
真正安全的导出路径,本质是绕过 Navicat 的「一致性快照」逻辑:
- 右键表名 →「导出向导」→ 选择格式为
CSV或XLSX→ 在第 3 步勾选「按记录数分批」:此时 Navicat 使用流式拉取,不开启事务,也不锁表 - 新建查询 → 写
SELECT * FROM t WHERE ...→ 点运行 → 右键结果网格 →「导出结果」:只要没勾选「导出全部记录」且结果集未全加载,就不会触发全表扫描锁 - 用「数据传输」功能同步到另一个库:底层走的是 INSERT...SELECT 流程,不依赖源端锁表
锁表与否,关键不在“导出”动作本身,而在 Navicat 是否为了数据一致性主动申请了全局或表级读锁。InnoDB 下,--single-transaction 是唯一可靠解;GUI 里只能尽量规避触发锁的路径,没法彻底消除风险。


















