MySQL 服务器维护一个内存中的主机缓存,其中包含客户端主机名和 IP 地址信息,用于避免域名系统 (DNS) 查询。 host_cache
表公开了此缓存的内容。 host_cache_size
系统变量控制主机缓存的大小,以及 host_cache
表的大小。有关主机缓存的操作和配置信息,请参阅 第 7.1.12.3 节,“DNS 查询和主机缓存”。
由于 host_cache
表公开了主机缓存的内容,因此可以使用 SELECT
语句对其进行检查。这可能有助于您诊断连接问题的原因。
host_cache
表包含以下列:
IP
连接到服务器的客户端的 IP 地址,表示为字符串。
HOST
该客户端 IP 的解析后的 DNS 主机名,如果名称未知,则为
NULL
。HOST_VALIDATED
是否已针对客户端 IP 成功执行 IP 到主机名再到 IP 的 DNS 解析。如果
HOST_VALIDATED
为YES
,则HOST
列将用作与 IP 对应的域名,以便避免额外调用 DNS。当HOST_VALIDATED
为NO
时,每次连接尝试都会尝试进行 DNS 解析,直到最终完成(获得有效结果或永久错误)。此信息使服务器能够避免在临时 DNS 故障期间缓存错误或缺失的主机名,否则会永久对客户端产生负面影响。SUM_CONNECT_ERRORS
被视为““阻塞””(根据
max_connect_errors
系统变量进行评估)的连接错误数。仅计算协议握手错误,并且仅针对通过验证的主机 (HOST_VALIDATED = YES
)。一旦给定主机的
SUM_CONNECT_ERRORS
达到max_connect_errors
的值,则来自该主机的新连接将被阻止。SUM_CONNECT_ERRORS
值可能会超过max_connect_errors
值,因为当主机未被阻止时,来自该主机的多个连接尝试可能会同时发生。它们中的任何一个或全部都可能失败,从而独立地增加SUM_CONNECT_ERRORS
,并可能超过max_connect_errors
的值。假设
max_connect_errors
为 200,而给定主机的SUM_CONNECT_ERRORS
为 199。如果 10 个客户端尝试从该主机同时连接,则它们都不会被阻止,因为SUM_CONNECT_ERRORS
尚未达到 200。如果其中五个客户端发生阻塞错误,则每个客户端的SUM_CONNECT_ERRORS
都会增加 1,从而导致SUM_CONNECT_ERRORS
的结果值为 204。其他五个客户端会成功连接且不会被阻止,因为在它们的连接尝试开始时,SUM_CONNECT_ERRORS
的值尚未达到 200。在SUM_CONNECT_ERRORS
达到 200 之后开始来自该主机的新连接将被阻止。COUNT_HOST_BLOCKED_ERRORS
由于
SUM_CONNECT_ERRORS
超过max_connect_errors
系统变量的值而被阻止的连接数。COUNT_NAMEINFO_TRANSIENT_ERRORS
IP 到主机名 DNS 解析期间的瞬态错误数。
COUNT_NAMEINFO_PERMANENT_ERRORS
IP 到主机名 DNS 解析期间的永久错误数。
COUNT_FORMAT_ERRORS
主机名格式错误的数量。MySQL 不会将
mysql.user
系统表中Host
列的值与名称中一个或多个初始组件完全是数字的主机名进行匹配,例如1.2.example.com
。而是使用客户端 IP 地址。有关不进行此类匹配的原因,请参见第 8.2.4 节,“指定账户名”。COUNT_ADDRINFO_TRANSIENT_ERRORS
主机名到 IP 反向 DNS 解析期间的瞬时错误数。
COUNT_ADDRINFO_PERMANENT_ERRORS
主机名到 IP 反向 DNS 解析期间的永久错误数。
COUNT_FCRDNS_ERRORS
正向确认的反向 DNS 错误数。当 IP 到主机名到 IP 的 DNS 解析生成的 IP 地址与客户端来源 IP 地址不匹配时,就会发生这些错误。
COUNT_HOST_ACL_ERRORS
由于不允许任何用户从客户端主机连接而发生的错误数。在这种情况下,服务器会返回
ER_HOST_NOT_PRIVILEGED
,甚至不会要求输入用户名或密码。COUNT_NO_AUTH_PLUGIN_ERRORS
由于请求不可用的身份验证插件而导致的错误数。例如,如果插件从未加载或加载尝试失败,则该插件可能不可用。
COUNT_AUTH_PLUGIN_ERRORS
身份验证插件报告的错误数。
身份验证插件可以报告不同的错误代码,以指示失败的根本原因。根据错误类型,以下列之一会增加:
COUNT_AUTHENTICATION_ERRORS
、COUNT_AUTH_PLUGIN_ERRORS
、COUNT_HANDSHAKE_ERRORS
。新的返回代码是对现有插件 API 的可选扩展。未知或意外的插件错误会在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
超过每用户连接配额导致的错误数。请参见第 8.2.21 节,“设置账户资源限制”。
COUNT_MAX_USER_CONNECTIONS_PER_HOUR_ERRORS
超过每用户每小时连接配额导致的错误数。请参见第 8.2.21 节,“设置账户资源限制”。
COUNT_DEFAULT_DATABASE_ERRORS
与默认数据库相关的错误数。例如,数据库不存在或用户没有访问它的权限。
COUNT_INIT_CONNECT_ERRORS
init_connect
系统变量值中的语句执行失败导致的错误数。COUNT_LOCAL_ERRORS
服务器实现本地的错误数,与网络、身份验证或授权无关。例如,内存不足情况属于此类别。
COUNT_UNKNOWN_ERRORS
此表中其他列未统计的其他未知错误数。此列保留供将来使用,以防需要报告新的错误情况,并且需要保留
host_cache
表的向后兼容性和结构。FIRST_SEEN
从
IP
列中的客户端看到的第一次连接尝试的时间戳。LAST_SEEN
从
IP
列中的客户端看到的最近一次连接尝试的时间戳。FIRST_ERROR_SEEN
从
IP
列中的客户端看到的第一个错误的时间戳。LAST_ERROR_SEEN
从
IP
列中的客户端看到的最近一次错误的时间戳。
host_cache
表具有以下索引:
(
IP
)上的主键(
HOST
)上的索引
TRUNCATE TABLE
允许用于 host_cache
表。它需要对该表的 DROP
权限。截断该表会刷新主机缓存,其效果如刷新主机缓存中所述。