15.7.8.3 刷新语句
FLUSH [NO_WRITE_TO_BINLOG | LOCAL] {
flush_option [, flush_option] ...
| tables_option
}
flush_option: {
BINARY LOGS
| ENGINE LOGS
| ERROR LOGS
| GENERAL LOGS
| LOGS
| PRIVILEGES
| OPTIMIZER_COSTS
| RELAY LOGS [FOR CHANNEL channel]
| SLOW LOGS
| STATUS
| USER_RESOURCES
}
tables_option: {
table_synonym
| table_synonym tbl_name [, tbl_name] ...
| table_synonym WITH READ LOCK
| table_synonym tbl_name [, tbl_name] ... WITH READ LOCK
| table_synonym tbl_name [, tbl_name] ... FOR EXPORT
}
table_synonym: {
TABLE
| TABLES
}
FLUSH
语句有多种变体形式,清除或重新加载内部缓存、刷新表或获取锁。每个FLUSH
操作都需要其描述中所示的权限。
不能在存储函数或触发器中发出FLUSH
语句。然而,您可以在存储程序中使用FLUSH
,只要这些存储程序不被存储函数或触发器调用。见第27.8节,“存储程序限制”。
默认情况下,服务器将FLUSH
语句写入二进制日志,以便于复制到副本。要抑制日志记录,指定可选的NO_WRITE_TO_BINLOG
关键字或其别名LOCAL
。
FLUSH LOGS
, FLUSH BINARY LOGS
, FLUSH TABLES WITH READ LOCK
(带或不带表名列表),和FLUSH TABLES
在任何情况下都不会写入二进制日志,因为这将在复制到副本时引起问题。tbl_name
... FOR EXPORT
语句FLUSH
会隐式提交。见第15.3.3节,“隐式提交语句”.
mysqladmin实用工具提供了一些flush操作的命令行界面,使用命令如flush-logs
, flush-privileges
, flush-status
, 和flush-tables
。见第6.5.2节,“mysqladmin — MySQL 服务器管理程序”.
将服务器发送一个SIGHUP
或SIGUSR1
信号,会导致多个 flush 操作发生,这些操作类似于FLUSH
语句的各种形式。信号可以由root
系统账户或服务器进程所有者账户发送。这使得flush 操作可以不需要连接到服务器,且需要具有执行这些操作的 MySQL 账户权限。见第6.10节,“MySQL 中 Unix 信号处理”。
RESET
语句类似于FLUSH
。见第15.7.8.6节,“ RESET 语句”,了解如何使用RESET
与复制。
以下是允许的FLUSH
语句flush_option
值列表。关于允许的tables_option
值描述,见FLUSH TABLES 语法。
-
关闭并重新打开服务器正在写入的二进制日志文件。如果启用了二进制日志记录,二进制日志文件的序列号相对于前一个文件增加一。
该操作需要
RELOAD
特权。 -
关闭并重新打开安装的存储引擎可刷新日志。这会导致
InnoDB
将其日志刷新到磁盘。该操作需要
RELOAD
特权。 -
关闭并重新打开服务器正在写入的错误日志文件。
该操作需要
RELOAD
特权。 -
关闭并重新打开服务器正在写入的通用查询日志文件。
该操作需要
RELOAD
特权。该操作对通用查询日志表无效(见第7.4.1节,“选择通用查询日志和慢查询日志输出目的地”)。
-
关闭并重新打开服务器正在写入的日志文件。
这项操作需要
RELOAD
特权。这项操作的效果等同于这两个操作的组合结果:
FLUSH BINARY LOGS FLUSH ENGINE LOGS FLUSH ERROR LOGS FLUSH GENERAL LOGS FLUSH RELAY LOGS FLUSH SLOW LOGS
-
重新读取成本模型表,以便优化器开始使用当前存储在其中的成本估算。
这项操作需要
FLUSH_OPTIMIZER_COSTS
或RELOAD
特权。服务器将未识别的成本模型表项写入错误日志。关于这些表的信息,请参见第10.9.5节,“优化器成本模型”。这项操作只影响从该flush开始的会话Existing会话继续使用当前会话开始时的成本估算。
-
重新读取mysql系统架构中的权限表。作为这项操作的一部分,服务器读取动态权限分配的
global_grants
表,并注册其中发现的未注册权限。如果您直接修改了授权表,需要重新加载授权表以启用 MySQL 权限和用户更新;否则,不需要。例如,
GRANT
或REVOKE
语句立即生效。详见第8.2.13节,“权限更改的时机”,了解更多信息。该操作需要
RELOAD
或FLUSH_PRIVILEGES
权限。如果在服务器启动时指定了
--skip-grant-tables
选项,禁用 MySQL 权限系统,FLUSH PRIVILEGES
可以在运行时启用权限系统。重置失败登录跟踪(或在服务器启动时指定
--skip-grant-tables
时启用)并解锁暂时锁定的账户。详见第8.2.15节,“密码管理”。服务器释放由
GRANT
、CREATE USER
、CREATE SERVER
和INSTALL PLUGIN
语句缓存的内存。这一块内存不被对应的REVOKE
、DROP USER
、DROP SERVER
和UNINSTALL PLUGIN
语句释放,除非使用FLUSH PRIVILEGES
。清除
SHA-2可插拔身份验证缓存操作。 -
FLUSH RELAY LOGS [FOR CHANNEL
channel
]关闭并重新打开服务器正在写入的中继日志文件。如果启用了中继日志记录,中继日志文件的序列号相对于前一个文件增加一。
该操作需要
RELOAD
特权。"
FOR CHANNEL
"子句使您可以指定操作应用于哪个中继通道。执行channel
FLUSH RELAY LOGS FOR CHANNEL
以刷新特定中继通道的中继日志。如果没有指定通道且无额外中继通道,操作应用于默认通道。如果没有指定通道且存在多个中继通道,操作应用于所有中继通道。更多信息,请参见第19.2.2节,“中继通道”。channel
-
关闭并重新打开服务器正在写入的慢查询日志文件。
该操作需要
RELOAD
特权。该操作对慢查询日志表无效(见第7.4.1节,“选择一般查询日志和慢查询日志输出目的地”)。
-
刷新状态指示器。
这个操作将当前线程的会话状态变量值添加到全局值中,并将会话值重置为零。一些全局变量也可能被重置为零。此外,它还将默认和命名键缓存的计数器重置为零,并将
Max_used_connections
设置为当前打开连接的数量。这可能在调试查询时有用。见第1.6节,“如何报告错误或问题”。FLUSH STATUS
不受read_only
或super_read_only
影响,并总是写入二进制日志。这个操作需要
FLUSH_STATUS
或RELOAD
特权。 -
重置每小时用户资源指示器为零。
这个操作需要
FLUSH_USER_RESOURCES
或RELOAD
特权。重置资源指标使得已经达到小时连接、查询或更新限制的客户端立即恢复活动。
FLUSH USER_RESOURCES
不适用于由max_user_connections
系统变量控制的最大同时连接数。见第8.2.21节,“设置帐户资源限制”。
FLUSH TABLES
刷新表,根据使用的变体获取锁定。任何FLUSH
语句都必须是唯一选项。FLUSH TABLE
是FLUSH TABLES
的同义词。
这里指示关闭表的描述对 InnoDB 不同,它将表内容刷新到磁盘,但保持表打开。这仍然允许在表打开时复制表文件,只要其他活动不修改它们。
-
关闭所有打开的表,强制使用中的所有表关闭,并刷新预准备语句缓存。
该操作需要
FLUSH_TABLES
或RELOAD
权限。关于预准备语句缓存的信息,请参见第10.10.3节,“预准备语句和存储程序缓存”。
FLUSH TABLES
在存在活动LOCK TABLES ... 读
时不允许。要flush和锁定表,使用FLUSH TABLES
。tbl_name
... WITH 读锁定 -
FLUSH TABLES
tbl_name
[,tbl_name
] ...带有一个或多个逗号分隔的表名列表,该操作类似于
FLUSH TABLES
没有名称,服务器只flush指定的表。如果指定的表不存在,不会出现错误。该操作需要
FLUSH_TABLES
或RELOAD
权限。 -
关闭所有打开的表并锁定所有数据库中的表,以全局读锁定的方式。
该操作需要
FLUSH_TABLES
或RELOAD
特权。该操作是获取备份的非常方便的方式,如果您使用了可以在时间点拍摄快照的文件系统,如Veritas或ZFS。使用
UNLOCK TABLES
释放锁定。FLUSH TABLES WITH READ LOCK
获取全局读锁定,而不是表锁定,因此它不受LOCK TABLES
和UNLOCK TABLES
的表锁定和隐式提交行为影响:-
UNLOCK TABLES
只有在当前已经锁定的表中隐式提交活动事务。对LOCK TABLES
锁定的表进行提交,不会对FLUSH TABLES WITH READ LOCK
后执行UNLOCK TABLES
。 -
开始事务会释放使用
LOCK TABLES
锁定的表,类似于执行UNLOCK TABLES
。开始事务不会释放使用FLUSH TABLES WITH READ LOCK
锁定的全局读锁。
FLUSH TABLES WITH READ LOCK
不会阻止服务器插入日志表(见第7.4.1节,“选择通用查询日志和慢查询日志输出目的地”)。 -
-
FLUSH TABLES
tbl_name
[,tbl_name
] ... WITH READ LOCKflush并获取读锁定对名表。
该操作需要
FLUSH_TABLES
或RELOAD
特权。因为它获取表锁定,同样需要LOCK TABLES
特权对每个表。操作首先获取独占元数据锁定对表,然后等待打开那些表的事务完成。然后,操作flush表从表缓存中刷新,重新打开表,获取表锁定(像
LOCK TABLES ... READ
),最后将元数据锁定从独占降级到共享。操作获取锁定和降级元数据锁定后,其他会话可以读取但不能修改表。该操作仅适用于现有基础表(非
TEMPORARY)
。如果名称引用基础表,那么使用该表。如果引用临时表,忽略该名称。如果名称应用于视图,则发生ER_WRONG_OBJECT
错误。否则,发生ER_NO_SUCH_TABLE
错误。使用
UNLOCK TABLES
释放锁定,LOCK TABLES
释放锁定并获取其他锁定,或者START TRANSACTION
释放锁定并开始新事务。该
FLUSH TABLES
变体使表可以在单个操作中被刷新和锁定。它为FLUSH TABLES
不允许在有活动LOCK TABLES ... READ
时提供了工作-around。这个操作不执行隐式
UNLOCK TABLES
LOCK TABLES
的情况下执行操作,或者第二次执行该操作而没有首先释放锁定,则会出现错误。如果使用
HANDLER
打开了flush过的表,handler将隐式flush并失去其位置。 -
FLUSH TABLES
tbl_name
[,tbl_name
] ... FOR EXPORT这个
FLUSH TABLES
变体适用于InnoDB
表,它确保了对名表的更改已经刷新到磁盘,以便在服务器运行时可以进行二进制表复制。这个操作需要
FLUSH_TABLES
或RELOAD
特权。因为它在准备导出表时获取锁定,因此也需要对每个表的LOCK TABLES
和SELECT
特权。这个操作的工作方式是:
-
它获取共享元数据锁定对应的表。操作会阻塞,直到其他会话中的活动事务修改了这些表或持有表锁定为止。当锁定被获取时,操作将阻塞更新表的事务,而允许只读操作继续。
-
它检查所有存储引擎是否支持
FOR EXPORT
。如果任何不支持,一个ER_ILLEGAL_HA
错误发生,操作失败。 -
操作通知每个表的存储引擎使表准备好导出。存储引擎必须确保任何挂起的更改写入磁盘。
-
操作将会话置于锁定表模式,以便获取的元数据锁定在
FOR EXPORT
操作完成时不被释放。
这个操作只适用于现有基础表(非
TEMPORARY
表)。如果名称引用基础表,那么使用该表。如果引用TEMPORARY
表,发生ER_WRONG_OBJECT
错误。否则,发生ER_NO_SUCH_TABLE
错误。InnoDB
支持对拥有自己的.ibd
文件的表(即使用innodb_file_per_table
设置创建的表)进行FOR EXPORT
操作。InnoDB
在收到FOR EXPORT
操作通知时,确保任何更改已经被刷新到磁盘。这使得在FOR EXPORT
操作生效期间,可以对表内容进行二进制拷贝,因为.ibd
文件是事务一致的,可以在服务器运行时复制。FOR EXPORT
不适用于InnoDB
系统表空间文件,也不适用于拥有FULLTEXT
索引的InnoDB
表。FLUSH TABLES ...FOR EXPORT
对分区的InnoDB
表支持。当收到
FOR EXPORT
通知时,InnoDB
将通常在内存或单独磁盘缓冲区外的某些数据写入磁盘。对于每个表,InnoDB
也会在同一个数据库目录中生成一个名为
的文件。table_name
.cfg.cfg
文件包含了后续将表空间文件重新导入到同一或不同服务器所需的元数据。当
FOR EXPORT
操作完成时,InnoDB已经将所有脏页刷新到表数据文件中。任何更改缓冲区条目在刷新前被合并。在这个点上,表格锁定且静止:表格在磁盘上处于事务一致状态,您可以将.ibd
表空间文件和相应的.cfg
文件复制以获取这些表格的一致快照。要将复制的表格数据重新导入到 MySQL 实例中,请参阅第17.6.1.3节,“Importing InnoDB Tables”。
完成表格操作后,使用
UNLOCK TABLES
释放锁定,LOCK TABLES
释放锁定并获取其他锁定,或者START TRANSACTION
释放锁定并开始新事务。在会话中执行这些语句时,使用
FLUSH TABLES ... FOR EXPORT
产生错误:FLUSH TABLES ... WITH READ LOCK FLUSH TABLES ... FOR EXPORT LOCK TABLES ... READ LOCK TABLES ... WRITE
在会话中执行
FLUSH TABLES ... FOR EXPORT
时,使用这些语句之一产生错误:FLUSH TABLES WITH READ LOCK FLUSH TABLES ... WITH READ LOCK FLUSH TABLES ... FOR EXPORT
-