MySQL 锁表和解锁
锁表
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;
当前页面是本站的「Google AMP」版。查看和发表评论请点击:完整版 »