mysql 无法连接问题的定位和修复过程分享
定位结果如下:
客户环境:
windows server 2003 r2 standard edition sp2
mysql ver 14.12 distrib 5.0.18, for win32 (ia32)
apache 2.2
瑞星
webshield客户端1.08
问题已复现。可以优化,无法确定是webshield导致的。
搭建环境:
windows server 2003 r2 standard edition sp2
mysql 5.0.18 for win32
apache-2.2.21-win32-x86-no_ssl
php-5.2.17-win32-vc6-x86
瑞星23.00.50.25
搭建环境过程中遇到的几个问题:
在下载apache与php时,请注意apache与php匹配问题。
a)php5.3有vc6与vc9版本,应选择vc6版本。原因如下:
i. vc6版本是使用visual studio 6编译器编译的,如果你的php是用apache来架设的,那你就选择vc6版本。
ii. vc9版本是使用visual studio 2008编译器编译的,如果你的php是用iis来架设的,那你就选择vc9版本。
b)php5.3的thread safe和non thread safe版本。apache no_ssl版应与php thread safe版搭配。若与non thread safe搭配,apache启动出错:“apache is running a threaded mpm,but your php modle is not compiled to be threadsafe. you need to recompile php.”
i. thread safe是线程安全,执行时会进行线程(thread)安全检查,以防止有新要求就启动新线程的cgi执行方式而耗尽系统资源。isapi执行方式是以dll动态库的形式使用,可以在被用户请求后执行,在处理完一个用户请求后不会马上消失,所以需要进行线程安全检查,这样来提高程序的执行效率,所以如果是以isapi来执行php,建议选择thread safe版本;
ii. non thread safe是非线程安全,在执行时不进行线程(thread)安全检查。fastcgi执行方式是以单一线程来执行操作,所以不需要进行线程的安全检查,除去线程安全检查的防护反而可以提高执行效率,所以,如果是以fastcgi来执行php,建议选择non thread safe版本。
注意apache对网站及php的正确配置。特别注意配置文件中loadmodule, phpinidir,documentroot,serverroot,directory,directoryindex,addtype application/x-httpd-php等项的配置
安装后 mysql 后(管理员账号密码:admin/admin),在php代码中使用admin连接数据库失败,cmd执行mysql –u root -p启用root用root可正常连接数据库。
问题复现:
php最长执行时间限制。
a)php最长执行时间默认为30秒,超过30秒后被中止执行,与mysql的连接也被断开。
b)尝试增大此值,修改php目录下的php.ini配置文件,将max_execution_time = 30 改为max_execution_time = 300。如果设为0,表示不限制php最大执行时间。
c)避免了因最长执行时间限制而导致mysql连接失败。
网站流量大导致mysql无法连接。
a)编写php脚本对mysql进行测试,发现当对mysql进行频繁的连接/断开操作时,mysql很快出现无法连接问题(错误代码:10048)。当中止所有连接,2分钟后mysql又恢复正常。若不停止连接,mysql一直无法连接。
b)尝试从两方面优化:
i. 修改windows注册表项tcptimedwaitdelay值为30(默认为240秒),减少此条目的值允许 tcp/ip 更快地释放已关闭的连接, 为新连接提供更多资源。
ii. 修改windows注册表项maxuserport为53768 (该值表示从系统请求任何可用用户端口时所用最大端口数,tcp/ip 可指定的最高端口号,默认值为5000)以处理更多的请求。
c)修改完注册表项后测试,mysql情况大有改善:mysql连接错误出现的情况大有减少,出错后自我恢复的能力大有提高。
针对以上两种情况,分别对安装了webshield 1.08与未安装webshield 1.08进行了测试,两者测试结果一样。
优化:
max_execution_time的修改:
打开php目录下的php.ini文件,找到max_execution_time = 30 这行,将30修改为想要的数字。
tcptimedwaitdelay与maxuserport的修改:
[hkey_local_machine\system\currentcontrolset\services\tcpip\parameters]
"tcptimedwaitdelay"=dword:0000001e
"maxuserport"=dword:00008000
推荐阅读
-
mysql 无法连接问题的定位和修复过程分享
-
IPv6设置后如何解决MySQL无法连接localhost的问题
-
mysql 无法连接问题的定位和修复过程分享
-
java-mysql和 eclipse的连接问题
-
python和mysql连接数据库的问题
-
MySQL中连接查询和子查询的问题
-
Windows 64 位 mysql 5.7以上版本包解压中没有data目录和my-default.ini及服务无法启动的快速解决办法(问题小结)
-
完美解决MySQL通过localhost无法连接数据库的问题
-
完美解决MySQL通过localhost无法连接数据库的问题
-
Windows 64 位 mysql 5.7以上版本包解压中没有data目录和my-default.ini及服务无法启动的快速解决办法(问题小结)