-
Notifications
You must be signed in to change notification settings - Fork 111
host_cache
-
host_cache表缓存连接到server的主机相关信息缓存,其中包含客户机主机名和IP地址信息,可以用于避免DNS查找。该表可以使用SELECT语句进行查询,但需要在server启动之前开启instruments(memory/sql/host_cache::hostname,默认关闭) ,关于主机缓存详见链接:https://dev.mysql.com/doc/refman/5.7/en/host-cache.html
-
host_cache表字段含义如下:
- IP:连接到server的客户端的IP地址,以字符串形式记录
- HOST:该客户端IP解析的DNS主机名,如果没有计息记录,则该字段为NULL
- HOST_VALIDATED:某个IP的客户端的'IP-主机名称-IP'的解析是否成功。如果HOST_VALIDATED为YES,则HOST列被当作与之相关的IP使用,以避免使用DNS解析。当HOST_VALIDATED为NO时,对于每个连会反复地尝试DNS解析,直到最终返回有效的解析结果或者返回一个错误。可以利用该信息来在server所使用的DNS服务器故障期间避免执行DNS解析
- SUM_CONNECT_ERRORS:该字段记录的连接错误数量被认为是“正在阻塞中”的连接数(此时你可能需要关注下max_connect_errors系统变量值,一旦该列值超过该变量的值,则后续的连接将直接被拒绝)。只对协议握手错误进行计数,并且仅对通过验证的主机(HOST_VALIDATED = YES)进行计数
- COUNT_HOST_BLOCKED_ERRORS:由于SUM_CONNECT_ERRORS超出了max_connect_errors系统变量的值而被阻塞的连接数
- COUNT_NAMEINFO_TRANSIENT_ERRORS:从IP到主机名称的DNS解析期间的短暂错误的数量,例如第一次解析失败,第二次解析成功
- COUNT_NAMEINFO_PERMANENT_ERRORS:从IP到主机名称DNS解析期间的永久性错误的数量,解析DNS直到不再尝试重新解析的错误
- COUNT_FORMAT_ERRORS:主机名格式错误的数量。 对于主机名(DNS中的主机名),MySQL不会在mysql.user表中重试执行与主机列匹配操作,例如:1.2.example.com(主机名部分是数字是错误的格式)。但是如果直接使用IP地址时则前缀是数字的不会被识别为错误格式,会使用IP格式匹配而不是DNS格式
- COUNT_ADDRINFO_TRANSIENT_ERRORS:从主机名称到IP反向DNS解析过程中的短暂错误数量
- COUNT_ADDRINFO_PERMANENT_ERRORS:从主机名称到IP反向DNS解析期间的永久性错误的数量
- COUNT_FCRDNS_ERRORS:DNS反向解析发生错误的数量。当IP-主机名称-IP的解析发生了解析的结果IP与发起请求的客户端原始IP不匹配时,就产后了这个错误
- COUNT_HOST_ACL_ERRORS:某个主机没有有权限的用户可登录server时,从这个主机尝试登录server会发生这个错误。在这种情况下,server返回ER_HOST_NOT_PRIVILEGED错误
- COUNT_NO_AUTH_PLUGIN_ERRORS:由于请求的身份验证插件不可用而导致的错误数量。例如:某个身份验证插件并未加载,那么这个插件被请求时就会发生这个错误
- COUNT_AUTH_PLUGIN_ERRORS:身份认证插件报告的错误数。验证插件可以报告不同的错误代码,以指出故障的根本原因。根据错误类型,相应地增加对应错误类型的错误计数列值(COUNT_AUTHENTICATION_ERRORS、COUNT_AUTH_PLUGIN_ERRORS、COUNT_HANDSHAKE_ERRORS),未知的插件错误在COUNT_AUTH_PLUGIN_ERRORS列中计数
- COUNT_HANDSHAKE_ERRORS:在握手协议级别检测到的错误数
- COUNT_PROXY_USER_ERRORS:代理用户A在代理不存在的另一用户B时检测到的错误数
- COUNT_PROXY_USER_ACL_ERRORS:当代理用户A被代理给另一个存在但是对于A没有PROXY权限的用户B时,检测到的错误数量
- COUNT_AUTHENTICATION_ERRORS:认证失败造成的错误次数
- COUNT_SSL_ERRORS:由于SSL问题导致的错误数量
- COUNT_MAX_USER_CONNECTIONS_ERRORS:超出每个用户连接配额造成的错误数
- COUNT_MAX_USER_CONNECTIONS_PER_HOUR_ERRORS:超出每用户连接每小时配额造成的错误数量
- COUNT_DEFAULT_DATABASE_ERRORS:与默认数据库相关的错误数。例如:数据库不存在或用户没有权限访问
- COUNT_INIT_CONNECT_ERRORS:由init_connect系统变量加载的文件中的语句执行失败引起的错误数
- COUNT_LOCAL_ERRORS:server本地执行相关操作时的错误数量,与网络、身份验证、授权无关的错误。例如,内存不足的情况属于这一类别
- COUNT_UNKNOWN_ERRORS:其他未知错误的数量,该列保留供将来使用
- FIRST_SEEN:对于某个IP客户端,第一次尝试连接发生的时间
- LAST_SEEN:对于某个IP客户端,最后一次尝试连接发生的时间
- FIRST_ERROR_SEEN:对于某个IP客户端,第一次尝试连接发生错误的时间
- LAST_ERROR_SEEN:对于某个IP客户端,最后一次尝试连接发生错误的时间
-
FLUSH HOSTS和TRUNCATE TABLE host_cache具有相同的效果:它们清除主机缓存。host_cache表被清空并解除阻塞任何因为错误记录数量超过限制而被阻塞的主机连接。FLUSH HOSTS需要RELOAD权限。 TRUNCATE TABLE需要host_cache表的DROP权限
-
表记录内容示例
root@localhost : performance_schema 10:35:47> select * from host_cache\G;
*************************** 1. row ***************************
IP: 192.168.2.122
HOST: NULL
HOST_VALIDATED: YES
SUM_CONNECT_ERRORS: 0
COUNT_HOST_BLOCKED_ERRORS: 0
COUNT_NAMEINFO_TRANSIENT_ERRORS: 0
COUNT_NAMEINFO_PERMANENT_ERRORS: 1
COUNT_FORMAT_ERRORS: 0
COUNT_ADDRINFO_TRANSIENT_ERRORS: 0
COUNT_ADDRINFO_PERMANENT_ERRORS: 0
COUNT_FCRDNS_ERRORS: 0
COUNT_HOST_ACL_ERRORS: 0
COUNT_NO_AUTH_PLUGIN_ERRORS: 0
COUNT_AUTH_PLUGIN_ERRORS: 0
COUNT_HANDSHAKE_ERRORS: 0
COUNT_PROXY_USER_ERRORS: 0
COUNT_PROXY_USER_ACL_ERRORS: 0
COUNT_AUTHENTICATION_ERRORS: 0
COUNT_SSL_ERRORS: 0
COUNT_MAX_USER_CONNECTIONS_ERRORS: 0
COUNT_MAX_USER_CONNECTIONS_PER_HOUR_ERRORS: 0
COUNT_DEFAULT_DATABASE_ERRORS: 0
COUNT_INIT_CONNECT_ERRORS: 0
COUNT_LOCAL_ERRORS: 0
COUNT_UNKNOWN_ERRORS: 0
FIRST_SEEN: 2017-12-30 22:34:51
LAST_SEEN: 2017-12-30 22:35:29
FIRST_ERROR_SEEN: 2017-12-30 22:34:51
LAST_ERROR_SEEN: 2017-12-30 22:34:51
1 row in set (0.00 sec)
- 表定义语句
CREATE TABLE `host_cache` (
`IP` varchar(64) NOT NULL,
`HOST` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
`HOST_VALIDATED` enum('YES','NO') NOT NULL,
`SUM_CONNECT_ERRORS` bigint(20) NOT NULL,
`COUNT_HOST_BLOCKED_ERRORS` bigint(20) NOT NULL,
`COUNT_NAMEINFO_TRANSIENT_ERRORS` bigint(20) NOT NULL,
`COUNT_NAMEINFO_PERMANENT_ERRORS` bigint(20) NOT NULL,
`COUNT_FORMAT_ERRORS` bigint(20) NOT NULL,
`COUNT_ADDRINFO_TRANSIENT_ERRORS` bigint(20) NOT NULL,
`COUNT_ADDRINFO_PERMANENT_ERRORS` bigint(20) NOT NULL,
`COUNT_FCRDNS_ERRORS` bigint(20) NOT NULL,
`COUNT_HOST_ACL_ERRORS` bigint(20) NOT NULL,
`COUNT_NO_AUTH_PLUGIN_ERRORS` bigint(20) NOT NULL,
`COUNT_AUTH_PLUGIN_ERRORS` bigint(20) NOT NULL,
`COUNT_HANDSHAKE_ERRORS` bigint(20) NOT NULL,
`COUNT_PROXY_USER_ERRORS` bigint(20) NOT NULL,
`COUNT_PROXY_USER_ACL_ERRORS` bigint(20) NOT NULL,
`COUNT_AUTHENTICATION_ERRORS` bigint(20) NOT NULL,
`COUNT_SSL_ERRORS` bigint(20) NOT NULL,
`COUNT_MAX_USER_CONNECTIONS_ERRORS` bigint(20) NOT NULL,
`COUNT_MAX_USER_CONNECTIONS_PER_HOUR_ERRORS` bigint(20) NOT NULL,
`COUNT_DEFAULT_DATABASE_ERRORS` bigint(20) NOT NULL,
`COUNT_INIT_CONNECT_ERRORS` bigint(20) NOT NULL,
`COUNT_LOCAL_ERRORS` bigint(20) NOT NULL,
`COUNT_UNKNOWN_ERRORS` bigint(20) NOT NULL,
`FIRST_SEEN` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`LAST_SEEN` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`FIRST_ERROR_SEEN` timestamp NULL DEFAULT '0000-00-00 00:00:00',
`LAST_ERROR_SEEN` timestamp NULL DEFAULT '0000-00-00 00:00:00'
) ENGINE=PERFORMANCE_SCHEMA DEFAULT CHARSET=utf8
-
host_cache表字段含义如下:
- IP:连接到server的客户端的IP地址,以字符串形式记录
- HOST:该客户端IP解析的DNS主机名,如果没有计息记录,则该字段为NULL
- HOST_VALIDATED:某个IP的客户端的'IP-主机名称-IP'的解析是否成功。如果HOST_VALIDATED为YES,则HOST列被当作与之相关的IP使用,以避免使用DNS解析。当HOST_VALIDATED为NO时,对于每个连会反复地尝试DNS解析,直到最终返回有效的解析结果或者返回一个错误。可以利用该信息来在server所使用的DNS服务器故障期间避免执行DNS解析
- SUM_CONNECT_ERRORS:该字段记录的连接错误数量被认为是“正在阻塞中”的连接数(此时你可能需要关注下max_connect_errors系统变量值,一旦该列值超过该变量的值,则后续的连接将直接被拒绝)。只对协议握手错误进行计数,并且仅对通过验证的主机(HOST_VALIDATED = YES)进行计数
- COUNT_HOST_BLOCKED_ERRORS:由于SUM_CONNECT_ERRORS超出了max_connect_errors系统变量的值而被阻塞的连接数
- COUNT_NAMEINFO_TRANSIENT_ERRORS:从IP到主机名称的DNS解析期间的短暂错误的数量,例如第一次解析失败,第二次解析成功
- COUNT_NAMEINFO_PERMANENT_ERRORS:从IP到主机名称DNS解析期间的永久性错误的数量,解析DNS直到不再尝试重新解析的错误
- COUNT_FORMAT_ERRORS:主机名格式错误的数量。 对于主机名(DNS中的主机名),MySQL不会在mysql.user表中重试执行与主机列匹配操作,例如:1.2.example.com(主机名部分是数字是错误的格式)。但是如果直接使用IP地址时则前缀是数字的不会被识别为错误格式,会使用IP格式匹配而不是DNS格式
- COUNT_ADDRINFO_TRANSIENT_ERRORS:从主机名称到IP反向DNS解析过程中的短暂错误数量
- COUNT_ADDRINFO_PERMANENT_ERRORS:从主机名称到IP反向DNS解析期间的永久性错误的数量
- COUNT_FCRDNS_ERRORS:DNS反向解析发生错误的数量。当IP-主机名称-IP的解析发生了解析的结果IP与发起请求的客户端原始IP不匹配时,就产后了这个错误
- COUNT_HOST_ACL_ERRORS:某个主机没有有权限的用户可登录server时,从这个主机尝试登录server会发生这个错误。在这种情况下,server返回ER_HOST_NOT_PRIVILEGED错误
- COUNT_NO_AUTH_PLUGIN_ERRORS:由于请求的身份验证插件不可用而导致的错误数量。例如:某个身份验证插件并未加载,那么这个插件被请求时就会发生这个错误
- COUNT_AUTH_PLUGIN_ERRORS:身份认证插件报告的错误数。验证插件可以报告不同的错误代码,以指出故障的根本原因。根据错误类型,相应地增加对应错误类型的错误计数列值(COUNT_AUTHENTICATION_ERRORS、COUNT_AUTH_PLUGIN_ERRORS、COUNT_HANDSHAKE_ERRORS),未知的插件错误在COUNT_AUTH_PLUGIN_ERRORS列中计数
- COUNT_HANDSHAKE_ERRORS:在握手协议级别检测到的错误数
- COUNT_PROXY_USER_ERRORS:代理用户A在代理不存在的另一用户B时检测到的错误数
- COUNT_PROXY_USER_ACL_ERRORS:当代理用户A被代理给另一个存在但是对于A没有PROXY权限的用户B时,检测到的错误数量
- COUNT_AUTHENTICATION_ERRORS:认证失败造成的错误次数
- COUNT_SSL_ERRORS:由于SSL问题导致的错误数量
- COUNT_MAX_USER_CONNECTIONS_ERRORS:超出每个用户连接配额造成的错误数
- COUNT_MAX_USER_CONNECTIONS_PER_HOUR_ERRORS:超出每用户连接每小时配额造成的错误数量
- COUNT_DEFAULT_DATABASE_ERRORS:与默认数据库相关的错误数。例如:数据库不存在或用户没有权限访问
- COUNT_INIT_CONNECT_ERRORS:由init_connect系统变量加载的文件中的语句执行失败引起的错误数
- COUNT_LOCAL_ERRORS:server本地执行相关操作时的错误数量,与网络、身份验证、授权无关的错误。例如,内存不足的情况属于这一类别
- COUNT_UNKNOWN_ERRORS:其他未知错误的数量,该列保留供将来使用
- FIRST_SEEN:对于某个IP客户端,第一次尝试连接发生的时间
- LAST_SEEN:对于某个IP客户端,最后一次尝试连接发生的时间
- FIRST_ERROR_SEEN:对于某个IP客户端,第一次尝试连接发生错误的时间
- LAST_ERROR_SEEN:对于某个IP客户端,最后一次尝试连接发生错误的时间
-
FLUSH HOSTS和TRUNCATE TABLE host_cache具有相同的效果:它们清除主机缓存。host_cache表被清空并解除阻塞任何因为错误记录数量超过限制而被阻塞的主机连接。FLUSH HOSTS需要RELOAD权限。 TRUNCATE TABLE需要host_cache表的DROP权限
-
PS:如果启动选项 skip_name_resolve 设置为ON,则该表不记录任何信息,因为该表的作用就是用于避免、加速域名解析用于,跳过域名解析功能时则该表记录的信息用途不大
-
参考链接:https://dev.mysql.com/doc/refman/5.7/en/host-cache-table.html
上一篇: status_by_account、status_by_host、status_by_user表 | 下一篇: performance_timers表
- 验证、测试、整理:罗小波
- QQ:309969177
- 提示:本系列文章的主体结构遵循Oracle MySQL 官方 5.7 手册中,关于information_schema、mysql schema、performance_schema、sys schema的章节结构体系,并额外添加了一些验证、测试数据。鉴于本人精力和能力有限,难免出现一些纰漏,欢迎大家踊跃指正!