锁表

1.FLUSH TABLE(S) [tbl_name] WITH READ LOCK;

这个命令是全局读锁定,执行了命令之后所有库所有表都被锁定只读(不指定表的情况下)。一般都是用在数据库联机备份,这个时候数据库的写操作将被阻塞,读操作顺利进行。

2.LOCK TABLE(S) tbl_name [AS alias] {READ [LOCAL] | [LOW_PRIORITY] WRITE};

这个命令是表级别的锁定,可以定制锁定某一个表。例如: lock tables test read; 不影响其他表的写操作。

锁表可能会导致表无法访问,应用出现空白页,慎用!!!

解锁

UNLOCK TABLE(S) [tbl_name];

使用 MySQL 命令行执行的锁操作,在退出命令行时,会隐式提交 UNLOCK TABLES 指令,解锁前面的表;使用 Navicat 新建查询执行的锁表操作,在关闭查询窗口后,也会解锁前面的表。

FLUSH TABLES 扩展

1、FLUSH TABLES关闭所有打开的表,强制关闭所有正在使用的表,并刷新查询缓存和预准备语句缓存,不会刷新脏块

2、FLUSH TABLES WITH READ LOCK关闭所有打开的表并使用全局读锁锁定所有数据库的所有表,不会刷新脏块

3、如果一个会话中使用LOCK TABLES tbl_name lock_type语句对某表加了表锁,在该表锁未释放前,那么另外一个会话如果执行FLUSH TABLES语句会被阻塞,执行FLUSH TABLES WITH READ LOCK也会被堵塞

4、如果一个会话正在执行DDL语句,那么另外一个会话如果执行FLUSH TABLES 语句会被阻塞 ,执行FLUSH TABLES WITH READ LOCK也会被堵塞

5、如果一个会话正在执行DML大事务(DML语句正在执行,数据正在发生修改,而不是使用lock in share mode和for update语句来显式加锁),那么另外一个会话如果执行FLUSH TABLES语句会被阻塞,执行FLUSH TABLES WITH READ LOCK也会被堵塞

6、FLUSH TABLES WITH READ LOCK语句不会阻塞日志表的写入,例如:查询日志,慢查询日志等

7、mysqldump的--master-data、--lock-all-tables参数引发FLUSH TABLES和FLUSH TABLES WITH READ LOCK

8、FLUSH TABLES tbl_name [, tbl_name] ... FOR EXPORT 会刷新脏块

9、FLUSH TABLES WITH READ LOCK可以针对单个表进行锁定,比如只锁定table1则flush tables table1 with read lock;