Mysql DNS反向解析导致连接超时过程分析(skip-name-resolve)

 更新时间:2013年03月31日 13:37:39   作者:  
从其它地方连接MySQL数据库的时候,有时候很慢。慢的原因有可能是MySQL进行反向DNS解析造成的,这里简单介绍下原理,需要的朋友可以参考下
MySQL数据库收到一个网络连接后,首先拿到对方的IP地址,然后对这个IP地址进行反向DNS解析从而得到这个IP地址对应的主机名。用主机名在权限系统里面进行权限判断。反向DNS解析是耗费时间的,有可能让用户感觉起来很慢。甚至有的时候,反向解析出来的主机名并没有指向这个IP地址,这时候就无法连接成功了。

可以在配置文件里面禁止MySQL进行反向DNS解析,只需在my.cnf的[mysqld]段落中加入如下行即可:

skip-name-resolve (windows与linux下一样的)

设备在连接mysql时候,等待服务器的banner信息需要4s左右,影响了Mysql服务的连接速度。
通过如下方式进行验证:

1、Telnet端口验证

通过设备和虚拟机(Linux系统)分别Telnet Mysql服务的端口,会出现一下现象:

设备(UAG/SCANNER): telnet后,等待Mysql的服务器端回应大概需要等10s左右。

[DPtech-Developer-Shell]telnet 10.101.0.206 3308
Trying 10.101.0.206...
Connected to 10.101.0.206.
Escape character is '^]'.
E
5.0.67-community-nt-log?Hc95
虚拟机(Ubuntu):telnet后,立即得到了Mysql服务器的返回

[root]~# telnet 10.101.0.206 3308
Trying 10.101.0.206...
Connected to 10.101.0.206.
Escape character is '^]'.
E
5.0.67-community-nt-log?D%(;1$]+,¢!Zdh`'?G)6r]YConnection closed by foreign host.   //这里耗时很短

2、通过程序进行验证

具体源代码见附件:验证程序源代码
源代码基本上是设置了Recv超时后,建立socket连接之后接受数据,收到后计时并输出。

在设备上和虚拟机中的结果分别如下:
设备:

[DPtech-Developer-Shell]/tcpclient_mips 10.101.0.1 3306
花费时间:19553
Recved 68 bytes
@
5.5.2-m2-community%uD3q`n)

虚拟机:

[root]tcp_demo# ./tcpclient 10.101.0.1 3306
花费时间:10525
Recved 68 bytes
@
5.5.2-m2-communitd~k~Y";B

可以发现,设备上大约比Linux服务器多耗时9s,其中10秒钟可能是recv本身超时的时间。

3、通过不同操作系统进行Telnet验证

通过Windows系统和Linux虚拟机、设备,分别通过Telnet进行连接尝试,通过抓包分析得知,只有设备的耗时比较长,其他的耗时都比较短。
抓包时发现设备中的socket建立之后,MYSQL服务器需要发送很多次的NBNS报文后,才会传输banner信息,而Linux虚拟机和Windows系统的主机在这个过程中都没有出现这个问题。
查找了一些资料,关于MYSQL NBNS报文的问题:

Mysql论坛的提问:

http://forums.mysql.com/read.php?11,250982,250982#msg-250982

该问题的答复
http://forums.mysql.com/read.php?11,250982,254683#msg-254683

从答复中来看,貌似是某些版本的问题,临时的解决方案是对Mysql服务器进行配置,不启用Named Pipes,即 命名管道 功能即可解决这个问题。

后经查找相关资料得知,远程连接超时可能由于Mysql默认开启了DNS反向解析的缘故,每次连接时服务器都尝试解析连接客户端的主机名,导致时间比较长。

解决方法是在服务器端的my.ini文件中,[mysqld]这个节下配置一个skip-name-resolve以关闭Mysql默认开启的DNS反向解析就可以了。

再次通过设备和虚拟机或者Windows系统进行Telnet,可以发现连接超时的现象明显不存在了。

另外通过自己写的C代码进行连接的时候也存在同样的问题,修改skip-name-resolve以后,实际上就可以发现该问题已经不存在了:

设备:

[DPtech-Developer-Shell]/tcpclient_mips 10.101.0.1 3306
花费时间:10520
Recved 68 bytes
@
5.5.2-m2-community[Z44E>G)
虚拟机:
[root]tcp_demo# ./tcpclient 10.101.0.1 3306
花费时间:10521
Recved 68 bytes
@
5.5.2-m2-community7evE5wyx

通过虚拟机Telnet连接另外一个ip 10.101.0.206时候发现速度也比较慢,消耗的时间基本上和设备中相当,可能是由于虚拟机和宿主主机之前不需要进行反向域名解析,或者说是应为系统本身就知道虚拟机IP地址(NAT模式)对应的主机名,所以不需要进行DNS反向解析,导致在虚拟机中出现了特殊情况。
最后得出结论,可能这个问题实际上和设备或者虚拟机,Linux系统、Windows系统没有多大关系,主要由于服务器的反向DNS解析导致该问题。无法从客户端途径去解决,也就是说我们设备无法处理这种情形。

相关文章

  • mysql日常锁表之flush_tables详解

    mysql日常锁表之flush_tables详解

    Flushtables和Flushtableswithreadlock是MySQL中的两个命令,用于关闭表对象和清空查询缓存,它们会等待所有正在运行的SQL请求执行结束,如果请求操作的表集合为{tables},则会阻塞其他会话对{tables}表上的所有操作,包括查询和写操作
    2024-11-11
  • mysql 常用数据库语句 小练习

    mysql 常用数据库语句 小练习

    一个mysql小练习 建表 查询 修改表 增加字段 删除字段
    2009-07-07
  • explain命令为什么可能会修改MySQL数据

    explain命令为什么可能会修改MySQL数据

    这篇文章主要介绍了explain命令为什么可能会修改MySQL数据,帮助大家更好的理解和使用MySQL,感兴趣的朋友可以了解下
    2020-12-12
  • mysql8.0.30用户与权限管理的实践

    mysql8.0.30用户与权限管理的实践

    MySQL8.0新加了很多功能,其中在用户管理中增加了角色的管理,本文主要介绍了mysql8.0.30用户与权限管理的实践,具有一定的参考价值,感兴趣的可以了解一下
    2024-04-04
  • 浅谈MySQL之浅入深出页原理

    浅谈MySQL之浅入深出页原理

    首先,我们需要知道,页(Pages)是InnoDB中管理数据的最小单元。Buffer Pool中存的就是一页一页的数据。当我们要查询的数据不在Buffer Pool中时,InnoDB会将记录所在的页整个加载到Buffer Pool中去;同样,将Buffer Pool中的脏页刷入磁盘时,也是按照页为单位刷入磁盘的
    2021-06-06
  • MySQL分组的时候遇到ONLY_FULL_GROUP_BY报错问题及解决方案

    MySQL分组的时候遇到ONLY_FULL_GROUP_BY报错问题及解决方案

    这篇文章主要介绍了MySQL分组的时候遇到ONLY_FULL_GROUP_BY报错问题及解决方案,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-04-04
  • Mysql数据库百万级数据测试索引效果

    Mysql数据库百万级数据测试索引效果

    这篇文章主要为大家介绍了Mysql数据库百万数据测试索引效果,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • 高效利用mysql索引指南

    高效利用mysql索引指南

    这篇文章主要介绍了高效利用mysql索引指南,你知道如何创建恰当的索引吗?在数据量小的时候,不合适的索引对性能并不会有太大的影响,但是当数据逐渐增大时,性能便会急剧的下降。,需要的朋友可以参考下
    2019-06-06
  • show engine innodb status显示信息不全如何解决

    show engine innodb status显示信息不全如何解决

    执行 show engine innodb status\G 时,显示的信息不全,DEADLOCK相关信息太多,后面的都没了
    2012-11-11
  • mysql如何实现多行查询结果合并成一行

    mysql如何实现多行查询结果合并成一行

    利用函数:group_concat(),实现一个ID对应多个名称时,原本为多行数据,把名称合并成一行
    2013-12-12

最新评论