MySQL DNS查找和主机缓存解读
MySQL服务默认维护一个内存中的主机缓存,其中包含有关客户端的信息:IP地址、主机名,计数信息。当然,这里不包括本地主机TCP连接,环回接口地址(例如127.0.0.1或::1)建立的TCP连接,或者使用Unix套接字文件sock、命名管道或共享内存建立的连接,它不使用缓存。
MySQL服务将主机缓存用于以下2个目的:
- 通过缓存IP到主机名称查找的结果,可以避免对每个客户端连接进行域名系统(DNS)查找。相反,对于给定的主机,它只需要对来自该主机的第一个连接执行查找。
- 缓存包含有关客户端连接过程中发生的错误的信息。有些错误被认为是“阻塞”。如果给定主机连续发生太多错误而没有成功连接,MySQL服务会阻止该主机的进一步连接。这里max_connect_errors参数起到作用
当主机缓存达到错误次数(max_connect_errors)之后,连接请求被中断而没有成功连接后,MySQL服务会阻止该主机进行进一步的连接。如果在前一个连接中断后,在少于max_connect_errors的尝试次数内成功建立了来自主机的连接,则主机的错误计数将清除为零。
这些信息保存在Performance Schema 的host_cache表公开主机缓存的内容,以便可以使用SELECT语句对其进行检查。
mysql> SELECT * FROM performance_schema.host_cache\G;
*************************** 1. row ***************************
IP: 114.84.88.43
HOST: NULL
HOST_VALIDATED: YES
SUM_CONNECT_ERRORS: 0
COUNT_HOST_BLOCKED_ERRORS: 0
COUNT_NAMEINFO_TRANSIENT_ERRORS: 0
COUNT_NAMEINFO_PERMANENT_ERRORS: 1
COUNT_FORMAT_ERRORS: 0
COUNT_ADDRINFO_TRANSIENT_ERRORS: 0
COUNT_ADDRINFO_PERMANENT_ERRORS: 0
COUNT_FCRDNS_ERRORS: 0
COUNT_HOST_ACL_ERRORS: 0
COUNT_NO_AUTH_PLUGIN_ERRORS: 0
COUNT_AUTH_PLUGIN_ERRORS: 0
COUNT_HANDSHAKE_ERRORS: 0
COUNT_PROXY_USER_ERRORS: 0
COUNT_PROXY_USER_ACL_ERRORS: 0
COUNT_AUTHENTICATION_ERRORS: 1
COUNT_SSL_ERRORS: 0
COUNT_MAX_USER_CONNECTIONS_ERRORS: 0
COUNT_MAX_USER_CONNECTIONS_PER_HOUR_ERRORS: 0
COUNT_DEFAULT_DATABASE_ERRORS: 0
COUNT_INIT_CONNECT_ERRORS: 0
COUNT_LOCAL_ERRORS: 0
COUNT_UNKNOWN_ERRORS: 0
FIRST_SEEN: 2024-07-24 10:28:49
LAST_SEEN: 2024-07-24 10:30:41
FIRST_ERROR_SEEN: 2024-07-24 10:28:49
LAST_ERROR_SEEN: 2024-07-24 10:30:41
1 row in set (0.00 sec)