CRT里敲完启动命令,屏幕上蹦出一行“无法连接数据库”,这事我遇到过不下十次。先别急着删库重装,得先弄清楚一件事:这个报错到底是CRT连不上虚拟机,还是虚拟机里的服务端连不上MySQL。这两个方向差得远,搞错了能折腾一整晚。
如果是CRT本身连不上虚拟机,那压根跟数据库没关系。先ping一下虚拟机的IP通不通,再确认sshd起来了没有,service sshd status看一眼。虚拟机网络模式选NAT的话,宿主机能连上,但虚拟机之间互访容易出幺蛾子,建议直接改桥接,给个固定IP,省得DHCP到期换地址,昨天还能连今天就连不上,这种坑最气人。
真正意义上的“无法连接数据库”,一般是服务端程序启动时连MySQL失败。按这个顺序查,基本跑不掉。
先看MySQL到底起没起。很多人装完就没管过,CentOS 6用service mysqld status,CentOS 7用systemctl status mysqld,显示dead就是没跑。手动启动一下,如果启动失败,去看/var/lib/mysql/下面那个.err结尾的日志,里面写得清清楚楚。常见的是内存不够,蜀门这套老服务端加MySQL,1G内存的虚拟机基本别想,起码给2G。还有一种是ibdata1损坏,多半是虚拟机非正常关机搞的,这种情况要么从备份恢复,要么重新初始化数据库再导一遍。
MySQL起来了,就在虚拟机本地先连一下,mysql -uroot -p,能进去说明数据库本身没问题。进不去就是密码错了,或者root的授权只给了localhost。蜀门服务端的配置文件里写的数据库账号密码,得跟MySQL里实际的一致。老版本MySQL 5.1、5.5授权完记得flush privileges,不然不生效。授权语句大概是这样:grant all on *.* to ''root''@''%'' identified by ''你的密码''; 那个百分号不能少,写成localhost,远程就连不上。

接下来查my.cnf。这个文件通常在/etc/my.cnf,里面有一行bind-address,如果写的是127.0.0.1,那MySQL只监听本地回环,外部一律拒绝。把它注释掉,或者改成0.0.0.0,重启MySQL。
防火墙是另一个高频雷区。CentOS 6默认开着iptables,3306端口根本没放行。iptables -L -n看一眼,有REJECT规则就说明拦住了。临时关掉service iptables stop,测试通了再决定是永久关闭还是加放行规则。CentOS 7换成了firewalld,命令不一样,firewall-cmd --add-port=3306/tcp --permanent然后reload。SELinux也别忽略,getenforce如果是Enforcing,setenforce 0先临时关掉试试,能连上就说明是它捣的鬼,改/etc/selinux/config永久关掉。
还有个容易漏的点:蜀门服务端的配置文件里,数据库地址写的是什么。有的端默认写的127.0.0.1,有的写的是打包者当时的内网IP,比如192.168.1.100。你虚拟机实际IP是192.168.1.101,那肯定连不上。找到服务端目录下的配置文件,一般叫db.conf或者world.conf之类,把db_ip改成虚拟机自己的IP,db_port确认是3306,db_user和db_pass跟MySQL对得上。改完必须重启服务端,光重启MySQL没用。
虚拟机克隆或者恢复快照之后IP变了,也是同样的道理,配置文件里还是老IP。用ifconfig确认当前IP,再回头改配置。
最后提一句,CRT里执行启动脚本的时候,注意看它调用的是哪个配置文件。有些端有多个配置目录,改了A目录结果启动读的是B目录,白忙活。看启动脚本里的路径,顺着找过去。
按这个顺序捋一遍:MySQL起没起、本地能不能连、授权对不对、bind-address、防火墙、SELinux、配置文件IP、网络模式。九成的情况卡在前五步里。真要是全查完还不行,把MySQL的err日志和服务端的启动日志一起看,报错信息不会骗人。