全局锁就是对整个数据库实例加锁,加锁后整个实例就处于只读状态,后续的DML的写语句,DDL语句,已经更新操作的事务提交语句都将被阻塞。
其典型的使用场景是做全库的逻辑备份,对所有的表进行锁定,从而获取一致性视图,保证数据的完整性。
数据备份:将数据库中的数据备份成一个SQL文件,备份到磁盘中。
为什么全库逻辑备份,就需要加全就锁呢?
A. 我们一起先来分析一下不加全局锁,可能存在的问题
假设在数据库中存在这样三张表: tb_stock 库存表,tb_order 订单表,tb_orderlog 订单日志表。
假如说我们要去备份这个数据库中的这三张表数据,而由于在备份的时候,我们的业务系统还不断的在往这个数据库中操作数据、写入数据,此时可能就会产生一下现象
- 在进行数据备份时,先备份了tb_stock库存表。
- 然后接下来,在业务系统中,执行了下单操作,扣减库存,生成订单(更新tb_stock表,插入 tb_order表)。
- 然后再执行备份 tb_order表的逻辑。 业务中执行插入订单日志操作。
- 最后,又备份了tb_orderlog表。
此时备份出来的数据,是存在问题的。因为备份出来的数据,tb_stock表与tb_order表的数据不一致(有最新操作的订单信息,但是库存数没减)。
那如何来规避这种问题呢? 此时就可以借助于MySQL的全局锁来解决。
B. 再来分析一下加了全局锁后的情况
对数据库进行进行逻辑备份之前,先对整个数据库加上全局锁,接下来执行指令mysqldump,mysqldump是MySQL数据库中提供的一个用于数据备份的工具,锁住之后通过这个工具来执行备份操作。一旦加了全局锁之后,其他的DDL、 DML全部都处于阻塞状态,但是可以执行DQL语句,也就是处于只读状态,而数据备份就是查询操作。 那么数据在进行逻辑备份的过程中,数据库中的数据就是不会发生变化的,这样就保证了数据的一致性和完整性。
语法
1). 加全局锁
flush tables with read lock;
2). 数据备份
执行数据备份就可以执行MySQL中给我们提供的一个工具:mysqldump
-u
指定我们备份的时候访问数据库时的用户名-p
指定密码itcast
:你要备份的是哪个数据库>
后面指定我们要把备份的数据存到哪个SQL文件中
PS:mysqldump是MySQL提供的一个工具,它不是SQL语句,所以不要在MySQL的命令行中来执行,而是直接在windows的命令行中执行就行了。
并且如果访问的是远程的数据库,那还需要加上-h参数,后面加上你的主机IP。
执行完毕后,如果有警告,没关系,不影响。
mysqldump -uroot –p1234 itcast > itcast.sql
数据备份的相关指令, 在后面MySQL管理章节, 还会详细讲解.
3). 释放锁
unlock tables;
所以我们要想进行全库的逻辑备份,那么就需要在逻辑备份之前手动的去加上这个全局锁,逻辑备份之后把全局锁释放。一旦加了全局锁,在锁没有被释放之前其他客户端是不能够去更新当前数据库中的数据的,只能读,不能写。
![image-20240720213816838](https://img-blog.csdnimg.cn/img_convert/e58c0dc49b41c215d5c1ae4ad75a26ff.png)