Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


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 操作都需要其描述中所示的权限。

Note

不能在存储函数或触发器中发出FLUSH 语句。然而,您可以在存储程序中使用FLUSH,只要这些存储程序不被存储函数或触发器调用。见第27.8节,“存储程序限制”

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

Note

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 服务器管理程序”.

将服务器发送一个SIGHUPSIGUSR1信号,会导致多个 flush 操作发生,这些操作类似于FLUSH语句的各种形式。信号可以由root系统账户或服务器进程所有者账户发送。这使得flush 操作可以不需要连接到服务器,且需要具有执行这些操作的 MySQL 账户权限。见第6.10节,“MySQL 中 Unix 信号处理”

RESET 语句类似于FLUSH。见第15.7.8.6节,“ RESET 语句”,了解如何使用RESET 与复制。

以下是允许的FLUSH 语句flush_option 值列表。关于允许的tables_option 值描述,见FLUSH TABLES 语法

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

Note

这里指示关闭表的描述对 InnoDB 不同,它将表内容刷新到磁盘,但保持表打开。这仍然允许在表打开时复制表文件,只要其他活动不修改它们。

  • FLUSH TABLES

    关闭所有打开的表,强制使用中的所有表关闭,并刷新预准备语句缓存。

    该操作需要FLUSH_TABLESRELOAD权限。

    关于预准备语句缓存的信息,请参见第10.10.3节,“预准备语句和存储程序缓存”

    FLUSH TABLES在存在活动LOCK TABLES ... 读时不允许。要flush和锁定表,使用FLUSH TABLES tbl_name ... WITH 读锁定

  • FLUSH TABLES tbl_name [, tbl_name] ...

    带有一个或多个逗号分隔的表名列表,该操作类似于FLUSH TABLES没有名称,服务器只flush指定的表。如果指定的表不存在,不会出现错误。

    该操作需要FLUSH_TABLESRELOAD权限。

  • FLUSH TABLES WITH READ LOCK

    关闭所有打开的表并锁定所有数据库中的表,以全局读锁定的方式。

    该操作需要FLUSH_TABLESRELOAD特权。

    该操作是获取备份的非常方便的方式,如果您使用了可以在时间点拍摄快照的文件系统,如Veritas或ZFS。使用UNLOCK TABLES释放锁定。

    FLUSH TABLES WITH READ LOCK获取全局读锁定,而不是表锁定,因此它不受LOCK TABLESUNLOCK TABLES的表锁定和隐式提交行为影响:

    FLUSH TABLES WITH READ LOCK 不会阻止服务器插入日志表(见第7.4.1节,“选择通用查询日志和慢查询日志输出目的地”)。

  • FLUSH TABLES tbl_name [, tbl_name] ... WITH READ LOCK

    flush并获取读锁定对名表。

    该操作需要FLUSH_TABLESRELOAD特权。因为它获取表锁定,同样需要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 TABLESLOCK TABLES的情况下执行操作,或者第二次执行该操作而没有首先释放锁定,则会出现错误。

    如果使用HANDLER打开了flush过的表,handler将隐式flush并失去其位置。

  • FLUSH TABLES tbl_name [, tbl_name] ... FOR EXPORT

    这个FLUSH TABLES变体适用于InnoDB表,它确保了对名表的更改已经刷新到磁盘,以便在服务器运行时可以进行二进制表复制。

    这个操作需要FLUSH_TABLESRELOAD特权。因为它在准备导出表时获取锁定,因此也需要对每个表的LOCK TABLESSELECT特权。

    这个操作的工作方式是:

    1. 它获取共享元数据锁定对应的表。操作会阻塞,直到其他会话中的活动事务修改了这些表或持有表锁定为止。当锁定被获取时,操作将阻塞更新表的事务,而允许只读操作继续。

    2. 它检查所有存储引擎是否支持FOR EXPORT。如果任何不支持,一个ER_ILLEGAL_HA错误发生,操作失败。

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

    4. 操作将会话置于锁定表模式,以便获取的元数据锁定在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