Fixing Poor MySQL Default Configuration Values
原文地址:http://jeremy.zawodny.com/blog/archives/011421.html
[几句废话:本人英文很烂,今天很无奈地第一次认真地看英文文档,很纠结,花了好长时间才看了那么一丁点儿,回过头看,竟又忘记自己刚看的内容了~速度太慢,汗||于是想想试着翻译并记下来吧,顺便大家也给我指出错误啊~Thank you~]
我最近一直在积累一些MySQL在大的生产环境会产生问题的默认配置变量。它们都具有相同的特性那就是,一两次网络波动就会触发一些非常不想看到的结果。
max_connect_errors
在MySQL的docs里看到主机被阻止了,可悲的是,这时没有办法去彻底阻止这个检查。却不能实现设置变量为0,你的真正解决方案只有(a)设置一个非常大的值(max_connect-error=1844674407370954751);(b)临时运行FLUSH HOSTS命令。
connect_timeout
这跟上面的问题相关,在网络拥塞的情况下(不管是客户端或者服务端),刚开始连接可能要花费几秒才能完成,默认的connect_timeout 时间是5秒。当你被这种情况所牵绊,上面的这个max_connect_errors问题就会很有冲击力。
为了避免这种情况,首先可以尝试设置connect_timeout一个值像15 或 20。并且考虑设置thread_cache_size为一个非零值。当服务器在非常短的时间周期里,时常保持高的新连接数,这个设置将帮助改善这种情况。
skip-name-resolve
在默认情况下,MySQL做一个反向DNS查询对每个过来的连接,这就太糟糕了,似乎不论你有多么好的基础设施,在DNS服务器有标志。 MySQL的主机缓存存在,让那些查找降到最低值。我曾经见过由于这个原因导致了至今8年的麻烦。当这种情况发生的时候,我只能假定这个主机缓存存在一个bug或分析lib库。
我建议在/etc/my.cnf里添加skip-name-resolve来完全跳过个DNS。仅仅用IP地址或你授权的范围。似乎减缓从DNS服务器的回复也能帮助你改善connect_timeout的牵绊。试想有2、3台DNS服务器配置,但是第一个不可用。
slave_net_timeout
当主从数据库的网络连接在某种程度上被中断,任何一方都不能检测(像防火墙或路由改变),你必须等待直到slave_net_timeout设置的时间过后,从数据数才知道连接错误了。它将尝试再次连接主服务器并且采集哪里使它停止。这真是太可怕了。
然而,这个默认值是3600秒,整整一个小时!太不好了。
谁会希望他们的从服务器在检查它们哪里出问题之前,闲置那么长时间时间?我觉得任何人都不想要这种结果。
我的建议,如果你处在一个繁忙的环境,设置你的值大约30秒。