锁与流式导出选项
两个外观不起眼但影响巨大的选项:流式导出让客户端不把整个结果集读进内存,大表必备;锁表选项决定导出期间是否阻塞写入。线上备份应与一致性快照选项配合并显式跳过锁表,避免业务写入被卡住。
基本信息
| 流式导出 | --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选项组合对照
| 组合 | 写入影响 | 数据一致性 |
|---|---|---|
| 事务快照加跳过锁表 | 几乎无影响 | 同一快照内一致,适合事务引擎 |
| 锁表导出 | 导出期间写入阻塞 | 强一致,但阻塞窗口随表大小增长 |
| 默认组合 | 隐含锁表,容易忽略 | 老脚本常见,迁移前要复核 |
| 无一致性选项 | 无影响 | 表之间数据可能不一致,不建议 |
一致性快照会自动关闭锁表行为,但显式写出跳过锁表能让备份意图更清晰,便于他人复核脚本。
用事务快照导出但库里混有非事务引擎的表:这类表的数据不受快照保护,导出的结果可能不一致。