MySQL的锁及数据备份
1. 锁的分类
1.1 全局锁
数据库备份时要使用全局锁,来保证数据的一致性
加全局锁:flush tables with read lock;
数据库备份:mysqldump -h host -u root -p db_name > db_name.sql
释放全局锁:unlock tables;

给整个库加锁会导致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会被阻塞,直到当前客户端释放读锁。总之,读锁不阻塞读,阻塞写。

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

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语句对应的元数据锁:

1.2.3 意向锁
1.3 行级锁