我们经常会遇见“MySQL: ERROR 1040: Too many connections”的情况,一种是访问量确实很高,MySQL服务器抗不住,这个时候就要考虑增加从服务器分散读写压力,另外一种情况是MySQL配置文件中max_connections值过小。

数据库连接池最小连接数和最大连接数:

最小连接数是连接池一直保持的数据连接。如果应用程序对数据库连接的使用量不大,将会有大量的数据库连接资源被浪费掉。

MySQL默认的最大连接数为100,MySQL服务器允许的最大连接数16384

最大连接数是连接池能申请的最大连接数。如果数据连接请求超过此数,后面的数据连接请求将被加入到等待队列中,这会影响之后的数据库操作。如果最小连接数与最大连接数相差太大,那么,最先的连接请求将会获利,之后超过最小连接数量的连

接请求等价于建立一个新的数据库连接。不过,这些大于最小连接数的数据库连接在使用完不会马上被释放,它将被放到连接池中等待重复使用或是空闲超时后被释放。

MySQL服务器的连接数并不是要达到最大的100%为好,还是要具体问题具体分析

查看当前数据库的参数信息可用:mysql>show variables;

mysql> show variables like 'max_connections';

+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| max_connections | 650 |
+-----------------+-------+
这台MySQL服务器最大连接数是650,然后查询一下服务器响应的最大连接数:

mysql> show global status like 'Max_used_connections';

MySQL服务器最大连接数是650,没有达到服务器连接数上限650,应该不会出现oo many connections(1040)错误,比较理想的设置是:
Max_used_connections / max_connections * 100% ≈ 85%

最大连接数占上限连接数的85%左右,如果发现比例在10%以下,MySQL服务器连接上限就设置得过高了。

从以下几种方法都可以实现修改连接数的目的。
1. 进入到mysql的安装目录找到mysqld_safe(我的安装路径是:cd /opt/mysql-5.6/bin/mysqld_safe);
   vim mysqld_safe
   找到
then $NOHUP_NICENESS $ledir/$MYSQLD
  $defaults --basedir=$MY_BASEDIR_VERSION
  --datadir=$DATADIR $USER_OPTION
  --pid-file=$pid_file
  --skip-external-locking
  -O max_connections=650
  >> $err_log 2>&1 else
  eval "$NOHUP_NICENESS $ledir/$MYSQLD
  $defaults --basedir=$MY_BASEDIR_VERSION
  --datadir=$DATADIR $USER_OPTION
  --pid-file=$pid_file
  --skip-external-locking $args
  -O max_connections=650>>
  $err_log 2>&1"
红色行代表要添加的字段。保存,退出。
重启mysql服务,即可。
查看当前数据库的参数信息可用:mysql>show variables;


2. 相对来说比较简单,直接更改mysql的配置文件my.cnf找到max_connections将默认值改为你需要的值,保存退出,重启服务即可。


3.命令行方式更改最大连接数:以管理员身份登录到数据库: 
  mysql>set GLOBAL max_connections=650
  显示当前运行的Query:mysql> show processlist
  显示当前状态:mysql> show status



对于并发较大的系统,建立一次连接然后缓存起来连续使用,直到程序结束等情况下再释放连接,就能够将系统资源集中在对数据库操作的处理上,从而大大提高性能。通常情况下将数据连接的建立和断开委托给一种能够数据库连接池的组件或服务进行管理。而DBCP, C3p0, Proxool等都是常用的开源的连接池组件。

 在修改最大连接数的时候会有这样一个疑问—这个值是不是越大越好,或者设置为多大才合适?这个参数的大小要综合很多因素来考虑,比如使用的平台所支持的线程库数量、服务器的配置(特别是内存大小)、每个连接占用资源(内存和负载)的多少、系统需要的响应时间等。可以在global或session范围内修改这个参数。连接数的增加会带来很多连锁反应,需要在实际中避免由此引发的负面影响。

 MySQL为每个连接分配线程来处理,可以通过threads_connected参数查看当前分配的线程数量:
mysql> show status like '%thread%';

 @

比较threads_connected参数和前面提到的max_connections参数,也可以作为目前的系统负载的参照,决定是否需要修改连接数。

产品经理Luke
互联网产品负责人/Leader
-----------------------------------------------------

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐