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_ERRORSIP 到主机名 DNS 解析期间的瞬态错误数。
COUNT_NAMEINFO_PERMANENT_ERRORSIP 到主机名 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_ERRORSinit_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 权限。截断该表会刷新主机缓存,其效果如刷新主机缓存中所述。