项目场景:
生产一台数据库服务器因为内存吃紧,需要增加内存。然后决定将数据库服务器的内存由16G增加到32G。 该服务器系统是ubuntu16.04
问题描述:
服务器管理人员增加完内存后,笔者进行验证服务时,首先看了下mysql的进程是否起来了,发现mysql进程正常,然后就去管理后台查看数据是否查询正常。进去后发现数据查询并不能正常响应。心里一慌,完蛋!!!!
原因分析:
笔者经历了几个阶段最后定位了错误。
1.首先看了下ubuntu系统的防火墙是否开启了,发现是关闭的。说明不是端口放行的问题。
#这里列举下ubuntu系统里关于防火墙的操作
sudo apt-get install ufw # 安装防火墙
sudo ufw status # 查看防火墙装态,inactive关闭,active开启
sudo ufw enable # 开启防火墙
sudo ufw disable # 关闭防火墙
sudo ufw version # 查看防火墙版本
sudo ufw default allow # 默认允许外部访问
sudo ufw default deny # 默认拒绝外部访问
sudo ufw allow 3306 # 放行3306端口
sudo ufw delete allow 3306 # 关闭放行端口
sudo ufw allow from 192.168.0.1 # 允许该ip访问所有端口
2.既然防火墙没事,然后测试下其他机器telnet一下该机的3306,发现是正常的说明端口正常。排除了端口问题。
telnet 10.10.1.1 3306 # telnet测试端口是否可以正常联通
3.端口既然也联通了,为什么程序访问数据库时老超时呢,使用Navicat连接报了一个“too many connetions ”,好了然后知道问题了。此时就知道应该是因为服务有人在用,数据库服务刚起来,数据库的连接池就被占满了。然后连接又没释放,就一直连不上超时了。
解决方案:
既然知道了是因为连接迅速被占满导致的问题,那么就更改连接池大小就行了。
1.更改数据库配置文件中连接池的大小设置。
whereis my.cnf # 寻找数据库配置文件的位置,使用find命令也一样
vim /etc/my.cnf # 更改数据库的配置文件。
更改配置文件时注意,我们应该在mysqld模块增加连接池的配置,如下图max_connections=1000所示:
笔者这里更改了1000。
2.更改完了配置文件我们就可以重启mysql了。
service mysql stop # ubuntu中可以使用该命令停止mysql
service mysql start # ubuntu中可以使用该命令启动mysql
此时执行此命令,发现不能执行,报如下错误:
Failed to start mysql.service: Unit mysql.service not found
竟然找不到mysql.service,那就只能找下mysql.server所在位置了。
find / -name mysql.server # 全局查找mysql.server文件
# 发现在这里 : /app/mysql/support-files/mysql.server
/app/mysql/support-files/mysql.server stop # 停止mysql服务
/app/mysql/support-files/mysql.server start # 启动mysql服务
ps -ef|grep mysql # 验证mysql是否正常启动
3.搞定了。