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
}
该 刷新 语句有多种变体形式,清除或重新加载各种内部缓存,刷新表或获取锁。每个 刷新 操作都需要在其描述中指定的权限。
无法在存储函数或触发器中发出 刷新 语句。但是,您可以在存储过程中使用 刷新,只要这些过程不是从存储函数或触发器调用。请参阅 第 27.8 节,“存储程序限制”。
默认情况下,服务器将 刷新 语句写入二进制日志,以便复制到副本。要抑制日志记录,请指定可选的 NO_WRITE_TO_BINLOG 关键字或其别名 LOCAL。
刷新日志、刷新二进制日志、刷新表 WITH 读锁(带或不带表列表)和刷新表 在任何情况下都不会写入二进制日志,因为它们如果复制到副本将引起问题。tbl_name ... FOR EXPORT
该 刷新 语句会导致隐式提交。请参阅 第 15.3.3 节,“隐式提交语句”。
该 mysqladmin 实用程序提供了命令行界面来执行一些刷新操作,使用命令如 flush-logs、flush-privileges、flush-status 和 flush-tables。请参阅 第 6.5.2 节,“mysqladmin — MySQL 服务器管理程序”。
向服务器发送 SIGHUP 或 SIGUSR1 信号将导致一些刷新操作发生,类似于各种 刷新 语句形式。信号可以由 root 系统帐户或拥有服务器进程的系统帐户发送。这使得可以在不连接到服务器的情况下执行刷新操作,需要 MySQL 帐户拥有足够的权限来执行这些操作。请参阅 第 6.10 节,“Unix 信号处理在 MySQL 中”。
该 RESET 语句类似于 刷新。请参阅 第 15.7.8.6 节,“RESET 语句”,了解使用 RESET 与复制的信息。
以下列表描述了允许的 刷新 语句 flush_option 值。有关允许的 tables_option 值的描述,请参阅 FLUSH TABLES 语法。
-
关闭并重新打开服务器正在写入的任何二进制日志文件。如果启用了二进制日志记录,则相对于之前的文件,二进制日志文件的序列号将增加 1。
该操作需要
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 节,“优化器成本模型”。此操作仅影响后续会话,而不是现有会话,它们继续使用开始时的成本估算。
-
重新读取 MySQL 系统架构中的权限表中的权限。作为此操作的一部分,服务器读取包含动态权限分配的
global_grants表,并注册其中找到的任何未注册权限。重新加载权限表是必要的,以便启用 MySQL 权限和用户的更新,只有在直接更改权限表时才需要;这不是账户管理语句(如
GRANT或REVOKE)的效果立即生效。请参见 第 8.2.13 节,“权限更改何时生效”,以获取更多信息。此操作需要
RELOAD权限。如果在服务器启动时指定了
--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 CHANNELchannel]关闭并重新打开服务器写入的中继日志文件。如果启用了中继日志记录,则中继日志文件的序列号将相对于之前的文件增加一。
该操作需要
RELOAD权限。该
FOR CHANNEL子句允许您指定操作应用于哪个复制通道。执行channelFLUSH RELAY LOGS FOR CHANNEL以刷新指定复制通道的中继日志。如果未指定通道且不存在额外的复制通道,则操作将应用于默认通道。如果未指定通道且存在多个复制通道,则操作将应用于所有复制通道。有关更多信息,请参阅第 19.2.2 节,“复制通道”。channel -
关闭并重新打开服务器写入的慢查询日志文件。
该操作需要
RELOAD权限。该操作对慢查询日志表(请参阅第 7.4.1 节,“选择通用查询日志和慢查询日志输出目标”)没有影响。
-
刷新状态指示器。
该操作将当前线程的会话状态变量值添加到全局值中,并将会话值重置为零。一些全局变量也可能被重置为零。此外,还将键缓存(默认和命名)计数器重置为零,并将
Max_used_connections设置为当前打开的连接数。这些信息可能在调试查询时有用。请参阅第 1.5 节,“如何报告错误或问题”。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 TABLES 刷新表,并且根据使用的变体,获取锁定。任何 TABLES 变体用于 FLUSH 语句必须是唯一使用的选项。FLUSH TABLE 是 FLUSH TABLES 的同义词。
这里的描述表明表被刷新关闭适用于 InnoDB,它刷新表内容到磁盘,但保持它们打开。这仍然允许在表文件被复制时不修改它们。
-
关闭所有打开的表,强制所有使用中的表关闭,并刷新预备语句缓存。
此操作需要
FLUSH_TABLES或RELOAD权限。有关预备语句缓存的信息,请参阅 第 10.10.3 节,“预备语句和存储程序的缓存”。
FLUSH TABLES不允许在活动LOCK TABLES ... READ时使用。要刷新和锁定表,请使用FLUSH TABLES代替。tbl_name... WITH READ LOCK -
FLUSH TABLEStbl_name[,tbl_name] ...使用一个或多个逗号分隔的表名列表,这个操作类似于
FLUSH TABLES,但服务器仅刷新命名的表。如果命名的表不存在,不会发生错误。此操作需要
FLUSH_TABLES或RELOAD权限。 -
关闭所有打开的表,并锁定所有数据库的所有表以全局读锁。
此操作需要
FLUSH_TABLES或RELOAD权限。这是一种非常方便的方式来获取备份,如果您拥有像 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不阻止服务器将行插入日志表(见第 7.4.1 节,“选择通用查询日志和慢查询日志输出目标”)。 -
-
FLUSH TABLEStbl_name[,tbl_name] ... WITH READ LOCK刷新并获取指定表的读锁。
该操作需要
FLUSH_TABLES或RELOAD权限。因为它获取表锁,因此还需要LOCK TABLES权限对于每个表。该操作首先获取指定表的独占元数据锁,然后刷新表缓存,重新打开表,获取表锁(类似
LOCK TABLES ... READ),然后将元数据锁从独占降级为共享。其他会话可以读取但不能修改表。该操作仅适用于现有的基本(非临时)表。如果名称引用基本表,则使用该表。如果它引用临时表,则忽略该表。如果名称应用于视图,出现
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打开,处理程序将隐式刷新并失去其位置。 -
刷新表tbl_name[,tbl_name] ... FOR EXPORT该
刷新表变体适用于InnoDB表。它确保对命名表的更改已经刷新到磁盘,以便在服务器运行时可以制作二进制表副本。该操作需要
刷新表或重新加载权限。因为它在准备导出表时获取表锁,因此还需要锁定表和选择权限 для每个表。该操作按照以下方式工作:
-
它获取命名表的共享元数据锁。该操作阻塞,直到其他会话中的活动事务释放这些表或锁定这些表。获取锁后,该操作阻止尝试更新这些表的交易,而允许继续读取操作。
-
它检查所有存储引擎是否支持
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系统表空间文件或具有FULLTEXT索引的InnoDB表。刷新表 ...FOR EXPORT支持分区InnoDB表。当
InnoDB收到FOR EXPORT通知时,它将某些通常保存在内存或单独磁盘缓冲区外的数据写入磁盘。对于每个表,InnoDB还生成一个名为的文件,该文件位于数据库目录中。该table_name.cfg.cfg文件包含重新导入表空间文件所需的元数据。当
FOR EXPORT操作完成时,InnoDB已经将所有 脏页 刷新到表数据文件中。任何 更改缓冲区 条目都将在刷新之前合并。在这点上,表被锁定且静止:表在磁盘上处于事务一致状态,您可以复制.ibd表空间文件和相应的.cfg文件,以获取一致的表快照。有关将复制的表数据重新导入 MySQL 实例的过程,请参阅 第 17.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 -