10bet官方网站文档家里
MySQL 8.0参考手册
相关的文档10bet官方网站 本手册下载 本手册摘录

5.1.12.3 DNS解析与主机缓存

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

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

主机缓存操作

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

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

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

  • 缓存包含有关客户端连接过程中发生的错误的信息。考虑到一些误差阻塞。如果在没有成功连接的情况下,从一个给定主机连续发生过多的此类事件,服务器将阻塞从该主机的进一步连接。的max_connect_errors系统变量决定阻塞发生之前允许的连续错误数。

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

属性执行主机名解析gethostbyaddr ()gethostbyname ()系统调用。

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

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

  2. 如果客户端IP表项的验证标志为false,则服务器尝试IP到主机的名称到IP的DNS解析。如果成功,则使用解析的主机名更新主机名,并将验证标志设置为true。如果解析失败,所采取的行动取决于错误是永久性的还是暂时性的。对于永久故障,主机名保留验证标志设置为true。对于瞬时故障,主机名和验证标志保持不变。(在这种情况下,下一次客户端从此IP连接时,将出现另一个DNS解析尝试。)

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

要解除阻塞主机,刷新主机缓存;看到处理阻塞主机

如果发生来自其他主机的活动,被阻塞的主机甚至不刷新主机缓存也可以被解除阻塞:

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

  • 如果丢弃的表项是一个阻塞的主机,那么该主机将被解除阻塞。

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

配置主机缓存

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

(mysqld) host_cache_size = 200

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

集全球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

要在运行时更改值,可以这样做:

集全球max_connect_errors = 10000;
监控主机Cache

性能模式host_cache表公开了主机缓存的内容。此表可用来检查选择语句,它可以帮助您诊断连接问题的原因。有关该表的信息,请参见第27.12.21.2节,“host_cache表”

刷新主机缓存

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

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

  • 错误消息主机的主机名“被阻塞发生在来自合法主机的连接上。(见处理阻塞主机)。

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

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

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

  • 它解除了所有被阻塞的主机。这允许从这些主机进行进一步的连接尝试。

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

处理阻塞主机

服务器使用主机缓存来跟踪客户端连接过程中发生的错误。如果出现以下错误,则表示mysqld从给定的主机接收到许多连接请求,这些请求在中间被中断:

主机的主机名由于许多连接错误而被阻塞。使用mysqladmin flush-hosts解除阻塞

的价值max_connect_errors系统变量决定了在阻塞一台主机之前,服务器允许多少个连续中断的连接请求。后max_connect_errors如果请求失败而没有成功连接,服务器就会认为发生了错误(例如,有人试图入侵),并阻止主机进行进一步的连接请求。

要解除阻塞主机,刷新主机缓存;看到刷新主机缓存

或者,为了避免出现错误消息,可以设置max_connect_errors中描述的配置主机缓存。的默认值max_connect_errors是100。增加max_connect_errors设置一个较大的值可以减少主机达到阈值并阻塞的可能性。然而,如果主机的主机名“被阻塞出现错误消息时,首先验证来自被阻塞主机的TCP/IP连接没有错误。它无益于增加价值max_connect_errors如果有网络问题。