MySQL服务器在内存中维护主机缓存,该缓存包含有关客户端的信息:IP地址,主机名和错误信息。性能架构 host_cache表公开了主机缓存的内容,以便可以使用SELECT语句对其进行检查 。这可以帮助您诊断连接问题的原因。请参见 第26.12.19.1节“ host_cache表”。
注意
服务器仅将主机缓存用于非本地TCP连接。对于使用回送接口地址(例如127.0.0.1或::1)建立的TCP连接,或使用Unix套接字文件,命名管道或共享内存建立的连接,它不使用缓存 。
主机缓存操作
主机缓存配置
主机缓存操作
服务器将主机缓存用于以下目的:
通过缓存IP到主机名查找的结果,服务器避免了对每个客户端连接进行域名系统(DNS)查找。相反,对于给定的主机,它仅需要针对该主机的第一个连接执行查找。
缓存包含有关连接过程中发生的错误的信息。一些错误被认为是 “ 阻塞”。”如果太多的这些给定主机连续发生没有连接成功,服务器阻止来自主机的进一步连接。的 max_connect_errors系统变量决定发生阻塞(参见之前连续误差的允许次数 节B.4.2.5,“主机‘的host_name’被阻塞”)。
对于每个新的客户端连接,服务器使用客户端IP地址检查客户端主机名是否在主机缓存中。如果是这样,则服务器会根据主机是否被阻止来拒绝或继续处理连接请求。如果主机不在缓存中,则服务器尝试解析主机名。首先,它将IP地址解析为主机名,然后将该主机名解析为IP地址。然后,它将结果与原始IP地址进行比较,以确保它们相同。服务器将有关此操作结果的信息存储在主机缓存中。如果缓存已满,则丢弃最近最少使用的条目。
服务器按以下方式处理主机缓存中的条目:
当第一个TCP客户端连接从给定IP地址到达服务器时,将创建一个新的缓存条目,以记录客户端IP,主机名和客户端查找验证标志。最初,主机名设置为 NULL,并且标志为false。该条目还用于来自同一原始IP的后续客户端TCP连接。
如果客户端IP条目的验证标志为false,则服务器将尝试从IP到主机名到IP DNS解析。如果成功,则使用解析后的主机名更新主机名,并将验证标志设置为true。如果解决不成功,则采取的措施取决于错误是永久的还是暂时的。对于永久性故障,将保留主机名 NULL并将验证标志设置为true。对于短暂故障,主机名和验证标志保持不变。(在这种情况下,下一次客户端从该IP连接时,会进行另一次DNS解析尝试。)
如果处理来自给定IP地址的传入客户端连接时发生错误,则服务器将更新该IP条目中的相应错误计数器。有关记录的错误的描述,请参见 第26.12.19.1节“ host_cache表”。
服务器使用gethostbyaddr()和 gethostbyname()系统调用执行主机名解析 。
要取消阻止主机,请通过执行一条FLUSH HOSTS语句,一条TRUNCATE TABLE截断性能模式host_cache表的 语句 或 mysqladmin flush-hosts命令来刷新主机缓存 。 FLUSH HOSTS和 mysqladmin flush-hosts需要 RELOAD特权。 TRUNCATE TABLE需要DROP该host_cache表的 特权 。
如果自从上次尝试从被阻止的主机进行连接以来发生了来自其他主机的活动,则即使不刷新主机缓存,被阻止的主机也可能变得不受阻止。之所以会发生这种情况,是因为当连接从不在缓存中的客户端IP到达时,如果缓存已满,则服务器会丢弃最近最少使用的缓存条目,以便为新条目腾出空间。如果丢弃的条目用于阻止的主机,则该主机将变为未阻止。
一些连接错误与TCP连接不相关,不是在连接过程的早期(甚至在知道IP地址之前)发生的,或者不是特定于任何特定IP地址的(例如内存不足的情况)。有关这些错误的信息,请检查 状态变量(请参见 第5.1.10节“服务器状态变量”)。 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查找。
在运行时更改缓存大小会导致隐式 FLUSH HOSTS操作,该操作将清除主机缓存,截断 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速度很慢且有许多主机,则可以通过禁用DNS查找+启用skip_name_resolve或增加host_cache_size使主机缓存更大的值 来提高性能。
要完全禁止TCP / IP连接,请在skip_networking启用系统变量的情况下启动服务器。




