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列将用作对应的主机名,以避免额外的 DNS 调用。否则,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 个客户端尝试从该主机连接,none of them 将被阻止,因为SUM_CONNECT_ERRORS尚未达到 200。如果五个客户端的连接尝试失败,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 解析过程中的永久性错误数量。
-
格式错误计数主机名格式错误的数量。 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在 wire 协议级别检测到的错误数量。
-
COUNT_PROXY_USER_ERRORS检测到代理用户 A 被代理到不存在的用户 B 的错误数量。
-
COUNT_PROXY_USER_ACL_ERRORS检测到代理用户 A 被代理到存在的用户 B,但 A 没有
PROXY权限的错误数量。 -
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未知的其他错误数量,不包括表中的其他列。这一列保留供将来使用,以便在需要报告新错误条件时保持向后兼容性和表结构。
-
FIRST_SEEN客户端在
IP列中的第一个连接尝试的时间戳。 -
LAST_SEEN客户端在
IP列中的最新连接尝试的时间戳。 -
FIRST_ERROR_SEEN从
IP列中的客户端看到的第一个错误的时间戳。 -
LAST_ERROR_SEEN从
IP列中的客户端看到的最新错误的时间戳。
该 host_cache 表具有以下索引:
-
主键在 (
IP) 上 -
在 (
HOST) 上的索引
TRUNCATE TABLE 在 host_cache 表上是允许的。它需要表的 DROP 权限。截断表将刷新主机缓存,这将产生 刷新主机缓存 中描述的效果。