文档首页
MySQL 9.0 参考手册
相关文档 下载本手册
PDF (US Ltr) - 40.0Mb
PDF (A4) - 40.1Mb
手册页 (TGZ) - 258.2Kb
手册页 (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 参考手册  /  ...  /  DNS 查找和主机缓存

7.1.12.3 DNS 查找和主机缓存

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

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

主机缓存操作

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

服务器将主机缓存用于多种目的

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

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

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

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

服务器以如下方式处理主机缓存中的条目

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

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

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

要解除被阻止主机的阻止,请刷新主机缓存;请参阅 处理被阻止的主机.

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

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

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

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

配置主机缓存

主机缓存默认情况下处于启用状态。 host_cache_size 系统变量控制其大小,以及公开缓存内容的 Performance Schema host_cache 表的大小。缓存大小可以在服务器启动时设置,也可以在运行时更改。例如,要在启动时将大小设置为 100,请将以下行放在服务器 my.cnf 文件中

[mysqld]
host_cache_size=200

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

SET GLOBAL host_cache_size=300;

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

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

要禁用 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 Schema host_cache 表公开了主机缓存的内容。可以使用 SELECT 语句检查此表,这可能有助于您诊断连接问题的根源。有关此表的信息,请参见 第 29.12.22.3 节,“host_cache 表”

刷新主机缓存

在以下情况下,刷新主机缓存可能是明智的或可取的

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

  • 来自合法主机的连接发生 Host 'host_name' is blocked 错误消息。(参见 处理被阻止的主机。)

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

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

  • 它会从公开缓存内容的 Performance Schema 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_errors 的默认值为 100。将 max_connect_errors 增加到一个较大的值,可以降低主机达到阈值并被阻止的可能性。但是,如果发生 Host 'host_name' is blocked 错误消息,请首先验证来自被阻止主机的 TCP/IP 连接是否正常。如果存在网络问题,增加 max_connect_errors 的值没有任何意义。