13.7.6.3 FLUSH 声明

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
  | OPTIMIZER_COSTS
  | QUERY CACHE
  | RELAY LOGS [FOR CHANNEL channel]
  | 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语句具有多种变体形式,可清除或重新加载各种内部缓存,刷新 table 或获取锁。要执行FLUSH,您必须具有RELOAD特权。特定的刷新选项可能需要其他特权,如稍后所述。

Note

无法在存储的函数或触发器中发出FLUSH语句。但是,您可以在存储过程中使用FLUSH,只要不从存储函数或触发器中调用它们即可。参见第 23.8 节“对存储程序的限制”

默认情况下,服务器将FLUSH语句写入二进制日志,以便它们复制到副本。要禁止记录日志,请指定可选的NO_WRITE_TO_BINLOG关键字或其别名LOCAL

Note

FLUSH LOGS刷新二进制日志带读取锁的table(有或没有 table 列 table)和冲洗 tabletbl_name ...用于 Export在任何情况下均不会写入二进制日志,因为如果将它们复制到副本,则会引起问题。

FLUSH语句导致隐式提交。参见第 13.3.3 节“导致隐式提交的声明”

mysqladminUtil 使用诸如flush-hostsflush-logsflush-privilegesflush-statusflush-tables之类的命令为某些冲洗操作提供命令行界面。参见第 4.5.2 节“ mysqladmin-MySQL 服务器 Management 程序”

向服务器发送SIGHUPsignal 会导致发生若干刷新操作,这些操作与FLUSH语句的各种形式相似。signal 可以通过root或拥有服务器进程的帐户发送。它们使无需连接到服务器即可执行适用的刷新操作(这些操作需要具有RELOAD特权的帐户)。参见第 4.10 节“ MySQL 中的 Unixsignal 处理”

RESET语句类似于FLUSH。有关将RESET语句与复制一起使用的信息,请参见第 13.7.6.6 节“ RESET 语句”

以下列 table 描述了允许的FLUSH语句* flush_option *值。有关FLUSH TABLES变体的描述,请参见冲洗 table 语法

关闭并重新打开服务器正在写入的任何二进制日志文件。如果启用了二进制日志记录,则二进制日志文件的序列号将相对于前一个文件增加一个。

在服务器启动时从--des-key-file选项指定的文件中重新加载 DES 密钥。

Note

从 MySQL 5.7.6 开始不推荐使用DES_ENCRYPT()DES_DECRYPT()函数,这些函数将在以后的 MySQL 版本中删除,并且不再使用。因此,--des-key-fileDES_KEY_FILE也已弃用并将被删除。

关闭并重新打开已安装的存储引擎的所有可刷新日志。这将导致InnoDB将其日志刷新到磁盘。

关闭并重新打开服务器正在写入的任何错误日志文件。

关闭并重新打开服务器正在写入的任何常规查询日志文件。

清空主机高速缓存和公开高速缓存内容的“性能模式host_cache”table,并取消阻止所有被阻止的主机。参见第 5.1.11.2 节“ DNS 查找和主机缓存”

如果您的某些主机更改了 IP 地址,或者对于来自合法主机的连接出现了错误消息Host 'host_name' is blocked,则刷新主机缓存。 (请参阅B.4.2.5 节,“主机'host_name'被阻止”。)当连接到 MySQL 服务器时,给定主机连续发生超过max_connect_errors个错误时,MySQL 会认为出了问题,并阻止了主机发出进一步的连接请求。刷新主机缓存将启用来自主机的进一步连接尝试。 max_connect_errors的默认值为 100.为避免出现此错误消息,请将max_connect_errors设置为较大的值来启动服务器。

关闭并重新打开服务器正在写入的任何日志文件。如果启用了二进制日志记录,则二进制日志文件的序列号将相对于前一个文件增加一个。如果启用了中继日志记录,则中继日志文件的序列号将相对于前一个文件增加一个。

FLUSH LOGS对用于常规查询日志或慢速查询日志的 table 没有影响(请参阅第 5.4.1 节“选择常规查询日志和慢查询日志输出目标”)。

重新读取成本模型 table,以便优化器开始使用存储在其中的当前成本估算。服务器会为任何无法识别的条目向错误日志中写入警告。 (有关这些 table 的信息,请参阅第 8.9.5 节“优化程序成本模型”。)此操作仅影响在刷新之后开始的会话。现有会话 continue 使用开始时的最新成本估算。

mysql系统数据库中的授权 table 中重新加载特权。

如果在服务器启动时指定了--skip-grant-tables选项以禁用 MySQL 特权系统,则FLUSH PRIVILEGES提供了一种在运行时启用特权系统的方法。

释放由于GRANTCREATE USERCREATE SERVERINSTALL PLUGIN语句而由服务器缓存的内存。相应的REVOKEDROP USERDROP SERVERUNINSTALL PLUGIN语句不会释放此内存,因此对于执行许多导致缓存的语句实例的服务器,除非使用FLUSH PRIVILEGES释放它,否则缓存的内存使用量将会增加。

对查询缓存进行碎片整理,以更好地利用其内存。与FLUSH TABLESRESET QUERY CACHE不同,冲洗查询缓存不会从缓存中删除任何查询。

Note

从 MySQL 5.7.20 开始,查询缓存已弃用,并在 MySQL 8.0 中删除。弃用包括冲洗查询缓存

关闭并重新打开服务器正在写入的任何中继日志文件。如果启用了中继日志记录,则中继日志文件的序列号将相对于前一个文件增加一个。

FOR CHANNEL channel子句使您可以命名该语句应用于哪个复制通道。执行通道通道的刷新继电器日志刷新特定复制通道的中继日志。如果没有命名通道,并且不存在额外的复制通道,则该语句将应用于默认通道。如果没有命名通道,并且存在多个复制通道,则该语句适用于所有复制通道,但group_replication_applier通道除外。有关更多信息,请参见第 16.2.3 节“复制通道”

关闭并重新打开服务器正在写入的所有慢查询日志文件。

Note

show_compatibility_56系统变量的值会影响此选项的操作。有关详细信息,请参见第 5.1.7 节“服务器系统变量”中对该变量的描述。

此选项将当前线程的会话状态变量值添加到全局值,并将会话值重置为零。一些全局变量也可能会重置为零。它还会将密钥缓存的计数器(默认和命名)重置为零,并将Max_used_connections设置为当前打开的连接数。在调试查询时,此信息可能有用。参见第 1.7 节“如何报告错误或问题”

将所有每小时用户资源重置为零。这使达到每小时连接,查询或更新限制的 Client 端可以立即恢复活动。 FLUSH USER_RESOURCES不适用于由max_user_connections系统变量控制的最大同时连接数限制。参见第 6.2.16 节“设置帐户资源限制”

FLUSH TABLES 语法

FLUSH TABLES刷新 table,并根据所使用的变体获取锁。 FLUSH语句中使用的任何TABLES变体必须是唯一使用的选项。 FLUSH TABLEFLUSH TABLES的同义词。

Note

此处的指示通过关闭 table 进行刷新的描述适用于InnoDB,这与将 table 内容刷新到磁盘但保持打开状态不同。只要其他活动未修改 table 文件,这仍允许在 table 打开时复制 table 文件。

关闭所有打开的 table,强制关闭所有使用中的 table,并刷新查询缓存和准备好的语句缓存。 FLUSH TABLES还从查询缓存中删除所有查询结果,例如RESET QUERY CACHE语句。有关查询缓存和预准备语句缓存的信息,请参见第 8.10.3 节“ MySQL 查询缓存”。和第 8.10.4 节“准备好的语句和存储程序的缓存”

活跃的锁 table...阅读不允许FLUSH TABLES。要刷新和锁定 table,请改用刷新 tabletbl_name ...带读锁

具有一个或多个用逗号分隔的 table 名的列 table,该语句类似于FLUSH TABLES,没有名称,只是服务器仅刷新命名的 table。如果命名 table 不存在,则不会发生错误。

关闭所有打开的 table 并使用全局读取锁定锁定所有数据库的所有 table。如果您拥有可以及时拍摄快照的文件系统(例如 Veritas 或 ZFS),这是获取备份的一种非常方便的方法。使用UNLOCK TABLES解除锁定。

带读取锁的table获取全局读取锁定而不是 table 锁定,因此就 table 锁定和隐式提交而言,它与LOCK TABLESUNLOCK TABLES的行为不同:

在 MySQL 5.7.19 之前,带读取锁的table与 XA 事务不兼容。

带读取锁的table不会阻止服务器在日志 table 中插入行(请参阅第 5.4.1 节“选择常规查询日志和慢查询日志输出目标”)。

该语句刷新并获取命名 table 的读取锁。该语句首先获取 table 的独占元数据锁,因此它 await 打开这些 table 的事务完成。然后,该语句从 table 缓存中刷新 table,重新打开 table,获取 table 锁(如锁 table...阅读),并将元数据锁从排他锁降级为共享锁。语句获取锁定并降级元数据锁定后,其他会话可以读取但不能修改 table。

因为此语句获取 table 锁,所以除使用任何FLUSH语句所需的RELOAD特权外,每个 table 还必须具有LOCK TABLES特权。

该语句仅适用于现有的基本 table(非TEMPORARY)table.如果名称引用基本 table,则使用该 table.如果引用TEMPORARYtable,则将其忽略.如果名称适用于视图,则ER_WRONG_OBJECT错误否则发生ER_NO_SUCH_TABLE错误。

使用UNLOCK TABLES释放锁,使用LOCK TABLES释放锁并获取其他锁,或使用START TRANSACTION释放锁并开始新的 Transaction。

FLUSH TABLES变体使 table 可以在单个操作中被刷新和锁定。它提供了一种解决方法,用于限制存在有效锁 table...阅读时不允许FLUSH TABLES的限制。

该语句不会执行隐式的UNLOCK TABLES,因此,如果您在存在活动的LOCK TABLES的情况下使用该语句,或者在未先释放所获取的锁的情况下再次使用它,则会导致错误。

如果使用HANDLER打开了刷新 table,则处理程序将隐式刷新,并失去其位置。

FLUSH TABLES变体适用于InnoDB个 table。它确保已将对命名 table 的更改刷新到磁盘上,以便可以在服务器运行时进行二进制 table 副本的复制。

该语句的工作方式如下:

  • 它获取命名 table 的共享元数据锁。只要其他会话的活动事务已修改了这些 table 或为其持有 table 锁,该语句就会阻塞。获取锁后,该语句将阻止尝试更新 table 的事务,同时允许 continue 进行只读操作。

  • 它检查 table 的所有存储引擎是否都支持FOR EXPORT。如果没有,则发生ER_ILLEGAL_HA错误,并且语句失败。

  • 该语句通知每个 table 的存储引擎使 table 准备导出。存储引擎必须确保将所有未决的更 Rewrite 入磁盘。

  • 该语句将会话置于锁定 table 模式,以便在FOR EXPORT语句完成时不释放先前获取的元数据锁定。

冲洗 table...Export语句要求您对每个 table 都具有SELECT特权。因为此语句获取 table 锁,所以除使用任何FLUSH语句所需的RELOAD特权外,每个 table 还必须具有LOCK TABLES特权。

该语句仅适用于现有的基本(非TEMPORARY)table。如果名称引用基本 table,则使用该 table。如果它引用TEMPORARYtable,则将其忽略。如果名称适用于视图,则会发生ER_WRONG_OBJECT错误。否则,发生ER_NO_SUCH_TABLE错误。

InnoDB支持具有自己的.ibd file文件的 table(即启用innodb_file_per_table设置创建的 table)的FOR EXPORTInnoDB确保在收到FOR EXPORT语句通知时已将所有更改刷新到磁盘。这允许在FOR EXPORT语句有效时制作 table 内容的二进制副本,因为.ibd文件具有事务一致性,可以在服务器运行时进行复制。 FOR EXPORT不适用于InnoDB系统 table 空间文件或具有FULLTEXT索引的InnoDBtable。

分区InnoDBtable 支持冲洗 table...用于 Export

FOR EXPORT通知时,InnoDB将某些类型的数据写入磁盘,这些数据通常保存在 table 空间文件之外的内存或单独的磁盘缓冲区中。对于每个 table,InnoDB还会在与该 table 相同的数据库目录中生成一个名为table_name.cfg的文件。 .cfg文件包含稍后将 table 空间文件重新导入到相同或不同服务器中所需的元数据。

FOR EXPORT语句完成后,InnoDB将所有dirty pages刷新到 table 数据文件。刷新之前,所有change buffer条目都将合并。此时,table 已锁定并处于静止状态:table 在磁盘上处于事务一致状态,您可以将.ibdtable 空间文件以及相应的.cfg文件一起复制以获得这些 table 的一致快照。

有关将复制的 table 数据重新导入到 MySQL 实例中的过程,请参见第 14.6.1.3 节“导入 InnoDBtable”

处理完 table 后,使用UNLOCK TABLES释放锁,使用LOCK TABLES释放锁并获取其他锁,或使用START TRANSACTION释放锁并开始新的事务。

当这些语句中的任何一条在会话中生效时,尝试使用冲洗 table...Export会产生错误:

FLUSH TABLES ... WITH READ LOCK
FLUSH TABLES ... FOR EXPORT
LOCK TABLES ... READ
LOCK TABLES ... WRITE

当会话中的冲洗 table...Export有效时,尝试使用以下任何语句都会产生错误:

FLUSH TABLES WITH READ LOCK
FLUSH TABLES ... WITH READ LOCK
FLUSH TABLES ... FOR EXPORT