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

因为你的mysql安装目录下的my.ini中设定的并发连接数太少或者系统繁忙导致连接数被占满

从官方文档知道linux上面编译安装的mysql默认的连接为100个,这样对于网站的需求来说是远远不够的。 
mysql官方告诉我们需要修改max_connections的值,那么我们怎么去修改呢?有两种方法 

1、修改配置文件文件 

修改/etc/my.cnf这个文件,在[mysqld]中新增max_connections=N,如果你没有这个文件请从编译源码中的support-files文件夹中复制你所需要的*.cnf文件为到/etc/my.cnf。我使用的是my-medium.cnf,中型服务器配置。例如我的[mysqld]的内容如下 
复制代码代码如下:

[mysqld] 
port = 3306 
socket = /tmp/mysql.sock 
skip-locking 
key_buffer = 160M 
max_allowed_packet = 1M 
table_cache = 64 
sort_buffer_size = 512K 
net_buffer_length = 8K 
read_buffer_size = 256K 
read_rnd_buffer_size = 512K 
myisam_sort_buffer_size = 8M 
max_connections=1000 

由于对mysql还不是很熟悉,所以很多参数没有修改。哈哈。。 

2、非使用mysqld脚本自动启动的用户。 

修改$MYSQL_HOME/bin/mysqld_safe文件 
例如:/usr/local/mysql/bin/mysqld_safe这个文件 
grep -n 'max_connection' $MYSQL_HOME/bin/mysqld_safe 
修改对应行号的max_connections参数值 
以上方法为参考网上的做法写的。 

方法二: 

在PHP手册里面找关于mysql_connect和mysql_pconnect的资料,下面是在php手册中对这两个函数的描述: 
mysql_connect 函数原型: 
resource mysql_connect ( [string server [, string username [, string password [, bool new_link [, int client_flags]]]]]) 
返回: 
如果成功则返回一个MySQL 连接标识,失败则返回FALSE。 
描述: 
mysql_connect() 建立一个到MySQL 服务器的连接。当没有提供可选参数时使用以下默认值:server = 'localhost:3306',username = 
服务器进程所有者的用户名,password = 空密码。 
如果用同样的参数第二次调用mysql_connect(),将不会建立新连接,而将返回已经打开的连接标识。参数new_link 改变此行为并使 
mysql_connect() 总是打开新的连接,甚至当mysql_connect() 曾在前面被用同样的参数调用过。参数client_flags 可以是以下常量的组合 
:MYSQL_CLIENT_COMPRESS,MYSQL_CLIENT_IGNORE_SPACE 或者MYSQL_CLIENT_INTERACTIVE。 
注: new_link 参数自PHP 4.2.0 起可用。 
client_flags 参数自PHP 4.3.0 起可用。 
一旦脚本结束,到服务器的连接就会被关闭。除非之前已经调用了mysql_close() 来关闭它。 
mysql_pconnect : 
函数原型: 
resource mysql_pconnect ( [string server [, string username [, string password [, int client_flags]]]]) 
返回: 
如果成功则返回一个正的MySQL 持久连接标识符,出错则返回FALSE。 
描述: 
mysql_pconnect() 建立一个到MySQL 服务器的连接。如果没有提供可选参数,则使用如下默认值:server = 'localhost:3306', 
username = 服务器进程所有者的用户名,password = 空密码。client_flags 参数可以是以下常量的组合:MYSQL_CLIENT_COMPRESS, 
MYSQL_CLIENT_IGNORE_SPACE 或者MYSQL_CLIENT_INTERACTIVE。 
server 参数也可以包括端口号,例如"hostname:port",或者是本机套接字的的路径,例如":/path/to/socket"。 
注: 对":port" 的支持是3.0B4 版添加的。 
对":/path/to/socket" 的支持是3.0.10 版添加的。 两者之间的区别 : 
mysql_pconnect() 和mysql_connect() 非常相似,但有两个主要区别。 
首先,当连接的时候本函数将先尝试寻找一个在同一个主机上用同样的用户名和密码已经打开的(持久)连接,如果找到,则返回此连接标识而不打开新连接。 
其次,当脚本执行完毕后到SQL 服务器的连接不会被关闭,此连接将保持打开以备以后使用(mysql_close() 不会关闭由mysql_pconnect() 建立的连接)。 
可选参数client_flags 自PHP 4.3.0 版起可用。此种连接称为"持久的"。 

小结一下,要保证你的系统不会出现Too many connections 错误,需要注意两点: 
1.保证你的apache的最大进程数不超过mysql的最大连接数; 
2.不要在程序里面用过多mysql_pconnect连接到同一个数据库服务器(一个就够了).这需要好的编码习惯和规范.特别是不断的给系统增加 
新的功能,如果不注重系统架构和编码规范,当系统的复杂度到了一定的程度,整个系统就变得无法维护了.出现问题的时候解决起来就很麻烦了. 
解决方法是修改/etc/mysql/my.cnf,添加以下一行: 
set-variable = max_connections=500 
或在启动命令中加上参数max_connections=500 
就是修改最大连接数,然后重启mysql.默认的连接数是100,太少了,所以容易出现如题错误 

以上摘自 宋利兴的专栏 以下为补充:

1.可能是mysql的max connections设置的问题
2.可能是多次insert,update操作没有关闭session,需要在spring里配置transaction支持。

解决:
1.修改tomcat里的session 的time-out时间减少为20,(不是必改项)
2.对处理量大的对数据库insert或update的操作提供transaction支持.

=======================================
下面的是解决办法:
com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Data source rejected establishment of connection, message from server: "Too many connections"

原因:

因为你的mysql安装目录下的my.ini中设定的并发连接数太少或者系统繁忙导致连接数被占满


解决方式:

打开MYSQL安装目录打开MY.INI找到max_connections(在大约第93行)默认是100 一般设置到500~1000比较合适,重启mysql,这样1040错误就解决啦。
max_connections=1000

一定要重新启动MYSQL才能生效

CMD->

net stop mysql

net start mysql

关于改变innodb_log_file_size后无法启动mysql的问题

innodb_buffer_pool_size=768M
innodb_log_file_size=256M
innodb_log_buffer_size=8M
innodb_additional_mem_pool_size=4M
innodb_flush_log_at_trx_commit=0
innodb_thread_concurrency=20
以上是对innodb引擎的初步优化, 发现是更新innodb_log_file_size=256M时候出现了问题,只要加上这个就无法启动,

后来才知道原来要STOP服务先,然后再删除原来的文件………
打开/MySQL Server 5.5/data

删除ib_logfile0, ib_logfile1........ib_logfilen
再开启选项,成功启动




今天生产服务器上的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配置文件/etc/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 is reserved for use by accounts that have theSUPER privilege. By granting the SUPER privilege to administrators and not to normal users (who should not need it), an administrator can connect to the server and use SHOW PROCESSLIST to diagnose problems even if the maximum number of unprivileged clients are connected.

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

 

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

1.修改配置文件/etc/my.cnf,调整连接参数

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
错误代码1040 "Too many connections" 是 MySQL 数据库的一个常见错误。它表示当前连接到 MySQL 数据库的客户端数量超过了 MySQL 允许的最大连接数。这个问题可能有两种原因。 首先,可能是因为服务器上运行的程序过多,导致连接数过多。这可能是因为在同一台服务器上运行了多个项目,每个项目都会占用一定数量的连接。这种情况下,你可以考虑优化服务器的配置,增加最大连接数或者减少同时运行的项目数量。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Mysql5.6报错1040 Too many connections的解决方法](https://blog.csdn.net/BBQ__ZXB/article/details/123739412)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [MySQL 报错1040 ‘Too many connections‘ 原因及解决方案](https://blog.csdn.net/m0_55837832/article/details/116707242)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [mysql连接出错:ERROR 1040 (HY000): Too many connections](https://blog.csdn.net/chj_1224365967/article/details/112397272)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值