mysqldump快速备份mysql数据库
1.不锁表的前提
使用 --single-transaction 参数时,mysqldump 会在开始备份之前,执行如下操作:
- 开启一个一致性的事务(REPEATABLE READ)
- 在该事务内读取数据(全表扫描)来导出数据内容
由于是使用 MVCC(多版本并发控制),所以在 InnoDB 存储引擎下:
- 不会加锁
- 不会阻塞写操作
- 备份数据是一致性的快照
注意事项
仅适用于 InnoDB 引擎
--single-transaction只能在支持事务的引擎(如 InnoDB)中实现“不锁表”- 如果数据库中存在 MyISAM 或其它非事务引擎表,这些表仍会被锁定(会显示为
FLUSH TABLES WITH READ LOCK)
不与
--lock-tables一起使用- 如果同时加了
--lock-tables参数(默认行为),会对表加读锁 - 所以要显式排除:
--single-transaction --skip-lock-tables
- 如果同时加了
不能在 DDL 活跃时用
- 虽然不会锁表,但如果在备份过程中有大量 DDL(如 ALTER、DROP)操作,仍然可能导致备份不一致或失败
2.完整命令
1 | mysqldump -u root -p --single-transaction --skip-lock-tables --quick dbname > dbname.sql |
--quick:边查询边写入文件(降低内存消耗)--master-data=2:适用于主从复制环境,记录 binlog 位置,注释掉在文件中。
3.总结
| 参数 | 是否锁表 | 说明 |
|---|---|---|
--single-transaction |
❌ 不锁 InnoDB 表 | 利用事务快照 |
--lock-tables(默认) |
✅ 锁表 | 会锁 MyISAM 表,影响写入 |
--single-transaction + --skip-lock-tables |
✅ 推荐用法 | 安全且高效 |
如你使用的表 全是 InnoDB,用上面推荐方式,mysqldump 是安全、不会锁表的。