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
权限。截断表将刷新主机缓存,这将产生 刷新主机缓存 中描述的效果。