全局锁应用场景理解
把数据库想象成一座“24 小时营业的大型仓库”。
• 平时:很多叉车(事务)各搬各的货,互不干扰。
• 特殊时刻:需要“整库盘点”或“整体搬迁”——这时就得给仓库大门上 一把大铁锁(全局锁),让所有叉车 全部停工,确保里面没有一件货在移动,才能安全做全量操作。
这就是 全局锁 的典型应用场景:
“需要数据库处于完全静止状态的大动作”。
具体 3 大场景:
-
逻辑全库备份(mysqldump --all-databases --single-transaction 失效时)
场景:MyISAM 这类不支持一致性快照的引擎。
做法:FLUSH TABLES WITH READ LOCK
(FTWRL)——给整库加全局读锁,所有写事务卡住,然后拷贝数据文件。
直观:仓库关门,只让外面拍照,不许叉车进出。 -
全库物理冷备(xtrabackup 全量备份 InnoDB 前)
场景:需要拿到完全一致的 binlog 位点和文件系统快照。
做法:备份工具会短暂请求全局读锁,冻结写入,拷贝非 InnoDB 表(如 MyISAM)和 binlog 信息。
直观:让所有叉车暂停 1 分钟,迅速拍下仓库全景。 -
主从切换前的“一致性校验”或“全局 DDL”
场景:对整库做一致性校验(pt-table-checksum),或一次性改所有表结构。
做法:加全局锁,保证校验或 DDL 期间没有任何数据变更,防止结果不一致。
直观:盘点前贴封条,任何人不许搬货。
一句话总结
全局锁 = “仓库停业整顿”的锁,只有在做 整库级、无法逐行/逐表处理 的重量级操作时才会拿出来用;平时业务运行几乎见不到它。