一、简介
全局锁;听名字就知道,是对整个mysql库加锁。
Flush tables with read lock (FTWRL)
当你需要让整个库处于只读状态的时候,可以使用这个命令,之后其他线程的以下语句会被阻塞:数据更新语句(数据的增删改)、数据定义语句(包括建表、修改表结构等)和更新类事务的提交语句。
那全局锁有什么用呢?
答案是:可以备份的时候加上全局锁,那我们备份的时候是不是不希望新数据插进来或者表作出改动。当然我们可以通过业务暂停也能达到目的。但暂停业务似乎比较麻烦呀!那就整这个命令。
说到备份,如果要求的时候不能停摆业务。这个命令似乎不咋好用,因为加上全局锁,这个库就锁了,除了能读,其余啥都干不了咋办呢?
那你有这个问题,别人也肯定有这个问题呀!官方为了解决这个问题,官方开发的的逻辑备份工具mysqldump。当 mysqldump 使用参数–single-transaction 的时候,导数据之前就会启动一个事务,来确保拿到一致性视图。而由于 MVCC 的支持,这个过程中数据是可以正常更新的。
那我又想,已经有这个功能呢?你在整这个全局锁有啥用?问题关键是这个mysqldump备份的时候,首先条件是库里所有表的引擎支持事务,好像引擎里支持事务的没几个吧。这个问题也就想通了。
但是我又开始瞎想了,好像实现库只读,设置set global readonly=true这个也可以呀。研究后发现,set global readonly=true这个命令在客户端发生异常断开后,他竟然依旧是锁着的库只读的。而是用全局锁就不一样了,使用全局锁,除了可以用 unlock tables 主动释放锁,也可以在客户端发生异常后断开,全局锁自动释放,库依旧能读能写。想想还是全局锁要人性化点。