每日MySQL之024:FLUSH TABLES

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可以通过直接拷贝底层文件的方式来复制表,参考链接。

示例如下:

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值