连接数据库失败时,报错信息往往是Can't connect to local MySQL server through socket或者Connection refused,这时候最先要做的不是检查代码,而是确认MySQL服务本身是否在运行。服务没启动,后续一切排查都是白费功夫。下面介绍几种在Linux和Windows环境下都实用的检查方法,学会任意一种都能快速判断服务状态。

Linux系统下查看MySQL服务状态
目前主流的Linux发行版(CentOS 7以上、Ubuntu 16.04以上)都使用systemd管理服务,最推荐的命令是systemctl status。执行下面的命令即可:
systemctl status mysqld # Ubuntu下服务名一般是mysql,可以执行 systemctl status mysql
如果服务正在运行,输出中会有一行绿色的Active: active (running)字样,并且会显示进程PID、内存占用以及最近几条日志。如果看到的是inactive (dead)说明服务没有启动,看到failed则说明服务启动过程出错,需要进一步查看日志定位原因。systemctl的输出比其他命令信息量更大,建议作为首选。
对于一些老旧的系统,可能还在使用SysV风格的service命令,用法类似:service mysqld status。这个命令在CentOS 6等系统中仍然可用,输出虽然简洁一些,但判断逻辑是一样的。另外,如果不确定服务名到底叫mysql还是mysqld,可以用systemctl list-units --type=service | grep -i mysql搜索一下,MariaDB的包显示的服务名则是mariadb。
通过进程和端口判断服务是否运行
即使不用服务管理命令,也可以直接观察进程。用ps命令配合grep过滤:
ps -ef | grep mysqld | grep -v grep
如果MySQL正在运行,会列出mysqld进程及其启动参数,能看到--datadir、--port等配置信息,这对排查启动参数问题也很有帮助。没有任何输出就说明进程不存在。需要注意的是,命令末尾的grep -v grep是为了排除grep自身进程,不加的话可能会误判。
另一种思路是检查端口监听状态。MySQL默认监听3306端口,可以用netstat或者ss命令查看:
netstat -tlnp | grep 3306 # 或者使用更现代的ss命令 ss -tlnp | grep 3306
输出中如果看到LISTEN状态并且对应的进程是mysqld,说明服务正常监听。如果端口没有被监听,可能是服务没启动,也可能是配置文件中启用了skip-networking参数导致只走socket通信,这时候本机用localhost可以连上,但远程无法访问,属于另一种情况。
用mysqladmin和登录测试做最终验证
MySQL自带的管理工具mysqladmin提供了一个专门的探测参数,执行mysqladmin ping即可:
mysqladmin -u root -p ping # 服务正常时返回:mysqld is alive # 服务未启动时会报错:mysqladmin: connect to server at 'localhost' failed
这个命令实际上模拟了一次连接请求,返回mysqld is alive就代表服务不仅进程在,而且能够响应客户端请求,是判断服务可用性的最直接方式,很多监控脚本就是用它来做存活检测的。
最后还可以直接尝试登录验证:mysql -u root -p,能正常进入命令行界面并看到版本提示,说明服务完全正常。Windows用户则更简单,可以打开服务管理器(运行services.msc),在列表中找到MySQL相关服务查看状态,或者在管理员权限的命令行中执行net start | findstr MySQL查看是否已启动,用net start mysql可以直接启动服务。
如果确认服务没启动,先用systemctl start mysqld启动,启动失败再通过tail -n 100 /var/log/mysqld.log查看错误日志,常见原因包括端口被占用、数据目录权限不对、磁盘空间不足等,顺着日志提示处理即可解决。