全局锁
全局锁: 顾名思义,全局锁就是对整个数据库实例加锁。MySQL 提供了一个加全局读锁的方法,命令是 Flush tables with read lock (FTWRL)。
FTWRL 前有读写的话 ,FTWRL 都会等待读写执行完毕后才执行。FTWRL 执行的时候要刷脏页的数据到磁盘,因为要保持数据的一致性,理解的执行 FTWRL 时候是所有事务都提交完毕的时候。
全局锁的风险
添加全局锁后存在一定风险:
- 如果对主库添加全局锁,那么业务停摆。
- 如果对从库添加全局锁,备份期间不能执行 binlog,导致主从延迟。
全局锁的作用 —— 数据库备份 TODO
MyISAM 不支持 RR,需要加全局锁才可以进行数据库备份。
官方自带的逻辑备份工具是 mysqldump。当 mysqldump 使用参数 –single-transaction 的时候,导数据之前就会启动一个事务,来确保拿到一致性视图。而由于 MVCC 的支持,这个过程中数据是可以正常更新的。
有了这个功能,为什么还需要 FTWRL 呢?一致性读是好,但前提是引擎要支持这个隔离级别。比如,对于 MyISAM 这种不支持事务的引擎,如果备份过程中有更新,总是只能取到最新的数据,那么就破坏了备份的一致性。这时,我们就需要使用 FTWRL 命令了。
既然全局只读,为什么不设置 set global readonly=true?原因为:
- 在有些系统中,readonly 的值会被用来做其他逻辑,比如用来判断一个库是主库还是备库。
- 执行 FTWRL 命令之后由于客户端发生异常断开,那么 MySQL 会自动释放这个全局锁。而 readonly 的话,还是处于 readonly 状态。