以前对Mysql的锁的认识,只了解表锁和行锁,其实Mysql的锁的种类还是不少的,有全局锁,表级锁,行级锁,还有元数据锁,间隙锁,临界锁。
一 全局锁
Mysql的全局锁是对整个实例加锁,加锁之后,数据库整体处于只读状态,数据上不能执行增删改,元数据上不能执行新建表,更新表;不能提交事务。 命令:
# 给Mysql 加全局锁
mysql> flush tables with read lock;
Query OK, 0 rows affected (0.00 sec)
# 无法执行删除操作
mysql> delete from test where id=1;
ERROR 1223 (HY000): Can\'t execute the query because you have a conflicting read lock
# 释放全局锁
mysql> unlock tables;
Query OK, 0 rows affected (0.00 sec)
mysql> delete from test where id=1;
Query OK, 0 rows affected (0.02 sec)
使用场景:
全局锁用在逻辑备份的时候,整个库都处于只读状态,便于进行备份,如果数据库不处于只读状态,备份的时候可能会存在逻辑不一致的问题。 对于InnoDB这种支持MVCC(多版本视图)的存储引擎来说,如果数据的事务级别处于可以重复读级别,备份采用mysqldump备份,通过一个命令选项[--single-transaction ]也支持逻辑一致性备份:
mysqldump -uxxx -p --single-transaction --master-data=2 --routines --flush-logs --databases db1 db2 db3 > alldb.sql;
mysqldump -uxxx -p --flush-privileges --databases mysql > mysql.sql;
single-transaction 会开启一个事务,保证读到的数据是一致的。
存在问题
全局锁会造成主库上业务无法正常秩序;
备库上加全局锁无法进行binlog的同步。
其他 数据库改成只读状态,不仅可以用刚才的全局锁,还可以通过:set global read_only=