MySQL 服务器维护一个内存中的主机缓存,其中包含有关客户端的信息:IP 地址、主机名和错误信息。Performance Schema
host_cache
表公开了主机缓存的内容,以便可以使用
SELECT
语句对其进行检查。这可能有助于您诊断连接问题的原因。请参阅
第 25.12.16.1 节,“host_cache 表”。
以下部分讨论主机缓存的工作原理,以及其他主题,例如如何配置和监控缓存。
服务器仅将主机缓存用于非本地主机 TCP 连接。127.0.0.1
对于使用环回接口地址(例如,或::1
)建立的 TCP 连接,或使用 Unix 套接字文件、命名管道或共享内存建立的连接,
它不使用缓存
。
服务器使用主机缓存有几个目的:
通过缓存 IP 到主机名查找的结果,服务器避免为每个客户端连接执行域名系统 (DNS) 查找。相反,对于给定的主机,它只需要为来自该主机的第一个连接执行查找。
缓存包含有关客户端连接过程中发生的错误的信息。有些错误被认为是“阻塞”。”如果在没有成功连接的情况下从给定主机连续发生太多此类连接,则服务器会阻止来自该主机的进一步连接。
max_connect_errors
系统变量确定发生阻塞之前允许的连续错误数 。
对于每个适用的新客户端连接,服务器使用客户端 IP 地址来检查客户端主机名是否在主机缓存中。如果是,则服务器根据主机是否被阻止而拒绝或继续处理连接请求。如果主机不在缓存中,服务器将尝试解析主机名。首先,它将 IP 地址解析为主机名,然后将该主机名解析回 IP 地址。然后它将结果与原始 IP 地址进行比较,以确保它们相同。服务器将有关此操作结果的信息存储在主机缓存中。如果缓存已满,则丢弃最近最少使用的条目。
gethostbyaddr()
服务器使用和
gethostbyname()
系统调用
执行主机名解析
。
服务器像这样处理主机缓存中的条目:
当第一个 TCP 客户端连接从给定的 IP 地址到达服务器时,将创建一个新的缓存条目来记录客户端 IP、主机名和客户端查找验证标志。最初,主机名设置为
NULL
并且标志为 false。此条目还用于来自同一原始 IP 的后续客户端 TCP 连接。如果客户端 IP 条目的验证标志为 false,服务器将尝试 IP 到主机名到 IP 的 DNS 解析。如果成功,主机名将更新为已解析的主机名,并将验证标志设置为 true。如果解决不成功,采取的措施取决于错误是永久性的还是暂时性的。对于永久性故障,主机名保留
NULL
并且验证标志设置为 true。对于暂时性故障,主机名和验证标志保持不变。(在这种情况下,下次客户端从此 IP 连接时会尝试进行另一次 DNS 解析。)如果在处理来自给定 IP 地址的传入客户端连接时发生错误,服务器会更新该 IP 条目中的相应错误计数器。有关记录的错误的说明,请参阅 第 25.12.16.1 节,“host_cache 表”。
要取消阻止被阻止的主机,请刷新主机缓存;请参阅 处理被阻止的主机。
如果发生来自其他主机的活动,即使不刷新主机缓存,被阻止的主机也有可能解除阻止:
如果当连接来自不在缓存中的客户端 IP 时缓存已满,服务器会丢弃最近最少使用的缓存条目以为新条目腾出空间。
如果丢弃的条目是针对被阻止的主机,则该主机将被解除阻止。
一些连接错误与 TCP 连接无关,发生在连接过程的早期(甚至在 IP 地址已知之前),或者不特定于任何特定的 IP 地址(例如内存不足的情况)。有关这些错误的信息,请检查
状态变量(请参阅
第 5.1.9 节,“服务器状态变量”)。
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
语句检查此表,这可以帮助您诊断连接问题的原因。必须启用性能模式,否则该表为空。有关此表的信息,请参阅
第 25.12.16.1 节,“host_cache 表”。
在这些情况下,刷新主机缓存可能是可取的或可取的:
您的某些客户端主机更改了 IP 地址。
来自合法主机的连接会出现 错误消息。(请参阅处理被阻止的主机。)
Host '
host_name
' is blocked
刷新主机缓存具有以下效果:
它清除内存中的主机缓存。
host_cache
它从公开缓存内容的性能模式表中 删除所有行 。它取消阻止任何被阻止的主机。这使得来自这些主机的进一步连接尝试成为可能。
要刷新主机缓存,请使用以下任一方法:
更改
host_cache_size
系统变量的值。这需要SUPER
特权。执行截断性能模式表的
TRUNCATE TABLE
语句 。host_cache
这需要DROP
表的特权。执行
FLUSH HOSTS
语句。这需要RELOAD
特权。执行mysqladmin flush-hosts 命令。这需要
RELOAD
特权。
服务器使用主机缓存来跟踪客户端连接过程中发生的错误。如果出现如下错误,说明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 连接没有任何问题。如果有网络问题
,增加值没有好处
。Host
'
host_name
' is blockedmax_connect_errors