首页/数据/数据库速查/mysqldump 锁与流式导出(--quick / --lock-tables)
备份与恢复56 条

mysqldump 锁与流式导出(--quick / --lock-tables)

--quick 逐行流式导出不缓存整个结果集,大表必开;--lock-tables 与 --single-transaction 语义冲突,线上备份应跳过锁表。

数据库速查数据更新于 2026-10-13

锁与流式导出选项

两个外观不起眼但影响巨大的选项:流式导出让客户端不把整个结果集读进内存,大表必备;锁表选项决定导出期间是否阻塞写入。线上备份应与一致性快照选项配合并显式跳过锁表,避免业务写入被卡住。

基本信息

流式导出--quick 简写 -q,逐行读取不缓存整个结果集
锁表--lock-tables 导出前锁住所有表
跳过锁表--skip-lock-tables 明确声明不锁表
一致性--single-transaction 借助事务快照保证一致性
隐含关系默认选项组合中隐含了锁表行为,需要显式覆盖

典型使用场景

  • 在线库逻辑备份:事务快照加跳过锁表,导出期间业务写入不受影响
  • 大表导出:必须开启流式导出,否则客户端内存会成倍增长
  • 无法停写的小表导出:锁表导出更快但要评估阻塞窗口是否可接受
  • 非事务引擎表:无法用事务快照保证一致性,只能接受锁表方案
  • 备份脚本标准化:把推荐组合固化为脚本模板,避免个人习惯差异

线上推荐组合

线上推荐组合
# 一致性快照 + 不锁表 + 流式导出,适合在线库
mysqldump -uroot -p --single-transaction --skip-lock-tables --quick \
  --routines --events --databases appdb > appdb.sql
# 单表导出并压缩,减少磁盘占用
mysqldump -uroot -p --single-transaction --skip-lock-tables --quick appdb orders \
  | gzip > orders_$(date +%F).sql.gz
# 确认导出文件结尾完整(应有完成标记)
tail -3 appdb.sql

选项组合对照

组合写入影响数据一致性
事务快照加跳过锁表几乎无影响同一快照内一致,适合事务引擎
锁表导出导出期间写入阻塞强一致,但阻塞窗口随表大小增长
默认组合隐含锁表,容易忽略老脚本常见,迁移前要复核
无一致性选项无影响表之间数据可能不一致,不建议
一致性快照会自动关闭锁表行为,但显式写出跳过锁表能让备份意图更清晰,便于他人复核脚本。
用事务快照导出但库里混有非事务引擎的表:这类表的数据不受快照保护,导出的结果可能不一致。

易错点

  • 忘记流式导出导大表:客户端内存暴涨,甚至被系统杀掉留下半截备份文件
  • 混用锁表与事务快照:语义互相覆盖,实际行为与预期不符
  • 非事务引擎表使用事务快照:以为数据一致,实际仍可能出现表间不一致
  • 不检查导出文件结尾:半截文件也能生成,恢复时才发现数据缺失

数据来源与参考

  • MySQL 8.0 Reference Manual: mysqldump --quick

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌