FLUSH语句
FLUSH [NO_WRITE_TO_BINLOG |LOCAL ] { flush_option [, flush_option] ... | tables_option } flush_option: { BINARYLOGS |ENGINE LOGS |ERROR LOGS |GENERAL LOGS |HOSTS |LOGS |PRIVILEGES |OPTIMIZER_COSTS |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
语句具有多种变体形式,可以清除或重新加载各种内部缓存,刷新表或获取锁。要执行FLUSH
,您必须具有RELOAD
特权。特定的刷新选项可能需要其他特权,如稍后所述。
注意无法
FLUSH
在存储的函数或触发器中发出语句。但是,您可以FLUSH
在存储过程中使用,只要不从存储函数或触发器中调用它们即可。请参见“对存储程序的限制”。
默认情况下,服务器将FLUSH
语句写入二进制日志,以便它们复制到复制从属服务器。要禁止记录日志,请指定可选NO_WRITE_TO_BINLOG
关键字或其别名LOCAL
。
注意
FLUSH LOGS
,FLUSH BINARY LOGS
,FLUSH TABLES WITH READ LOCK
(带或不带表列表),并没有写入到二进制日志在任何情况下,因为如果复制到从它们会造成问题。FLUSH TABLES tbl_name... FOR EXPORT
该FLUSH
语句导致隐式提交。请参见“START TRANSACTION,COMMIT和ROLLBACK语句”。
所述中mysqladmin实用程序提供了一个命令行界面一些刷新操作,使用命令,如flush-hosts
,flush-logs
,flush-privileges
,flush-status
,和flush-tables
。请参见“mysqladmin-用于管理MySQL服务器的客户端”。
向服务器发送SIGHUP
或SIGUSR1
信号会导致发生若干刷新操作,这些操作与FLUSH
语句的各种形式相似。信号可以由root
服务器进程发送或由拥有服务器进程的帐户发送。它们使无需连接服务器即可执行适用的刷新操作(这些操作需要具有RELOAD
特权的帐户)。请参见“ MySQL中的Unix信号处理”。
该RESET
声明类似于FLUSH
。有关将语句与复制一起使用的信息,请参见“ RESET语句”RESET
。
以下列表描述了允许的FLUSH
语句flush_option
值。有关FLUSH TABLES
变体的说明,请参见 FLUSH TABLES语法。
FLUSH BINARY LOGS
关闭并重新打开服务器正在写入的任何二进制日志文件。如果启用了二进制日志记录,则二进制日志文件的序列号将相对于前一个文件增加一个。
FLUSH ENGINE LOGS
关闭并重新打开已安装的存储引擎的所有可刷新日志。这导致
InnoDB
将其日志刷新到磁盘。FLUSH ERROR LOGS
关闭并重新打开服务器正在写入的任何错误日志文件。
FLUSH GENERAL LOGS
关闭并重新打开服务器正在写入的任何常规查询日志文件。
FLUSH HOSTS
清空主机缓存和显示
host_cache
缓存内容的性能架构表,并取消阻止所有被阻塞的主机。请参见“ DNS查找优化和主机缓存”。如果您的某些主机更改了IP地址,或者对于来自合法主机的连接出现了错误消息,请刷新主机缓存。(请参见第B.4.2.5节,“主机'host_name'被阻止”。)当连接到MySQL服务器时,给定主机连续发生多个错误时,MySQL认为有问题,并阻止该主机进行进一步的连接请求。刷新主机缓存将启用来自主机的进一步连接尝试。默认值为 100。为避免出现此错误消息,请以较大的值启动服务器。
Host 'host_name' is blocked
max_connect_errors
max_connect_errors
max_connect_errors
FLUSH LOGS
关闭并重新打开服务器正在写入的任何日志文件。如果启用了二进制日志记录,则二进制日志文件的序列号将相对于前一个文件增加一个。如果启用了中继日志记录,则中继日志文件的序列号将相对于前一个文件增加一个。
FLUSH LOGS
对用于常规查询日志或慢速查询日志的表没有任何影响(请参见“选择常规查询日志和慢速查询日志输出目标”)。FLUSH OPTIMIZER_COSTS
重新读取成本模型表,以便优化器开始使用存储在其中的当前成本估算值。服务器会为任何无法识别的条目向错误日志中写入警告。(有关这些表的信息,请参见“优化器成本模型”。)此操作仅影响在刷新之后开始的会话。现有会话继续使用开始时的最新成本估算。
FLUSH PRIVILEGES
从
mysql
系统架构中的授权表重新加载特权。作为此操作的一部分,服务器读取global_grants
包含动态特权分配的表,并注册在其中找到的所有未注册特权。如果
--skip-grant-tables
在服务器启动时指定了禁用MySQL特权系统的选项,则FLUSH PRIVILEGES
提供一种在运行时启用特权系统的方法。FLUSH PRIVILEGES
重置登录失败跟踪(如果使用来启动服务器,则启用它--skip-grant-tables
)并解锁所有临时锁定的帐户。请参见“帐户密码管理”。释放内存缓存服务器作为的结果
GRANT
,CREATE USER
,CREATE SERVER
,和INSTALL PLUGIN
语句。该内存不能由相应的释放REVOKE
,DROP USER
,DROP SERVER
,和UNINSTALL PLUGIN
语句,所以执行该语句的许多情况下,这导致高速缓存,会出现在缓存内存使用的增加,除非它与释放服务器FLUSH PRIVILEGES
。清除
caching_sha2_password
身份验证插件使用的内存中缓存。请参阅 SHA-2可插拔身份验证的缓存操作。FLUSH RELAY LOGS[FOR CHANNEL channel]
关闭并重新打开服务器正在写入的任何中继日志文件。如果启用了中继日志记录,则中继日志文件的序列号将相对于前一个文件增加一个。
该子句使您可以命名该语句应用于哪个复制通道。执行以刷新特定复制通道的中继日志。如果没有命名通道,并且不存在额外的复制通道,则该语句将应用于默认通道。如果没有命名通道,并且存在多个复制通道,则该语句适用于所有复制通道。有关更多信息,请参见“复制通道”。
FOR CHANNEL channel
FLUSH RELAY LOGS FOR CHANNEL channel
FLUSH SLOW LOGS
关闭并重新打开服务器正在写入的所有慢查询日志文件。
FLUSH STATUS
此选项将所有活动会话的会话状态添加到全局状态变量,重置所有活动会话的状态,并重置断开连接的会话聚合的帐户,主机和用户状态值。请参见“性能模式状态变量表”。在调试查询时,此信息可能有用。
FLUSH USER_RESOURCES
将所有每小时用户资源重置为零。这使达到每小时连接,查询或更新限制的客户端可以立即恢复活动。
FLUSH USER_RESOURCES
不适用于由max_user_connections
系统变量控制的最大同时连接数限制。请参见“设置帐户资源限制”。
冲洗表语法
FLUSH TABLES
刷新表,并根据所使用的变体获取锁。语句中TABLES
使用的任何变体FLUSH
必须是唯一使用的选项。FLUSH TABLE
是的同义词FLUSH TABLES
。
注意此处的指示表通过关闭表进行刷新的描述适用于
InnoDB
,这与的描述不同,后者将表内容刷新到磁盘,但保持打开状态。只要其他活动不修改表文件,这仍然允许在表打开时复制表文件。
FLUSH TABLES
关闭所有打开的表,强制所有使用中的表关闭,并刷新准备好的语句缓存。有关预备语句缓存的信息,请参见“缓冲和缓存”。
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
具有相同的行为: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
不会阻止服务器在日志表中插入行(请参见“选择常规查询日志和慢查询日志输出目标”)。FLUSH TABLES tbl_name[,tbl_name]... WITH READ LOCK
该语句刷新并获取命名表的读取锁。该语句首先获取表的独占元数据锁,因此它等待打开这些表的事务完成。然后,该语句从表缓存中刷新表,重新打开表,获取表锁(如
LOCK TABLES ... READ
),并将元数据锁从排他锁降级为共享锁。语句获取锁并降级元数据锁后,其他会话可以读取但不能修改表。因为此语句获取表锁,所以
LOCK TABLES
除RELOAD
使用任何FLUSH
语句所需的特权外,您还必须具有每个表的特权。该语句仅适用于现有的基础(非
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
表。它确保已将对命名表的更改刷新到磁盘上,以便可以在服务器运行时进行二进制表副本的复制。该语句如下所示:
- 它获取命名表的共享元数据锁。只要其他会话的活动事务已修改了这些表或为其持有表锁,该语句就会阻塞。获取锁后,该语句将阻止尝试更新表的事务,同时允许继续进行只读操作。
- 它检查表的所有存储引擎是否都支持
FOR EXPORT
。如果没有,则发生ER_ILLEGAL_HA
错误,并且语句失败。 - 该语句通知每个表的存储引擎使表准备导出。存储引擎必须确保将所有未完成的更改写入磁盘。
- 该语句将会话置于锁定表模式,以便在
FOR EXPORT
语句完成时不会释放较早获取的元数据锁。
该
FLUSH TABLES ... FOR EXPORT
语句要求您具有SELECT
每个表的特权。因为此语句获取表锁,所以LOCK TABLES
除RELOAD
使用任何FLUSH
语句所需的特权外,您还必须具有每个表的特权。该语句仅适用于现有的基本(非
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
表。当收到通知时
FOR EXPORT
,InnoDB
将通常保存在表空间文件之外的内存或单独的磁盘缓冲区中的某些类型的数据写入磁盘。对于每个表,InnoDB
还会table_name.cfg
在与表相同的数据库目录中生成一个名为的文件。该.cfg
文件包含稍后将表空间文件重新导入到相同或不同服务器中所需的元数据。当
FOR EXPORT
语句完成,InnoDB
将有刷新所有脏页表中的数据文件。任何更改缓冲区条目在刷新之前都会合并。此时,表已锁定并处于静态状态:表在磁盘上处于事务一致状态,您可以将.ibd
表空间文件与相应.cfg
文件一起复制以获得这些表的一致快照。有关将复制的表数据重新导入到MySQL实例中的过程,请参见“导入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