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

 更新时间:2012年09月22日 08:59:26   作者:  
因为你的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 的CASE WHEN 语句使用说明

    MySQL 的CASE WHEN 语句使用说明

    本文介绍下,在mysql数据库中,有关case when语句的用法,介绍了case when语句的基础知识,并提供了相关实例,供大家学习参考,有需要的朋友不要错过
    2011-10-10
  • Access数据库的存储上限

    Access数据库的存储上限

    Access数据库的存储上限...
    2006-09-09
  • MySQL开启慢查询日志log-slow-queries的方法

    MySQL开启慢查询日志log-slow-queries的方法

    MySQL中提供了一个慢查询的日志记录功能,可以把查询SQL语句时间大于多少秒的语句写入慢查询日志,日常维护中可以通过慢查询日志的记录信息快速准确地判断问题所在
    2016-05-05
  • MySQL数据库的触发器和事务

    MySQL数据库的触发器和事务

    这篇文章主要介绍了MySQL数据库的触发器和事务,触发器是SQL server提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,是由事件来触发
    2022-08-08
  • Myeclipse连接mysql数据库心得体会

    Myeclipse连接mysql数据库心得体会

    这篇文章主要为大家详细介绍了MyEclipse连接MySQL数据库图文教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-10-10
  • 如何修改Xampp服务器上的mysql密码(图解)

    如何修改Xampp服务器上的mysql密码(图解)

    如果我们使用Xampp服务器自带数据库mysql,就必须先修改mysql的密码,下面小编给大家分享如何修改Xampp服务器上的mysql密码,需要的朋友参考下吧
    2017-04-04
  • 如何使用mysqladmin获取一个mysql实例当前的TPS和QPS

    如何使用mysqladmin获取一个mysql实例当前的TPS和QPS

    这篇文章主要介绍了如何使用mysqladmin这个工具来获取一个mysql实例当前的TPS和QPS,帮助大家更好的管理数据库,感兴趣的朋友可以了解下
    2020-11-11
  • MySQL数据库数据视图

    MySQL数据库数据视图

    这篇文章主要介绍了MySQL数据库数据视图,视图是原始数据库数据的一种变换,是查看表中数据的另外一种方式,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下
    2022-08-08
  • mysql学习笔记之完整的select语句用法实例详解

    mysql学习笔记之完整的select语句用法实例详解

    这篇文章主要介绍了mysql学习笔记之完整的select语句用法,结合实例形式详细分析了mysql select语句各种常见参数、使用方法及操作注意事项,需要的朋友可以参考下
    2020-04-04
  • mysql 截取指定的两个字符串之间的内容

    mysql 截取指定的两个字符串之间的内容

    今天我同事在用mysql的时候,需要对一个字符串中的指定内容进行截取
    2009-07-07

最新评论