MySQL的锁及数据备份

2022-10-24  本文已影响0人  大鱼馆长

1. 锁的分类

1.1 全局锁

数据库备份时要使用全局锁,来保证数据的一致性

加全局锁:flush tables with read lock;
数据库备份:mysqldump -h host -u root -p db_name > db_name.sql
释放全局锁:unlock tables;

图1. 全局锁示意图

给整个库加锁会导致DML操作被阻塞,影响业务。InnoDB存储引擎可以用--single-transaction参数来实现不加锁的数据库备份,同时保证数据一致性,底层实现原理是数据库快照:

mysqldump --single-transaction -h host -u root -p db_name > db_name.sql

单纯备份一张表的命令如下:

数据表备份:mysqldump -h host -u root -p db_name table_name > table_name.sql

当访问本地MySQL实例时,不用-h参数。

1.2 表级锁

每次操作锁住整张表。锁定粒度大,发生锁冲突的概率高,并发度低,InnoDB,MyISAM存储引擎都支持表锁。
表级锁主要分三类:

1.2.1 表锁

加锁语法:lock tables table_name read/write;
释放锁语法:unlock tables; (或者断开客户端连接)

表共享读锁(read lock):简称读锁,获得锁的当前客户端和其它客户端都只能读取(DQL)表数据,不能操作(DDL/DML)表数据。其它客户端的DDL和DML会被阻塞,直到当前客户端释放读锁。总之,读锁不阻塞读,阻塞写

图2. 读锁示意图

表独占写锁(write lock):简称写锁,获得锁的当前客户端既可以读,也可以写,其他客户端的读写都被阻塞。总之,获得写锁的客户端独占读和写权限

图3. 写锁示意图
1.2.2 元数据锁(meta data lock, MDL)

在访问一张表的数据时,系统会自动加上元数据锁,不需要显式加锁。当一张表上存在活动事务时,元数据锁确保不能修改表元数据,即阻塞其他客户端对表的alter操作。总之,元数据锁就是为了避免DDL和DML冲突,保证读写的正确性

当对表执行增删改查(DML/DQL)时,系统给表加元数据共享锁(SHARED_READ/SHARED_WRITE);当执行DDL时,系统给表加上元数据独占锁(EXCLUSIVE)。

查询元数据锁的SQL语句:

select object_type,object_schema, object_name,lock_type, lock_duration from performance_schema.metadata_locks;

下面是不同SQL语句对应的元数据锁:


图4. 不同SQL语句对应的元数据锁,及不同元数据所之间的兼容关系

1.2.3 意向锁
1.3 行级锁

上一篇 下一篇

猜你喜欢

热点阅读