Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

MySQL 8.3 Reference Manual  /  ...  /  DNS Lookups and the Host Cache

7.1.12.3 DNS 查找和主机缓存

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

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

主机缓存操作

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

服务器使用主机缓存来实现多个目的:

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

  • 缓存包含客户端连接过程中的错误信息。一些错误被认为是 阻止。 如果来自同一主机的连续错误达到一定数量,而没有成功连接,服务器将阻止来自该主机的连接。max_connect_errors 系统变量确定了允许的连续错误次数之前阻止连接。

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

服务器使用 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 节,“主机缓存表”

要解除阻止的主机,请刷新主机缓存;见 处理阻止的主机

可能在不刷新主机缓存的情况下,blocked主机变为unblocked,因为来自其他主机的活动发生:

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

  • 如果丢弃的条目是blocked主机,那么该主机将变为unblocked。

一些连接错误与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表,并unblock任何blocked主机;见刷新主机缓存

要禁用DNS主机名查找,请在服务器启动时启用skip_name_resolve系统变量。在这种情况下,服务器将使用IP地址而不是主机名来匹配连接的主机与授权表中的行。只有在授权表中指定了客户端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节,“The host_cache Table”

刷新主机缓存

在以下情况下刷新主机缓存可能是可取的或必要的:

  • 一些客户端主机更改了IP地址。

  • 错误消息 主机 '主机名' 被阻止 在合法主机的连接中出现。(见 处理被阻止的主机。)

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

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

  • 它从性能模式 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 设置为较高的值,使得主机达到阈值并被阻止的可能性降低。但是,如果出现 主机 '主机名' 被阻止 错误消息,首先验证从被阻止的主机的 TCP/IP 连接是否正常。如果网络问题存在,增加 max_connect_errors 的值无济于事。