shell里MySql连接正常但php连不上的奇葩问题

今天意外的多了一个奇葩的需求--把用户转移至另一台服务器,要求保持网站正常/MySql正常/用户与用户组状态正常。看来老天注定让我折腾,好吧我接受挑战,开始实验!

首先是用户以及用户组的处理,这里略过,几个配置文件,注意编号不能冲突就行。说着简单做着困难,开着2个sftp差点把在运行的服务器毁了T_T,还好有备份配置。确保用户正常后开始同步数据,然后手工模拟出另一台的环境,果然合格的运维要写好脚本来做,没脚本各种蛋疼!@#¥%……总之这时还是很顺利的,接下来的绊脚石把我绊倒了2小时。

MySql的数据文件同步完成后,启动,Success。用mysql -u xxx -p测试登录,正常,但是网站死活就是连不上数据库。百思不得其解,首先检查归属,数据文件的归属是从另一台同步过来的,出了点问题手工chown后也正确了。

然后查到一个解决方法,php用127.0.0.1来连接数据库就可以了,试一下果然成功。这下更把我搞晕了,虚拟机为了这次的实验特地重装的,hosts绝对没有错。ping localhost也确定是127.0.0.1,这时候就开始纠结了。在最郁闷的时候想起一件事--官方文档!开源的东西,救命稻草就是这个!果断上官方找资料如下:

Unix平台上的MySQL客户端能够以两种不同的方式连接到mysqld服务器:通过文件系统中的文件(默认为/tmp/mysql.sock)使用Unix套接字进行连接,或通过端口号使用TCP/IP进行连接。Unix套接字文件的连接速度比TCP/IP快,但仅能在与相同计算机上的服务器相连时使用。如果未指定指定主机名或指定了特殊的主机名localhost,将使用Unix套接字。

GJ!看样子成功一半了,官方文档同时也给出了调试命令,使用mysqladmin --protocol=socket --socket=/tmp/mysql.sock version可以测试套接字文件是否正常。测试结果却又把我打回郁闷的状态,连接一切正常,到底是为啥呢?再用mysql -h 'localhost' -u xxx-p测试还是正常,这又是为啥呢?

既然是php来连,大概php.ini有玄机,去看看~丢了个探针,确定sock文件位置没错。这...纠结...在php.ini再次手工指定一下套接字文件位置(我没有开启PDO,故只有这两项mysql.default_socket、mysqli.default_socket),虽然知道探针正常的话这样做是无果的,不过人在郁闷的时候总会做一些徒劳的尝试,我也不例外。结果自然是失败。

看了下时间,欧洲杯开打。老天是注定让我戒球吧,不看!继续思考...

既然是php来调用这个套接字文件,那么php应该需要有权限。不过奇怪的是这个sock已经给了777权限,难不成还不够?果断丢个phpspy(webshell,php大马,以前玩黑时候的收藏品)看看,果然sock上级文件夹权限没给足!参考另一边服务器权限,同步过来,一切正常!over~莫名其妙了,转移的时候用tgz打包,为啥权限就变了呢?不管了正常就行。

总共耗时3小时,果然有的时候解决问题还得用一些奇葩的思路才能解决啊。

最后附MySql官方问题和常见错误传送门:http://dev.mysql.com/doc/refman/5.1/zh/problems.html

shell里MySql连接正常但php连不上的奇葩问题 没有评论

发表回复

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

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