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 ()
系统调用。
服务器像这样处理主机缓存中的条目:
当第一个TCP客户端连接从给定的IP地址到达服务器时,将创建一个新的缓存条目来记录客户端IP、主机名和客户端查找验证标志。最初,主机名设置为
零
旗帜是假的。该条目还用于来自同一起始IP的后续客户端TCP连接。如果客户端IP表项的验证标志为false,则服务器尝试IP到主机的名称到IP的DNS解析。如果成功,则使用解析的主机名更新主机名,并将验证标志设置为true。如果解析失败,所采取的行动取决于错误是永久性的还是暂时性的。对于永久故障,主机名保留
零
验证标志设置为true。对于瞬时故障,主机名和验证标志保持不变。(在这种情况下,下一次客户端从此IP连接时,将出现另一个DNS解析尝试。)如果在处理来自给定IP地址的传入客户端连接时发生错误,服务器将更新该IP条目中相应的错误计数器。有关所记录错误的说明,请参见第27.12.21.2节,“host_cache表”。
要解除阻塞主机,刷新主机缓存;看到处理阻塞主机。
如果发生来自其他主机的活动,被阻塞的主机甚至不刷新主机缓存也可以被解除阻塞:
当来自不在缓存中的客户端IP的连接到达缓存时,如果缓存已满,服务器将丢弃最近使用最少的缓存条目,以便为新条目腾出空间。
如果丢弃的表项是一个阻塞的主机,那么该主机将被解除阻塞。
有些连接错误与TCP连接没有关联,发生在连接过程的早期(甚至在知道IP地址之前),或者不是特定于任何特定的IP地址(例如内存不足)。有关这些错误的信息,请检查connection_errors_
状态变量(见第5.1.10节,“服务器状态变量”)。xxx
默认情况下,主机缓存是启用的。的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;
性能模式host_cache
表公开了主机缓存的内容。此表可用来检查选择
语句,它可以帮助您诊断连接问题的原因。有关该表的信息,请参见第27.12.21.2节,“host_cache表”。
在以下情况下,刷新主机缓存可能是可取的或可取的:
您的一些客户端主机更改IP地址。
错误消息
主机的
发生在来自合法主机的连接上。(见处理阻塞主机)。主机名
“被阻塞
刷新主机缓存有以下效果:
它清除内存中的主机缓存。
它从性能模式中删除所有行
host_cache
公开缓存内容的表。它解除了所有被阻塞的主机。这允许从这些主机进行进一步的连接尝试。
要刷新主机缓存,请使用以下任何方法:
的值
host_cache_size
系统变量。这需要SYSTEM_VARIABLES_ADMIN
特权(或被弃用的极好的
特权)。执行一个
截断表
语句截断Performance Schemahost_cache
表格这需要下降
表的特权。执行一个mysqladmin flush hosts命令。这需要
下降
性能模式的权限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
如果有网络问题。