全局锁
January 2, 2023About 2 min
全局锁
对整个数据库实例加锁,加锁以后整个实例处于只读状态,后续的 DML 写操作、DDL 语句,以及更新操作的事物提交语句都将被阻塞。
典型使用场景:全库的逻辑备份,对所有表进行锁定,从而获取一致性视图,保证数据的完整性。
语法
加锁语句:
flush tables with read lock;
释放锁:
unlock tables;
数据库备份
mysqldump -uroot -p1234 itcast > itcast.sql
特点
数据库中加全局锁,是一个比较重的操作,存在以下问题:
- 如果再主库上备份,那么在备份期间都不能执行更新,业务基本上就得停摆。
- 如果在从库上备份,那么在备份期间从库不能执行主库同步过来的二进制日志(binlog),会导致主从延迟。
解决方案
在 InnoDB 引擎中,可以在备份时加上参数--single-transaction
来完成不加锁的一致性备份,通过快照读实现的。
InnoDB 引擎支持的事务支持可重复读的隔离级别,那么在备份数据库之前先开启事务,会先创建 Read View,然后整个事务执行期间都在用这个 Read View,而且由于 MVCC 的支持,备份期间业务依然可以对数据进行更新操作。
因为在可重复读的隔离级别下,即使其他事务更新了表的数据,也不会影响备份数据库时的 Read View,这就是事务四大特性中的隔离性,这样备份期间备份的数据一直是在开启事务时的数据。
备份数据库的工具是 mysqldump,在使用 mysqldump 时加上 –single-transaction
参数的时候,就会在备份数据库之前先开启事务。这种方法只适用于支持「可重复读隔离级别的事务」的存储引擎。
InnoDB 存储引擎默认的事务隔离级别正是可重复读,因此可以采用这种方式来备份数据库。
对于 MyISAM 这种不支持事务的引擎,在备份数据库时就要使用全局锁的方法。