FLUSH TABLES 作用是 flush 表,并根据参数加上相应的锁。默认是写日志的,如果不希望写日志,可以设置加上参数 NO_WRITE_TO_BINLOG。另外, FLUSH TABLES 命令执行前会隐式地发出commit命令,常见语法如下:
• FLUSH TABLES
关闭所有的表,包括正在使用的表,并且会flush query cache。如果有正处于活动状态的 LOCK TABLES ... READ 命令,则不允许 FLUSH TABLES 命令
• FLUSH TABLES tbl_name [, tbl_name] ...
只FLUSH 指定表
• FLUSH TABLES WITH READ LOCK
关闭所有的表,并给所有数据库的所有表加上一个global read lock。这对于backup操作来说很有用,加锁之后,可以防止应用修改数据库。这个是全局级别的锁,而非表锁。
• FLUSH TABLES tbl_name [, tbl_name] ... WITH READ LOCK
同上,但只针对部分表
• FLUSH TABLES tbl_name [, tbl_name] ... FOR EXPORT
只针对 InnoDB 表,可以确保对表的修改被刷新到磁盘上,MySQL可以通过直接拷贝底层文件的方式来复制表,参考链接。
如果是在当前session执行某表张的插入操作,会报如下错, 如果是在别的session,会一直HANG住,并不会发生锁超时。
可以使用 UNLOCK TABLES 命令来释放获取的锁。
另外,FLUSH还可以刷新日志,具体可以参考:
https://dev.mysql.com/doc/refman/5.7/en/flush.html
• FLUSH TABLES
关闭所有的表,包括正在使用的表,并且会flush query cache。如果有正处于活动状态的 LOCK TABLES ... READ 命令,则不允许 FLUSH TABLES 命令
• FLUSH TABLES tbl_name [, tbl_name] ...
只FLUSH 指定表
• FLUSH TABLES WITH READ LOCK
关闭所有的表,并给所有数据库的所有表加上一个global read lock。这对于backup操作来说很有用,加锁之后,可以防止应用修改数据库。这个是全局级别的锁,而非表锁。
• FLUSH TABLES tbl_name [, tbl_name] ... WITH READ LOCK
同上,但只针对部分表
• FLUSH TABLES tbl_name [, tbl_name] ... FOR EXPORT
只针对 InnoDB 表,可以确保对表的修改被刷新到磁盘上,MySQL可以通过直接拷贝底层文件的方式来复制表,参考链接。
示例如下:
mysql> show open tables;
+----------+--------------+--------+-------------+
| Database | Table | In_use | Name_locked |
+----------+--------------+--------+-------------+
| mysql | servers | 0 | 0 |
| mysql | db | 0 | 0 |
| test1 | t2 | 0 | 0 |
| mysql | procs_priv | 0 | 0 |
| mysql | user | 0 | 0 |
| mysql | proxies_priv | 0 | 0 |
| mysql | columns_priv | 0 | 0 |
| mysql | tables_priv | 0 | 0 |
+----------+--------------+--------+-------------+
8 rows in set (0.00 sec)
mysql> FLUSH tables with read lock;
Query OK, 0 rows affected (0.00 sec)
mysql> SHOW OPEN TABLES;
Empty set (0.00 sec)
如果是在当前session执行某表张的插入操作,会报如下错, 如果是在别的session,会一直HANG住,并不会发生锁超时。
mysql> insert into t2 values(300,'gg');
ERROR 1223 (HY000): Can't execute the query because you have a conflicting read lock
可以使用 UNLOCK TABLES 命令来释放获取的锁。
mysql> UNLOCK TABLES;
Query OK, 0 rows affected (0.01 sec)
另外,FLUSH还可以刷新日志,具体可以参考:
https://dev.mysql.com/doc/refman/5.7/en/flush.html