解决too many connections问题

有些人觉得,解决too many connections问题,灰非简单,down了mysql,修改my.cnf调大max_connections,好吧,你想法是没错的,这的确可以解决问题,但试问对于线上在跑的MySQL,你能随便down吗?嘻嘻,如果不行,只能用另外的方法了

一旦出现了too many connections错误,DBA或者运维人员已经连接不上MySQL去动态修改max_connections了,下面做实验来演示一下:

为了方便演示,我把max_connections调小到4:

mysql> set global max_connections=4;
Query OK, 0 rows affected (0.00 sec)

mysql> show variables like ‘max_connec%‘;
+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| max_connect_errors | 10    |
| max_connections    | 4     |
+--------------------+-------+
2 rows in set (0.00 sec)

mysql> 

然后打开几个seesion连接mysql,当连接超出4个时,报以下错误:

[root ~]$ mysql -uroot -p123456 -S /data/mysql-5.5/mysql.sock
ERROR 1040 (HY000): Too many connections

提示也非常明显,就是我们配置的连接数太小,现在已经用完了,这时我们只能通过hack的方法,用过gdb直接修改mysqld内存中max_connections的值,具体做法如下:

可能很人的系统环境上没有安装gdb,安装下即可:

[root ~]$ gdb -p $(cat /data/mysql-5.5/localhost.localdomain.pid) -ex "set max_connections=500" -batch
-bash: gdb: command not found
[root ~]$ yum install gdb -y

然后执行gdb -p $(cat /data/mysql-5.5/localhost.localdomain.pid) -ex "set max_connections=500" -batch;  cat后面跟的是你当前mysql服务的pid文件,根据自己的存放指定即可,后面是修改mysqld内存中max_connections为多少

[root ~]$ gdb -p $(cat /data/mysql-5.5/localhost.localdomain.pid) -ex "set max_connections=500" -batch
[New LWP 17980]
[New LWP 17948]
[New LWP 17910]
[New LWP 17878]
[New LWP 17803]
[Thread debugging using libthread_db enabled]
0x00007f49f1c82333 in poll () from /lib64/libc.so.6

这时已经可以连接mysql了,查看它的max_connections已经不再是之前的4了,而是500了

mysql -uroot -p123456 -S /data/mysql-5.5/mysql.sock
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 6
Server version: 5.5.40-log MySQL Community Server (GPL)

Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type ‘help;‘ or ‘\h‘ for help. Type ‘\c‘ to clear the current input statement.

mysql> show global variables like ‘max_conn%‘;
+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| max_connect_errors | 10    |
| max_connections    | 500   |
+--------------------+-------+
2 rows in set (0.04 sec)

mysql> 

在Percona5.5的thread_pool里面提供了2个参数extra_port和extra_max_connections预留额外的连接,预防连接满了以后我们无法进入数据库进行相应的管理。

[root msb_5_5_40]$ ./use
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.5.40-36.1 Percona Server (GPL), Release 36.1, Revision 707

Copyright (c) 2009-2014 Percona LLC and/or its affiliates
Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type ‘help;‘ or ‘\h‘ for help. Type ‘\c‘ to clear the current input statement.

mysql ((none)) > show variables like ‘%extra%‘;
+-----------------------+-------+
| Variable_name         | Value |
+-----------------------+-------+
| extra_max_connections | 1     |
| extra_port            | 10010 |
+-----------------------+-------+
2 rows in set (0.00 sec)

当出现超出最大链接的错误时,可以指定用户名 密码 端口登录,端口为extra_port设置的,不是mysql服务自身的端口,相信大家都觉得这个功能很贴心吧,哈哈^.^

总结:

通常有两个参数控制控制最大连接数:

max_connections:该实例允许最大的连接数

max_user_connections:该实例允许每个用户的最大连接数 

每个人要根本自己业务量,设置合适的值,不要盲目有设置过大,但也不设置过小,因为MySQL在连接数上升的情况下性能下降非常厉害,如果需要大量连接,这时可以引入thread_pool,所以我们需要保持一个原则:系统创建的用户(给应用使用用户)数* max_user_connections  < max_connections。这样就不会发生文章开始说的问题。

参考资料:

http://www.mysqlperformanceblog.com/2010/03/23/too-many-connections-no-problem/

http://www.percona.com/doc/percona-server/5.5/performance/threadpool.html

http://www.cnblogs.com/gomysql/p/3834797.html

时间: 2024-10-03 22:02:37

解决too many connections问题的相关文章

JDBC整合c3p0数据库连接池 解决Too many connections错误

前段时间,接手一个项目使用的是原始的jdbc作为数据库的访问,发布到服务器上在运行了一段时间之后总是会出现无法访问的情况,登录到服务器,查看tomcat日志发现总是报如下的错误. Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Data source rejected establishment of connection, message from server: "Too man

CentOS中设置Mysql的最大连接数max_connections(用于解决too many connections的问题)

一.引入 最近一个python的定时任务系统的项目,在做定时数据统计的时候经常报错too many connections,字面意思很简单,就是数据库连接池不够用了.那么比较直接的方法就是手动设置数据库的最大连接数max_connections 二.如何配置 1.查询Mysql当前的最大连接数 mysql> show variables like "max_connections"; +-----------------+-------+ | Variable_name | Va

Navicat使用常见的两个问题及解决方法,提高开发效率

Navicat使用常见问题 在我们日常开发过程中,一般不会直接使用命令行来操作 MYSQL 数据库,而会选择一些图形化界面去帮助我们来进行此类操作,常用的有:SQLyog(Logo也是小海豚),Navicat,或者直接使用编辑器自带的图形化界面工具.我这边开发使用的是 Navicat,在日常使用的时候出现过一下的问题: Too Many Connections - 1040 在 Navicat 的界面中,这是一个很讨人厌的提示框,多人协作开发的时候经常出现.原因有二: 一是 Mysql 数据库的

解决mysql 1040错误Too many connections的方法

1.可能是mysql的max connections设置的问题 2.可能是多次insert,update操作没有关闭session,需要在spring里配置transaction支持. 解决: 1.修改tomcat里的session 的time-out时间减少为20,(不是必改项) 2.对处理量大的对数据库insert或update的操作提供transaction支持. ======================================= 下面的是解决办法: com.mysql.jdb

Windows 7下解决: java.net.SocketException: No buffer space available (maximum connections reached?)

查了一大堆网上的资料全都没用,Google得知,是Windows 7 的socket泄漏 : https://supportkb.riverbed.com/support/index?page=content&id=S23580&actp=LIST_RECENT 补丁下载地址:  http://support.microsoft.com/kb/2577795 记录一下. Windows 7下解决: java.net.SocketException: No buffer space avai

Data source rejected establishment of connection, message from server: &quot;Too many connections&quot;解决办法

异常名称 //数据源拒绝从服务器建立连接.消息:"连接太多" com.MySQL.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Data source rejected establishment of connection, message from server: "Too many connections" 原因一 MYSQL安装目录打开MY.INI. 找到max_connections

Too many connections解决方法

在工作中,大家或许常常遇到Too many connections这个错误,这时作为DBA想进数据库管理都进不去,是非常尴尬的一件事情.当然有同学说可以修改配置文件,但是修改配置文件是需要重启mysqld的,这在业务繁忙的数据库服务器上是不允许的.所以紧急情况下可以采用如下的方法,比如下面的测试. [[email protected]01 msb_5_6_19]# ./use ERROR 1040 (HY000): Too many connections [[email protected]-

MySQL提示“too many connections”的解决办法

今天生产服务器上的MySQL出现了一个不算太陌生的错误“Too many connections”.平常碰到这个问题,我基本上是修改/etc/my.cnf的max_connections参数,然后重启数据库.但是生产服务器上数据库又不能随便重启. 没办法,只好想办法手动去释放一些没用的连接.登陆到MySQL的提示符下,数据show processlist这个命令,可以得到所以连接到这个服务器上的MySQL连接: mysql> show  processlist;+---------+------

Go连接MySql数据库Error 1040: Too many connections错误解决

原文:https://my.oschina.net/waknow/blog/205654 摘要: 使用Go链接数据库时,由于连接释放不当会在一段时间以后产生too many connections的错误.因此需要适当的选择函数和及时的释放数据库连接. 这几天用Go写了个简陋的服务器,连接Mysql数据库,提供api给其他程序调用来实现增删改产等服务.Go的版本是1.2,使用的驱动是go-sql-driver/mysql.但是在有一定量的查询结果以后,会出先too many connection的