MySQL中too many connections问题解决

今天我的MySQL遇到一个不算太陌生的错误“Too many connections”。平常碰到这个问题,我基本上是修改/etc/my.cnf的

max_connections参数,然后重启数据库。但

是生产服务器上数据库又不能随便重启。

没办法,只好想办法手动去释放一些没用的连接。

登陆到MySQL的提示符下,数据show processlist这个命令,可以得到所以连接到这个服务器上的MySQL连接:

mysql> show  processlist;

+---------+------+---------------------+---------+---------+------+-------+-------------------+-------------------------+
| Id      | User | Host                | db      | Command | Time | State | Info                 |
+---------+------+---------------------+---------+---------+------+-------+-------------------+-------------------------+
| 1180421 | ur   |202.103.96.68:49754 | test1   |Sleep   |    1 |      | NULL                 |
| 1180427 | ur   |202.103.96.68:55079 | test2   |Sleep   |    1 |      | NULL                 |
| 1180429 | ur   |202.103.96.68:55187 | testdba | Sleep  |    0 |       | NULL                 |
| 1180431 | ur   |202.103.96.68:55704 | testdba | Sleep  |    0 |       | NULL                  |
| 1180437 | ur   |202.103.96.68:32825 | test1   |Sleep   |    1 |      | NULL                 |
| 1180469 | ur   |202.103.96.68:58073 | testdba | Sleep  |    0 |       | NULL                  |
| 1180472 | ur   |83.136.93.131:47613 | test2   |Sleep   |    8 |      | NULL                  |
| 1180475 | root | localhost          | NULL    | Query   |    0| NULL  | show  PROCESSLIST |
+---------+------+---------------------+---------+---------+------+-------+-------------------+---------------------------+
8 rows in set (0.00 sec)
mysql>

然后,你可以看到像上面这样的MySQL数据连接列表,而且每一个都会有一个进程ID号(在上表的第一列)。我们只要输入这样的命令:

mysql> kill 1180421;
Query OK, 0 rows affected (0.00 sec)
 
mysql>

其中1180421为你在进程列表里找到并且要杀掉的进程号。

产生这种问题的原因是:

连接数超过了MySQL设置的值,与max_connections和wait_timeout都有关系。Wait_timeout的值越大,连接的空闲等待就越长,这样就会造成当前连接数越大。

解决方法:

修改MySQL参数文件my.cnf,设置成max_connections=1000,wait_timeout=5,如果没有此项可以自行添加,修改会重启MySQL服务即可,要不经常性报此错误,则要对服务器做整体性能优化

注:

为了防止发生too many connections时候无法登录的问题,mysql manual有如下的说明:

mysqld actually allows max_connections+1 clients to connect. The extra connection isreserved for use by accounts that have the SUPER privilege. By granting the SUPER privilege to administrators and not tonormal users (who should not need it), an administrator can connect to theserver and use SHOW PROCESSLIST to diagnose problems even if the maximum number ofunprivileged clients are connected.

因此, 必须只赋予root用户的SUPER权限,同时所有数据库连接的帐户不能赋予SUPER权限。前面说到的报错后无法登录就是由于我们的应用程序直接配置的root用户

总结,解决问题的最终方法:

1.修改参数文件my.cnf,调整连接参数

2.检查程序代码,对于没有关闭的链接及时进行关闭

时间: 2024-08-13 00:00:26

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

分享:mysql too many open connections问题解决方法

mysql too many open connections问题解决方法.原文参考:http://www.jbxue.com/db/10068.html 原因主要是:max_connections配置问题导致,它必须在[mysqld]下面才会生效. 曾经以为在my.cnf写入max_connections = 2000就可以改变mysql的最大并发量,今天查到一个命令,发现服务器的mysql最大连接数为151.控制台,连接上mysqlshow variables; 这条命令可以看到所有基础配置

MySQL中too many connections超出最大连接数的处理方法

MySQL最大连接数的问题 在MySQL的源码中,默认最大的连接数是16384 {"max_connections", OPT_MAX_CONNECTIONS, "The number of simultaneous clients allowed.", (gptr*) &max_connections, (gptr*) &max_connections, 0, GET_ULONG, REQUIRED_ARG, 100, 1, 16384, 0, 1

MySql中插入乱码问题解决

今天在使用Java写入数据库时候,发现Insert语句和Update语句在执行过后,数据库中中文显示的是"??",经过一番查阅,其中关键的问题在于编码格式是否统一. 其中创建表时候,每个关键字的格式都设置为统一的,这里我设置为utf8如图: 然后会发现,在数据库中,执行sql语句时,不会发生乱码,但是在使用Java调用的时候,就会乱码,其实原因也是这样,在连接数据库时,我们需要定义编码格式,大家看代码就明白了,当编码格式全部统一为utf8时候,就不会出现乱码了. 1 Class.for

mysql中CONCAT值为空的问题解决办法

在mysql中concat函数有一个特点就是有一个值为null那么不管第二个字符有多少内容都返回为空了,这个特性让我们在实例应用中可能觉得不方便,但实现就是这样我们需要使用其它办法来解决. 天在做opencart开发的时候,需要对用户表中用户的电话号码和区号连接起来,于是使用了concat方法,  代码如下 复制代码 SELECT CONCAT(isdcode,telephone) FROM gb_customer 竟然发现很多NULL列,telephone明明是有值的,于是查询了相关conca

mysql中Table is read only错误解决方法

今天再我把数据库data 拷贝到linux 下运行程序 ”mysql中Table is read only的解决“ 出现这样的问题,查询资料. linux下执行如下命令即可 #mysqladmin -u root -p flush-tables 还有就是目录权限问题 因为数据较多,导出->导入比较慢,我是直接压缩,下载然后解压的,考虑到目录权限问题,数据库目录的所属用户和组改为mysql 代码 chown -R mysql:mysql(www.111cn.net) /usr/local/mysq

mysql中采用concat来拼接中文字符乱码解决方式(转)

mysql中采用concat来拼接中文字符乱码解决方式 - fuxuejun的专栏 - 博客频道 - CSDN.NET http://blog.csdn.net/fuxuejun/article/details/6284725 mysql concat乱码问题解决 concat(str1,str2) 当concat结果集出现乱码时,大都是由于连接的字段类型不同导致,如concat中的字段参数一个是varchar类型,一个是int类型或doule类型,就会出现乱码. 解决方法:利用mysql的字符

sql点滴37—mysql中的错误Data too long for column '' at row 1

原文:sql点滴37-mysql中的错误Data too long for column '' at row 1   1.MYSQL服务 我的电脑——(右键)管理——服务与应用程序——服务——MYSQL——开启(停止.重启动) 2.命令行方式 Windows 1.点击“开始”->“运行”(快捷键Win+R). 2.启动:输入 net stop mysql 3.停止:输入 net start mysql 提示* Redhat Linux 也支持service command,启动:# servic

解决Mysql错误Too many connections的方法

MySQL数据库 Too many connections出现这种错误明显就是 mysql_connect 之后忘记 mysql_close:当大量的connect之后,就会出现Too many connections的错误,mysql默认的连接为100个,而什么情况下会出现这种错误呢? 正常的mysql_connect 之后调用 mysql_close()关闭连接但在连接错误时,会者mysql_real_query()出现错误退出时,可能忘记mysql_close();所以在程序return

MySQL中查询日志与慢查询日志的基本学习教程(转)

一.查询日志 查询日志记录MySQL中所有的query,通过"--log[=file_name]"来打开该功能.由于记录了所有的query,包括所有的select,体积比较大,开启后对性能也有比较大的影响,所以请大家慎用该功能.一般只用于跟踪某些特殊的sql性能问题才会短暂打开该功能.默认的查询日志文件名为:hostname.log.  ----默认情况下查看是否启用查询日志: 1 [[email protected] mysql5.5]# service mysql start 1