FLUSH [NO_WRITE_TO_BINLOG | LOCAL] {
flush_option [, flush_option] ...
| tables_option
}
flush_option: {
BINARY LOGS
| DES_KEY_FILE
| ENGINE LOGS
| ERROR LOGS
| GENERAL LOGS
| HOSTS
| LOGS
| PRIVILEGES
| QUERY CACHE
| RELAY LOGS
| SLOW LOGS
| STATUS
| USER_RESOURCES
}
tables_option: {
TABLES
| TABLES tbl_name [, tbl_name] ...
| TABLES WITH READ LOCK
| TABLES tbl_name [, tbl_name] ... WITH READ LOCK
| TABLES tbl_name [, tbl_name] ... FOR EXPORT
}
该FLUSH语句有多种变体形式,可以清除或重新加载各种内部缓存、刷新表或获取锁。要执行
FLUSH,您必须拥有
RELOAD特权。特定的刷新选项可能需要额外的权限,如选项描述中所示。
不可能
FLUSH在存储函数或触发器中发出语句。但是,您可以
FLUSH在存储过程中使用,只要这些不是从存储函数或触发器中调用的。请参阅第 20.8 节,“对存储程序的限制”。
默认情况下,服务器将
FLUSH语句写入二进制日志,以便它们复制到副本。要禁止记录日志,请指定可选NO_WRITE_TO_BINLOG
关键字或其别名LOCAL。
FLUSH LOGS,
FLUSH BINARY LOGS,
FLUSH TABLES WITH READ LOCK
(有或没有表列表),并且
在任何情况下都不会写入二进制日志,因为如果复制到副本,它们会导致问题。
FLUSH
TABLES tbl_name ... FOR
EXPORT
该FLUSH语句导致隐式提交。请参阅第 13.3.3 节,“导致隐式提交的语句”。
mysqladmin实用程序
使用flush-hosts、
flush-logs、
flush-privileges、
flush-status和
等命令为某些刷新操作提供命令行界面flush-tables。请参阅
第 4.5.2 节,“mysqladmin — 一个 MySQL 服务器管理程序”。
向服务器发送SIGHUP信号会导致发生多个刷新操作,这些操作类似于各种形式的FLUSH语句。信号可以由root系统帐户或拥有服务器进程的系统帐户发送。这使得刷新操作无需连接到服务器即可执行,这需要一个 MySQL 帐户具有足够的权限来执行这些操作。请参阅
第 4.10 节,“MySQL 中的 Unix 信号处理”。
声明RESET类似于
。有关使用复制
的信息
,FLUSH请参阅
第 13.7.6.6 节,“RESET 语句” 。RESET
以下列表描述了允许的
FLUSH语句
flush_option值。有关允许tables_option
值的说明,请参阅FLUSH TABLES 语法。
关闭并重新打开服务器正在写入的任何二进制日志文件。如果启用了二进制日志记录,则二进制日志文件的序列号相对于前一个文件递增 1。
此操作对用于二进制和中继日志的表没有影响(由
master_info_repository和relay_log_info_repository系统变量控制)。--des-key-file从服务器启动时 使用选项指定的文件重新加载 DES 密钥。关闭并重新打开已安装存储引擎的任何可刷新日志。这导致
InnoDB将其日志刷新到磁盘。关闭并重新打开服务器正在写入的任何错误日志文件。
关闭并重新打开服务器正在写入的任何常规查询日志文件。
此操作对用于通用查询日志的表没有影响(请参阅第 5.4.1 节,“选择通用查询日志和慢速查询日志输出目标”)。
清空主机缓存和
host_cache公开缓存内容的性能模式表,并取消阻止任何被阻止的主机。有关为什么建议或希望刷新主机缓存的信息,请参阅第 5.1.11.2 节,“DNS 查找和主机缓存”。
笔记TRUNCATE TABLE performance_schema.host_cache与 不同 的是, 该语句FLUSH HOSTS未写入二进制日志。要从后者获得相同的行为,请将NO_WRITE_TO_BINLOGor 指定LOCAL为FLUSH HOSTS语句的一部分。关闭并重新打开服务器正在写入的任何日志文件。
此操作的效果等同于这些操作的组合效果:
FLUSH BINARY LOGS FLUSH ENGINE LOGS FLUSH ERROR LOGS FLUSH GENERAL LOGS FLUSH RELAY LOGS FLUSH SLOW LOGSmysql从系统数据库 中的授权表中重新读取权限 。仅当您直接对授权表进行此类更改时,才需要重新加载授权表以启用对 MySQL 权限和用户的更新;
GRANT或 等账户管理报表不需要它REVOKE,它会立即生效。有关详细信息,请参阅第 6.2.8 节,“权限更改何时生效”。如果
--skip-grant-tables在服务器启动时指定该选项以禁用 MySQL 特权系统,则FLUSH PRIVILEGES提供一种在运行时启用特权系统的方法。释放由服务器缓存的内存作为
GRANT、CREATE USER、CREATE SERVER和INSTALL PLUGIN语句的结果。此内存不会由相应REVOKE的 、DROP USER、DROP SERVER和UNINSTALL PLUGIN语句释放,因此对于执行许多导致缓存的语句实例的服务器,缓存内存使用量可能会增加,除非使用 释放它FLUSH PRIVILEGES。对查询缓存进行碎片整理以更好地利用其内存。 与or
FLUSH QUERY CACHE不同,不会从缓存中删除任何查询 。FLUSH TABLESRESET QUERY CACHE关闭并重新打开服务器正在写入的任何中继日志文件。如果启用中继日志记录,则中继日志文件的序列号相对于前一个文件递增 1。
此操作对用于二进制和中继日志的表没有影响(由
master_info_repository和relay_log_info_repository系统变量控制)。关闭并重新打开服务器正在写入的任何慢速查询日志文件。
此操作对用于慢速查询日志的表没有影响(请参阅第 5.4.1 节,“选择通用查询日志和慢速查询日志输出目标”)。
刷新状态指示器。
此操作将当前线程的会话状态变量值添加到全局值并将会话值重置为零。一些全局变量也可能被重置为零。它还将密钥缓存(默认和命名)的计数器重置为零,并设置
Max_used_connections为当前打开的连接数。此信息在调试查询时可能有用。请参阅 第 1.6 节,“如何报告错误或问题”。FLUSH STATUS不受read_onlyor 的影响super_read_only,并且始终写入二进制日志。将所有每小时用户资源指标重置为零。
重置资源指示器使已达到每小时连接、查询或更新限制的客户端能够立即恢复活动。
FLUSH USER_RESOURCES不适用于由max_user_connections系统变量控制的最大同时连接数限制。请参阅第 6.2.13 节,“设置帐户资源限制”。
仅在 MySQL 5.6.11 中,gtid_next
必须AUTOMATIC在发出此语句之前设置为。(错误#16062608、错误#16715809、错误#69045)
刷新表语法
FLUSH TABLES刷新表,并根据使用的变体获取锁。语句中使用的任何
TABLES变体
FLUSH必须是唯一使用的选项。FLUSH
TABLE是的同义词FLUSH
TABLES。
此处指示通过关闭表来刷新表的描述不同地适用于InnoDB,它将表内容刷新到磁盘但使它们保持打开状态。这仍然允许在表打开时复制表文件,只要其他活动不修改它们即可。
关闭所有打开的表,强制关闭所有正在使用的表,并刷新查询缓存和准备语句缓存。
FLUSH TABLES还从查询缓存中删除所有查询结果,如RESET QUERY CACHE语句。有关查询缓存和准备语句缓存的信息,请参阅第 8.10.3 节,“MySQL 查询缓存”。和 第 8.10.4 节,“准备好的语句和存储程序的缓存”。FLUSH TABLES存在活动时不允许LOCK TABLES ... READ。要刷新和锁定表,请 改用。FLUSH TABLEStbl_name... WITH READ LOCKFLUSH TABLEStbl_name[,tbl_name] ...对于一个或多个以逗号分隔的表名的列表,此操作类似于
FLUSH TABLES没有名称,只是服务器仅刷新指定的表。如果命名表不存在,则不会发生错误。关闭所有打开的表并使用全局读锁锁定所有数据库的所有表。
如果您有 Veritas 或 ZFS 等可以及时拍摄快照的文件系统,此操作是获取备份的一种非常方便的方法。用于
UNLOCK TABLES解除锁定。FLUSH TABLES WITH READ LOCK获取全局读锁而不是表锁,因此它不受与表锁定和隐式提交相同的行为的LOCK TABLES约束UNLOCK TABLES:UNLOCK TABLES仅当任何表当前已被锁定时才隐式提交任何活动事务LOCK TABLES。UNLOCK TABLES后续不会发生提交,FLUSH TABLES WITH READ LOCK因为后面的语句不获取表锁。开始一个事务会导致获得的表锁
LOCK TABLES被释放,就好像你已经执行了一样UNLOCK TABLES。开始事务不会释放使用 获取的全局读锁FLUSH TABLES WITH READ LOCK。
FLUSH TABLES WITH READ LOCK与 XA 事务不兼容。FLUSH TABLES WITH READ LOCK不会阻止服务器将行插入日志表(请参阅第 5.4.1 节,“选择一般查询日志和慢速查询日志输出目的地”)。FLUSH TABLEStbl_name[,tbl_name] ... WITH READ LOCK刷新并获取命名表的读锁。
因为这个操作需要获取表锁,所以
LOCK TABLES除了权限之外,还需要每个表的RELOAD权限。该操作首先获取表的独占元数据锁,因此它等待打开这些表的事务完成。然后该操作从表缓存中刷新表,重新打开表,获取表锁(如
LOCK TABLES ... READ),并将元数据锁从独占降级为共享。操作获取锁并降级元数据锁后,其他会话可以读取但不能修改表。此操作仅适用于现有基(非
TEMPORARY)表)。如果名称引用基表,则使用该表。如果它引用TEMPORARY表,则忽略它。如果名称适用于视图,ER_WRONG_OBJECT则会发生错误。否则, 发生ER_NO_SUCH_TABLE错误。用于
UNLOCK TABLES释放锁,LOCK TABLES释放锁并获取其他锁,或START TRANSACTION释放锁并开始新的事务。此
FLUSH TABLES变体使表能够在单个操作中被刷新和锁定。FLUSH TABLES它为存在活动时不允许 的限制提供了解决方法LOCK TABLES ... READ。此操作不执行隐式操作
UNLOCK TABLES,因此如果您在有任何活动的情况下执行操作LOCK TABLES或在没有首先释放获取的锁的情况下再次使用它,则会导致错误。如果使用 打开刷新表
HANDLER,处理程序将被隐式刷新并失去其位置。FLUSH TABLEStbl_name[,tbl_name] ... FOR EXPORT此
FLUSH TABLES变体适用于InnoDB表格。它确保对命名表的更改已刷新到磁盘,以便可以在服务器运行时创建二进制表副本。因为该
FLUSH TABLES ... FOR EXPORT操作获取表上的锁以准备导出它们,所以 除了特权之外,它还需要每个表 的LOCK TABLES和 特权。SELECTRELOAD操作是这样的:
它获取命名表的共享元数据锁。只要其他会话具有已修改这些表或为它们持有表锁的活动事务,该操作就会阻塞。获取锁后,该操作会阻止尝试更新表的事务,同时允许只读操作继续进行。
它检查表的所有存储引擎是否支持
FOR EXPORT. 如果没有,ER_ILLEGAL_HA则会发生错误并且操作失败。该操作通知每个表的存储引擎使表准备好导出。存储引擎必须确保任何挂起的更改都写入磁盘。
该操作将会话置于锁表模式,以便在
FOR EXPORT操作完成时不会释放先前获取的元数据锁。
此操作仅适用于现有基(非
TEMPORARY)表。如果名称引用基表,则使用该表。如果它引用一个TEMPORARY表,它会被忽略。如果名称应用于视图,ER_WRONG_OBJECT则会发生错误。否则,ER_NO_SUCH_TABLE会发生错误。InnoDB支持FOR EXPORT具有自己的.ibd文件文件的表(即,在innodb_file_per_table启用设置的情况下创建的表)。InnoDB确保在FOR EXPORT操作通知任何更改已刷新到磁盘时。这允许在FOR EXPORT操作生效时制作表内容的二进制副本,因为该.ibd文件是事务一致的并且可以在服务器运行时复制。FOR EXPORT不适用于InnoDB系统表空间文件或InnoDB具有FULLTEXT索引的表。FLUSH TABLES ...FOR EXPORT不适InnoDB用于 MySQL 5.6.17 之前的分区表,但在 MySQL 5.6.17 及更高版本中支持此类表。当 通知时
FOR EXPORT,InnoDB将通常保存在内存中或表空间文件外的单独磁盘缓冲区中的某些类型的数据写入磁盘。对于每个表,InnoDB还会在与表相同的数据库目录中生成一个文件。该table_name.cfg.cfg文件包含稍后将表空间文件重新导入相同或不同服务器所需的元数据。当
FOR EXPORT操作完成时, 已将所有脏页InnoDB刷新 到表数据文件中。 在刷新之前合并任何 更改缓冲区条目。此时,表被锁定并处于静止状态:表在磁盘上处于事务一致状态,您可以复制表空间文件以及相应的文件以获得这些表的一致快照。.ibd.cfg有关将复制的表数据重新导入 MySQL 实例的过程,请参阅第 14.6.1.3 节,“导入 InnoDB 表”。
处理完表后,使用
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