应用程序连接 MySQL 失败原因

PHPABC Mysql 729 次浏览 , , 没有评论

一、没有正确赋权
有时候真的非常抓狂,明明赋给某用户相关的权限了,他死活就是不能从远程登录。哈哈,别急,这里有几个常犯的小错误。第一个可能,没有用root帐号登录 MySQL。MySQL安装完之后会产生空用户,而且这个用户是默认用户。如果使用不带参数的mysql命令直接登录本地服务器,往往当前用户就是毫无权限的空用户(不信可以用select user()看一下)。这时候虽然grant命令会返回成功的提示,但是实际上新用户屁权限都没得到。第二个可能,你用来赋权的用户,虽然有相关权限,但是它的帐号信息不在内存里。这种情况多发生于用source读取sql后。此时只要执行flush privileges就好啦!第三个可能,grant语句里面的数据库名称写错了。MySQL有个非常龌龊的恶习,它不会检查grant里面的数据库是否真的存在。有时候手抖写错了一个字母,查了半天才能查出来。

二、MySQL参数设置问题
max_user_connections、max_connections规定了链接的数量。如果MySQL已经没有可用的连接,那么应用再怎么连也是白搭。
max_connect_errors规定了某个ip的用户被允许意外中断连接的最大次数。如果达到这个次数,那么该用户的登录就会被拒绝,不管 MySQL是否还有剩余的连接数。解决办法是执行flush hosts,立马生效。
skip-name-resolve能大大加快用户获得连接的速度,特别是在网络情况较差的情况下。MySQL在收到连接请求的时候,会根据请求包中获得的ip来反向追查请求者的主机名。然后再根据返回的主机名又一次去获取ip。如果两次获得的ip相同,那么连接就成功建立了。在DNS不稳定或者局域网内主机过多的情况下,一次成功的连接将会耗费很多不必要的时间。假如MySQL服务器的ip地址是广域网的,最好不要设置skip-name- resolve。这种情况下可以将HOST_CACHE_SIZE的值增大,并重新编译MySQL。

三、系统资源的问题
这里的资源指的是内存,目前还没发现CPU和IO会影响连接成败。当内存耗尽的时候,连接请求将会被拒绝。我曾经在Solaris 10上遇到这种问题,明明还有剩余的内存,但是连接MySQL却总报无法分配内存的错误。后来才发现我把MySQL编译成了32位的,虽然系统内存还有剩余,但是却无法分配给MySQL了,导致连接失败。后来重新编译了MySQL,并将cache适当降低,再也没出现过问题。

四、网络问题
上面都没有问题?那就应该看看网络了。telnet一下MySQL对外开放的端口,如果不通的话,看看防火墙是否正确设置了。另外,看看MySQL是不是开启了skip-networking的选项,这个模式是方便修复用的,没事别乱来。

五、RPWT
都检查到五了,你要还是有问题的话就只能怪RP值太低了。介绍朋友来看这个Blog并留下问题的详细描述,好心的博主可能会挽救你于水火之中,阿门……

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

Go