博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MySQL 5.6关闭DNS查询
阅读量:6858 次
发布时间:2019-06-26

本文共 2046 字,大约阅读时间需要 6 分钟。

版权声明:本文为博主chszs的原创文章,未经博主允许不得转载。 https://blog.csdn.net/chszs/article/details/49737307

MySQL 5.6关闭DNS查询

作者:chszs,未经博主允许不得转载。经许可的转载需注明作者和博客主页:

MySQL服务器的日志记录中看到如下的警告:

2015-11-09 08:37:02 1489 [Warning] IP address '104.223.72.XXX' has been resolved to the host name '104.223.72.XXX.static.quadranet.com', which resembles IPv4-address itself.

分析:104.223.72.XXX经查询,是美国的IP地址,国内有XX防火墙阻拦,DNS解析不了很正常。由于MySQL服务器在内存中维持了一个Host缓存,用于存储客户端的信息,包括:IP地址、Host主机名、错误信息等。对于非本地的TCP连接,MySQL服务器都会查询此缓存。对于使用本地环回地址(比如:127.0.0.1或者::1)的TCP连接、或者是使用Unix套接字文件的TCP连接、命名管道的TCP连接、共享内存的TCP连接,都不会使用Host缓存。

注:Loopback,本地环回接口(或地址),亦称回送地址。此类接口是应用最为广泛的一种虚接口,几乎在每台路由器上都会使用。在Windows系统中,采用127.0.0.1作为本地环回地址。

对于每一个新的客户端连接,MySQL服务器使用客户端的IP地址进行检索,查看客户端的主机名是否在Host缓存中。如果Host缓存中不存在,MySQL服务器会尝试解析主机名。首先,MySQL服务器会解析主机名对应的IP地址,并与客户端的原始IP地址进行比较,确保是同一个IP地址。然后MySQL服务器把这些信息写入Host缓存中。如果Host缓存已满,MySQL服务器会使用最近最少使用算法,删除部分缓存数据。

MySQL服务器执行主机名解析使用了线程安全的gethostbyaddr_r()函数调用和gethostbyname_r()函数调用,只要操作系统支持。否则,执行查找的线程会锁定一个互斥变量,再调用gethostbyaddr()函数和gethostbyname()函数。在这种情况下,如果主机名不在缓存中,也没有别的线程能解析主机名,必须等到互斥变量被释放后才可以。

MySQL服务器使用Host缓存主要有几个目的:

1)通过缓存的IP和主机名的对应关系,避免了对于客户端的每个连接都要做DNS查询。相反,对于给定的主机,只需针对首次连接进行DNS查询。

2)Host缓存中还保护了连接过程中发生的错误信息。有些错误可能是“阻塞”信息,对于给定的客户端如果连续出现这种信息,那么服务器会阻塞来自此客户端的进一步的连接。MySQL的系统变量max_connect_errors就描述了这种情况,意思是MySQL服务器在阻塞客户端连接之前允许客户端连接错误的次数。

要解除已经被阻塞的主机,需要刷新Host缓存,执行语句:

mysql> flush hosts

或者是在Shell环境下执行:

# mysqladmin flush-hosts

Host缓存在MySQL中是默认开启的,要关闭Host缓存,可以在启动MySQL时添加–skip-host-cache参数选项。

要禁用DNS主机名查找,可以在启动MySQL时添加–skip-name-resolve参数选项。在这种情况下,MySQL服务器会只使用IP地址来匹配连接。如果DNS查询很慢,或者是客户端非常多,那么关闭DNS查询可以改进MySQL服务器的性能。

解决办法:

修改my.cnf配置文件,找到[mysqld]处,添加:

skip-name-resolve

再重启MySQL服务。

证明:

mysql> show variables like "%skip%";+------------------------+-------+| Variable_name          | Value |+------------------------+-------+| skip_external_locking  | ON    || skip_name_resolve      | ON    || skip_networking        | OFF   || skip_show_database     | OFF   || slave_skip_errors      | OFF   || sql_slave_skip_counter | 0     |+------------------------+-------+6 rows in set (0.00 sec)
你可能感兴趣的文章
一年做十个项目不如十年做一个项目
查看>>
vim 去掉自动注释和自动回车
查看>>
Coursera Algorithm II PA2 Q2
查看>>
Golang异常处理-panic与recover
查看>>
[Android Memory] Android Zipalign zip对齐优化app程序
查看>>
[Android Pro] Android 必知必会-使用 supportV4 的 RoundedBitmapDrawable 实现圆角
查看>>
jdoj 1008 最短路径问题 代码及分析
查看>>
poj 2649 Factovisors
查看>>
如何在linux下升级python以及saltstack安装
查看>>
sql 高性能存储过程分页
查看>>
5月19日云栖精选夜读:性能追求之路——MaxCompute2.0的前世今生
查看>>
vc生产垃圾清理
查看>>
解析:在IIS7或IIS7.5中导入导出站点及应用程序池
查看>>
wepy+vant-weapp踩坑记
查看>>
指针用作传出参数时,需要二级指针
查看>>
JS获取URL参数
查看>>
数据库操作,添加对应的服务器。实现不同的服务器操作。
查看>>
Spring中的AOP(五)——定义切入点和切入点指示符
查看>>
Spring+Mybatis+SpringMVC后台与前台分页展示实例(附工程)(转)
查看>>
oracle nologging用法(转)
查看>>