【可能的原因】
MySQL无法连接的原因有很多,比如:
1、数据库的请求量突增,实例连接数超过max_connections,或用户连接数超过max_user_connections,
这种情况连接时客户端一般会抛出对应的错误信息
如果max_connections打满,无法连到MySQL,可以尝试用gdb来修改参数
sudo gdb -p $(cat /var/run/mysqld/mysqld.pid) -ex "set max_connections=6000" –batch
2、MySQL使用的Max open files或Max processes超过操作系统限制
修改系统配置文件,可参考前面的文章:
CentOS 6
MySQL Can't create a new thread报错分析
CentOS 7
3、 磁盘空间不足
4、 服务器负载过高,CPU消耗高,IO响应非常慢的情况也可能导致MySQL Hang住
5、 MySQL内部锁等待
可以通过show engine innodb status的内容来判断
6、 MySQL Bug引起
【分析思路】
如果用客户端连不上MySQL的情况下
1、 先检查MySQL 的error log文件和操作系统的日志文件
2、 检查是否网络问题,ping和telnet ip port
3、 查询性能监控工具,观察连接数或并发线程数是否过高
4、 检查是否服务负载过高引起
5、 通过mysqld的进程号在系统层面来找到句柄的信息,来查看show engine innodb status的内容,方法如下:
(1) 执行lsof -c mysqld|grep deleted,可以看到/data/tmp/ibkB49ZF映射的5号文件,句柄内容非空,它就是show engine innodb status的内容
(2) 找到mysqld的进程号,echo `pidof mysqld`,7358
(3) 查看5号文件的内容cat /proc/7358/fd/5
6、通过systemtap工具,可以在不登录MySQL的情况下查看正在执行的语句,脚本如下(不建议在生产环境直接使用)