问题描述:
Windows2003下的MySQL服务器,本机连接到MySQL服务非常快,同一节点的Linuxecs,输入密码后要等好几秒钟才能连上。
客户端10.47.91.166
mysql服务器端10.160.27.175
内网Ping 正常,无丢包
解决过程:
先抓包分析一下:
发现服务器首先是要netbios协议进行名称和IP的解析查询,这个自然需要些时间。结合mysql的官方文档发现原因如下:
mysql 启动时默认不启用skip-name-resolve选项,导致其他主机连接数据库时,mysql会对其IP做DNS反向查询。
1、在my.ini或my.cnf文件的[mysqld]下加上skip-name-resolve
2、重启mysql
找了mysql 如何使用dns的官方说明
When a new thread connects tomysqld, mysqld will spawn a new thread to handle the request. This thread willfirst check if the hostname is in the hostname cache. If not the thread willcall gethostbyaddr_r() and gethostbyname_r() to resolve the hostname.
If the operating systemdoesn't support the above thread-safe calls, the thread will lock a mutex andcall gethostbyaddr() and gethostbyname() instead. Note that in this case noother thread can resolve other hostnames that is not in the hostname cacheuntil the first thread is ready.
You can disable DNS hostlookup by starting mysqld with –skip-name-resolve. In this case you can howeveronly use IP names in the MySQL privilege tables.
If you have a very slow DNSand many hosts, you can get more performance by either disabling DNS lookopwith –skip-name-resolve or by increasing the HOST_CACHE_SIZE define (default:128) and recompile mysqld.
You can disable the hostnamecache with –skip-host-cache. You can clear the hostname cache with FLUSH HOSTSor mysqladmin flush-hosts.
If you don't want to allowconnections over TCP/IP, you can do this by starting mysqld with–skip-networking.
当一个新的请求到达mysql服务时,mysql服务会派生一个子进程来处理这个请求的全部事宜。这个子进程首先会检查发来请求的主机名是否在缓存中,如果不存在则会进程DNS解析来查找主机名。
可以通过在mysqld标签下skip-name-resolve禁用DNS解析。注意:在mysql配置文件中加入skip-name-resolve选项 即禁止DNS解析后,mysql库中user表中的host字段不能使用域名。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
根据您描述的问题和提供的解决过程,确实MySQL在默认情况下会尝试对连接的客户端IP进行DNS反向解析,这在某些网络环境下可能会导致连接速度变慢。您已经找到了解决问题的方法,即在MySQL的配置文件(my.ini或my.cnf)中的[mysqld]部分添加skip-name-resolve
选项,并重启MySQL服务。这个操作可以有效避免每次连接时的DNS查询,从而提高连接速度。
这里补充几点注意事项和建议:
安全性和权限管理:启用skip-name-resolve
后,MySQL将不再支持基于域名的权限验证,只能使用IP地址来设置用户访问权限。确保您的应用和数据库管理策略能够适应这一变化,可能需要更新数据库用户的host字段为具体的IP地址而非域名。
主机名缓存:虽然您选择禁用DNS解析,但了解MySQL有一个主机名缓存机制(HOST_CACHE_SIZE),如果未来有需要处理大量不同主机连接且无法避免DNS查询时,可以通过调整此缓存大小来优化性能。
网络配置检查:尽管问题已通过修改MySQL配置解决,但考虑到长远管理和维护,建议检查网络配置,尤其是DNS服务器的响应时间。如果DNS解析速度是整个网络环境的瓶颈,优化DNS服务或者考虑更高效的内部DNS解决方案也是有益的。
日志监控:在做出配置更改后,持续监控MySQL的日志文件,如error.log,以确认更改是否生效且没有引入新的问题。
备份与回滚计划:在修改任何重要配置之前,建议先做好数据库的备份,并准备好一个快速回滚到更改前状态的计划,以防新配置引起意外的服务中断。
综上所述,您采取的措施是正确的,只需注意上述事项,确保系统稳定运行并符合安全及管理需求。您也可以通过ECS一键诊断全面排查并修复ECS问题。