mysqldump快速备份mysql数据库

1.不锁表的前提

使用 --single-transaction 参数时,mysqldump 会在开始备份之前,执行如下操作:

  1. 开启一个一致性的事务(REPEATABLE READ)
  2. 在该事务内读取数据(全表扫描)来导出数据内容

由于是使用 MVCC(多版本并发控制),所以在 InnoDB 存储引擎下:

  • 不会加锁
  • 不会阻塞写操作
  • 备份数据是一致性的快照

注意事项

  1. 仅适用于 InnoDB 引擎

    • --single-transaction 只能在支持事务的引擎(如 InnoDB)中实现“不锁表”
    • 如果数据库中存在 MyISAM 或其它非事务引擎表,这些表仍会被锁定(会显示为 FLUSH TABLES WITH READ LOCK
  2. 不与 --lock-tables 一起使用

    • 如果同时加了 --lock-tables 参数(默认行为),会对表加读锁
    • 所以要显式排除:--single-transaction --skip-lock-tables
  3. 不能在 DDL 活跃时用

    • 虽然不会锁表,但如果在备份过程中有大量 DDL(如 ALTER、DROP)操作,仍然可能导致备份不一致或失败

2.完整命令

1
2
3
mysqldump -u root -p --single-transaction --skip-lock-tables --quick  dbname > dbname.sql

mysqldump -u root -p --single-transaction --skip-lock-tables --quick --master-data=2 dbname > dbname.sql
  • --quick:边查询边写入文件(降低内存消耗)
  • --master-data=2:适用于主从复制环境,记录 binlog 位置,注释掉在文件中。

3.总结

参数 是否锁表 说明
--single-transaction ❌ 不锁 InnoDB 表 利用事务快照
--lock-tables(默认) ✅ 锁表 会锁 MyISAM 表,影响写入
--single-transaction + --skip-lock-tables ✅ 推荐用法 安全且高效

如你使用的表 全是 InnoDB,用上面推荐方式,mysqldump 是安全、不会锁表的。