29.12.22.3 host_cache 表
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的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
值,因为多个连接尝试可能同时从未被阻止的主机发生,而这些主机正在进行DNS解析。任何或所有尝试都可能失败,独立地增加SUM_ CONNECT_ERRORS
,有可能超过max_ connect_errors
的值。假设系统变量
max_ connect_errors
为200,SUM_ CONNECT_ERRORS
对于给定主机为199。如果10个客户端同时尝试从该主机连接,那么没有任何人被阻止,因为SUM_ CONNECT_ERRORS
尚未达到200。若5个客户端的连接尝试出现阻塞错误,SUM_ CONNECT_ERRORS
每个客户端增加1,结果SUM_ CONNECT_ERRORS
值为204。其他5个客户端成功连接并未被阻止,因为当它们的连接尝试开始时,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 代理到存在但用户 B 对 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
权限。截断表将清空主机缓存,这些效果在 清空主机缓存 中有详细说明。