如何调用flush
用户需要reload权限,其语法为 flush flush_option,其中flush_option有如下候选值:
Privileges:重新加载grant tables,当使用create user/grant/revoke等涉及用户权限命令时会自动调用该命令,而如果使用DML更新grant tables,则需要手工调用该命令;
mysql会缓存grant/create user等语句且不会因为revoke/drop user而释放,故当执行大量类似语句后可调用flush privileges释放内存
Tables:关闭所有当前open的表并清空query cache(=reset query cache),可以限定候选表flush tables tbl_name[,tbl_name ..,];
其中flush tables with read lock获取全局读锁以锁定所有表,备份时经常用到,须使用unlock tables释放该锁;
而flush tables tbl_name[,tbl_name ..,] with read lock则获取相应的表锁,首先获取该表的排他锁,等待现有的事务提交后,清空该表缓存并重新以共享锁模式将其打开
Hosts:清空host cache,当主机更改IP或者遭遇”Host ‘host_name’is blocked”错误时使用;
参数max_connect_errors决定了mysql允许一个主机的最大失败连接次数,当超过此值时该主机发起的连接将被阻塞并遭遇前面提及的错误信息,此时唯一的解决办法时调用flush hosts清除 host cache;
Mysql使用host_cache缓存来自远程客户端TCP连接的IP和主机名以及相应错误信息,用以避免DNS解析,采用LRU管理;
对于客户端连接,mysql使用IP地址检验其主机名是否位于host cache中,如果没有,则先将IP解析成主机名然后将主机反向解析成IP(类似TCP/IP的3次握手);
如果来自某一主机的连接失败次数达到max_connect_errors,则其后续连接会被阻塞并遭遇Host 'host_name' is blocked,此时可调用flush hosts清空缓存;
Host cache大小由 host_cache_size决定,可设置为0以禁用;也可通过—skip-name-resolve禁用DNS,mysql只使用IP来匹配grant table,当DNS很慢时可选择使用;--skip-networking则彻底禁用TCP/IP连接;
在进行解析时服务器会先尝试使用gethostbyaddr_r()/gethostbyname_r(),如果OS不支持则改用gethostbyaddr()/gethostbyname(),后者会请求锁定mutex即不能并发执行;
5.6.5引入host_cache表存储上述信息,truncate table host_cache与flush hosts效果一样;
生产库应该尽量设置skip_name_resolve以避免对DNS的依赖,当DNS不能正常工作时,会导致客户端无法通过TCP正常连接数据库;此外开启该功能有可能招致DoS攻击;
http://www.mysqlperformanceblog.com/2008/05/31/dns-achilles-heel-mysql-installation/
Logs:关闭所有的日志文件,然后创建一个新的并打开,而5.5.3以后其语法为flush [log_type] logs,其中log_type包含如下
5.5.7只是关闭并重新打开日志文件,而之前的版本则是将原文件重命名为-old并打开一个新的文件,如果连续运行两次则最早的-old则被覆盖
unix下当mysql服务器接受到SIGHUP信号时会执行同等命令;
https://dev.mysql.com/doc/refman/5.5/en/error-log.html
Query cache:整理query cache中的碎片,并不清空其中的内容;
Query cache存储sql文本以及其查询结果,类似oracle的result cache,节省了sql解析和执行时间,
Status:将当前线程的会话状态变量值添加至全局变量,然后将会话值重置为0 ;当debug query需要用到
User_resources:将用户per-hour资源重置为0
Master:删除所有二进制日志,已经为reset master所取代,mysql 5.6已不支持该命令
Slave:以被reset slave取代,5.6起不再支持