可不锁库,前提是主库全为InnoDB表并加--single-transaction;该参数依赖MVCC创建一致性快照,避免阻塞写入,但要求无DDL操作且MySQL≥5.6。

可以做到不锁库,但前提是主库所有表都用 InnoDB 引擎,且必须加 --single-transaction;否则 mysqldump 会默认触发全局读锁(FLUSH TABLES WITH READ LOCK),导致写入阻塞。
为什么 --single-transaction 能避免锁库
该参数依赖 InnoDB 的 MVCC 机制,在 dump 开始时发起一个一致性快照事务,后续所有表读取都基于这个快照。整个过程不阻塞 INSERT/UPDATE/DELETE,但要求:
• 所有参与导出的表必须是 InnoDB(MyISAM 表仍会被锁)
• dump 过程中不能执行 ALTER TABLE、DROP TABLE、TRUNCATE TABLE 等 DDL,否则快照可能失效
• MySQL 版本需 ≥ 5.6(推荐 5.7+ 或 8.0)
--master-data=2 和 --single-transaction 必须同时用
单独用 --master-data 会隐式启用 --lock-all-tables,反而锁库;而加上 --single-transaction 后,--master-data 就改用事务快照获取 binlog 位置,不再锁表。
• --master-data=1:导出文件开头直接写 CHANGE MASTER TO ... 语句
• --master-data=2:该语句被注释掉,更安全,推荐使用
• 实际命令示例:mysqldump -h127.0.0.1 -P3306 -uroot -p --all-databases --single-transaction --master-data=2 > full_backup.sql
从库导入后配置复制时,binlog 位置从哪来
导出文件(如 full_backup.sql)开头几行就藏着关键信息,用 head -n 30 full_backup.sql | grep "CHANGE MASTER" 就能快速定位:
• 它不是备份时刻的实时 position,而是事务启动瞬间的 binlog file 和 position
• 这个位置和数据完全一致,可直接用于 CHANGE MASTER TO
• 注意:导入前从库必须已配置好 server-id、开启 log_bin,且未启动复制(slave_io_running 和 slave_sql_running 都为 No)
真正容易被忽略的是:即使用了 --single-transaction,如果主库混有 MyISAM 表,或者备份期间有人执行了 DDL,dump 仍可能退化为锁表模式——得检查导出文件里有没有 FLUSH TABLES WITH READ LOCK 这行,有就说明没躲开锁。


















