Documentation Home
MySQL 8.0 参考手册  / 第 5 章 MySQL 服务器管理  / 5.1 MySQL 服务器  / 5.1.12 连接管理  /  5.1.12.3 DNS 查找和主机缓存

5.1.12.3 DNS 查找和主机缓存

MySQL 服务器维护一个内存中的主机缓存,其中包含有关客户端的信息:IP 地址、主机名和错误信息。Performance Schema host_cache表公开了主机缓存的内容,以便可以使用 SELECT语句对其进行检查。这可能有助于您诊断连接问题的原因。请参阅 第 27.12.21.2 节,“host_cache 表”

以下部分讨论主机缓存的工作原理,以及其他主题,例如如何配置和监控缓存。

主机缓存操作

服务器仅将主机缓存用于非本地主机 TCP 连接。127.0.0.1对于使用环回接口地址(例如,或::1)建立的 TCP 连接,或使用 Unix 套接字文件、命名管道或共享内存建立的连接, 它不使用缓存 。

服务器使用主机缓存有几个目的:

  • 通过缓存 IP 到主机名查找的结果,服务器避免为每个客户端连接执行域名系统 (DNS) 查找。相反,对于给定的主机,它只需要为来自该主机的第一个连接执行查找。

  • 缓存包含有关客户端连接过程中发生的错误的信息。有些错误被认为是阻塞”。如果在没有成功连接的情况下从给定主机连续发生太多此类连接,则服务器会阻止来自该主机的进一步连接。max_connect_errors系统变量确定发生阻塞之前允许的连续错误数 。

对于每个适用的新客户端连接,服务器使用客户端 IP 地址来检查客户端主机名是否在主机缓存中。如果是,则服务器根据主机是否被阻止而拒绝或继续处理连接请求。如果主机不在缓存中,服务器将尝试解析主机名。首先,它将 IP 地址解析为主机名,然后将该主机名解析回 IP 地址。然后它将结果与原始 IP 地址进行比较,以确保它们相同。服务器将有关此操作结果的信息存储在主机缓存中。如果缓存已满,则丢弃最近最少使用的条目。

gethostbyaddr()服务器使用和 gethostbyname()系统调用 执行主机名解析 。

服务器像这样处理主机缓存中的条目:

  1. 当第一个 TCP 客户端连接从给定的 IP 地址到达服务器时,将创建一个新的缓存条目来记录客户端 IP、主机名和客户端查找验证标志。最初,主机名设置为 NULL并且标志为 false。此条目还用于来自同一原始 IP 的后续客户端 TCP 连接。

  2. 如果客户端 IP 条目的验证标志为 false,服务器将尝试 IP 到主机名到 IP 的 DNS 解析。如果成功,主机名将更新为已解析的主机名,并将验证标志设置为 true。如果解决不成功,采取的措施取决于错误是永久性的还是暂时性的。对于永久性故障,主机名保留 NULL并且验证标志设置为 true。对于暂时性故障,主机名和验证标志保持不变。(在这种情况下,下次客户端从此 IP 连接时会尝试进行另一次 DNS 解析。)

  3. 如果在处理来自给定 IP 地址的传入客户端连接时发生错误,服务器会更新该 IP 条目中的相应错误计数器。有关记录的错误的说明,请参阅 第 27.12.21.2 节,“host_cache 表”

要取消阻止被阻止的主机,请刷新主机缓存;请参阅 处理被阻止的主机

如果发生来自其他主机的活动,即使不刷新主机缓存,被阻止的主机也有可能解除阻止:

  • 如果当连接来自不在缓存中的客户端 IP 时缓存已满,服务器会丢弃最近最少使用的缓存条目以为新条目腾出空间。

  • 如果丢弃的条目是针对被阻止的主机,则该主机将被解除阻止。

一些连接错误与 TCP 连接无关,发生在连接过程的早期(甚至在 IP 地址已知之前),或者不特定于任何特定的 IP 地址(例如内存不足的情况)。有关这些错误的信息,请检查 状态变量(请参阅 第 5.1.10 节,“服务器状态变量”)。 Connection_errors_xxx

配置主机缓存

默认情况下启用主机缓存。系统变量控制其 host_cache_size大小,以及host_cache 公开缓存内容的性能模式表的大小。缓存大小可以在服务器启动时设置并在运行时更改。例如,要在启动时将大小设置为 100,请将这些行放在服务器 my.cnf文件中:

[mysqld]
host_cache_size=200

要在运行时将大小更改为 300,请执行以下操作:

SET GLOBAL host_cache_size=300;

host_cache_size在服务器启动时或运行时 设置为 0 会禁用主机缓存。禁用缓存后,服务器会在每次客户端连接时执行 DNS 查找。

在运行时更改缓存大小会导致隐式主机缓存刷新操作,该操作会清除主机缓存、截断host_cache表并取消阻止任何被阻止的主机;请参阅 刷新主机缓存

使用该--skip-host-cache 选项类似于将 host_cache_size系统变量设置为 0,但 host_cache_size更灵活,因为它还可以用于在运行时调整、启用和禁用主机缓存,而不仅仅是在服务器启动时。使用 启动服务器 --skip-host-cache不会阻止对 值的运行时更改 host_cache_size,但此类更改没有任何效果,即使 host_cache_size设置大于 0,也不会重新启用缓存。

要禁用 DNS 主机名查找,请在 skip_name_resolve启用系统变量的情况下启动服务器。在这种情况下,服务器仅使用 IP 地址而不使用主机名来将连接主机与 MySQL 授权表中的行相匹配。只能使用在这些表中使用 IP 地址指定的帐户。(如果不存在指定客户端 IP 地址的帐户,则客户端可能无法连接。)

如果您的 DNS 速度非常慢并且有许多主机,您可以通过启用 skip_name_resolve禁用 DNS 查找或增加 的值 host_cache_size以使主机缓存更大来提高性能。

要完全禁止 TCP/IP 连接,请在skip_networking启用系统变量的情况下启动服务器。

要在发生主机阻塞之前调整允许的连续连接错误数,请设置 max_connect_errors系统变量。例如,要在启动时设置值,请将这些行放在服务器my.cnf文件中:

[mysqld]
max_connect_errors=10000

要在运行时更改值,请执行以下操作:

SET GLOBAL max_connect_errors=10000;
监控主机缓存

Performance Schemahost_cache 表公开了主机缓存的内容。可以使用SELECT 语句检查此表,这可以帮助您诊断连接问题的原因。有关此表的信息,请参阅 第 27.12.21.2 节,“host_cache 表”

刷新主机缓存

在这些情况下,刷新主机缓存可能是可取的或可取的:

  • 您的某些客户端主机更改了 IP 地址。

  • 来自合法主机的连接会出现 错误消息。(请参阅处理被阻止的主机。) Host 'host_name' is blocked

刷新主机缓存具有以下效果:

  • 它清除内存中的主机缓存。

  • host_cache它从公开缓存内容的性能模式表中 删除所有行 。

  • 它取消阻止任何被阻止的主机。这使得来自这些主机的进一步连接尝试成为可能。

要刷新主机缓存,请使用以下任一方法:

处理被阻止的主机

服务器使用主机缓存来跟踪客户端连接过程中发生的错误。如果出现如下错误,说明mysqld收到了很多来自给定主机的连接请求,中间中断了:

Host 'host_name' is blocked because of many connection errors.
Unblock with 'mysqladmin flush-hosts'

系统变量的值 max_connect_errors确定服务器在阻止主机之前允许多少连续中断的连接请求。在 max_connect_errors没有成功连接的请求失败后,服务器会认为出现了问题(例如,有人试图闯入),并阻止主机进一步的连接请求。

要取消阻止被阻止的主机,请刷新主机缓存;请参阅 刷新主机缓存

或者,为避免出现错误消息,请 max_connect_errors按照配置主机缓存中的说明进行设置。的默认值为 max_connect_errors100。max_connect_errors 增加到较大的值可降低主机达到阈值并被阻止的可能性。但是,如果出现 错误消息,请首先确认来自被阻止主机的 TCP/IP 连接没有任何问题。如果有网络问题 ,增加值没有好处 。Host 'host_name' is blockedmax_connect_errors