Documentation Home

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
  | 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-hostsflush-logsflush-privilegesflush-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 语法

仅在 MySQL 5.6.11 中,gtid_next 必须AUTOMATIC在发出此语句之前设置为。(错误#16062608、错误#16715809、错误#69045)

刷新表语法

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

笔记

此处指示通过关闭表来刷新表的描述不同地适用于InnoDB,它将表内容刷新到磁盘但使它们保持打开状态。这仍然允许在表打开时复制表文件,只要其他活动不修改它们即可。

  • FLUSH TABLES

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

    FLUSH TABLES存在活动时不允许 LOCK TABLES ... READ。要刷新和锁定表,请 改用。 FLUSH TABLES tbl_name ... WITH READ LOCK

  • FLUSH TABLES tbl_name [, tbl_name] ...

    对于一个或多个以逗号分隔的表名的列表,此操作类似于FLUSH TABLES没有名称,只是服务器仅刷新指定的表。如果命名表不存在,则不会发生错误。

  • FLUSH TABLES WITH READ LOCK

    关闭所有打开的表并使用全局读锁锁定所有数据库的所有表。

    如果您有 Veritas 或 ZFS 等可以及时拍摄快照的文件系统,此操作是获取备份的一种非常方便的方法。用于 UNLOCK TABLES解除锁定。

    FLUSH TABLES WITH READ LOCK 获取全局读锁而不是表锁,因此它不受与表锁定和隐式提交相同的行为的 LOCK TABLES约束 UNLOCK TABLES

    FLUSH TABLES WITH READ LOCK 与 XA 事务不兼容。

    FLUSH TABLES WITH READ LOCK 不会阻止服务器将行插入日志表(请参阅第 5.4.1 节,“选择一般查询日志和慢速查询日志输出目的地”)。

  • FLUSH TABLES tbl_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 TABLES tbl_name [, tbl_name] ... FOR EXPORT

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

    因为该 FLUSH TABLES ... FOR EXPORT操作获取表上的锁以准备导出它们,所以 除了特权之外,它还需要每个表 的LOCK TABLES和 特权。 SELECTRELOAD

    操作是这样的:

    1. 它获取命名表的共享元数据锁。只要其他会话具有已修改这些表或为它们持有表锁的活动事务,该操作就会阻塞。获取锁后,该操作会阻止尝试更新表的事务,同时允许只读操作继续进行。

    2. 它检查表的所有存储引擎是否支持FOR EXPORT. 如果没有, ER_ILLEGAL_HA则会发生错误并且操作失败。

    3. 该操作通知每个表的存储引擎使表准备好导出。存储引擎必须确保任何挂起的更改都写入磁盘。

    4. 该操作将会话置于锁表模式,以便在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 EXPORTInnoDB将通常保存在内存中或表空间文件外的单独磁盘缓冲区中的某些类型的数据写入磁盘。对于每个表, 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