前段时间,线上业务偶尔会出现 SQLSTATE[HY000] [1040] Too many connections
的异常。
通常是以下两种原因之一造成的:
知识点
max_connections
Mysql 的 max_connections 是限制允许客户端同时连接的最大连接数。
1 | mysql> show variables like '%max_connections%'; |
Mysql 无论如何都会保留一个用于管理员(SUPER)登陆的连接,用于管理员连接数据库进行维护操作,所以即便当前连接数已经达到了 max_connections
,管理员仍可以连接,因此 Mysql 的实际最大可连接数为 max_connections+1
。
增加 max_connections
参数的值,不会占用太多系统资源。系统资源(CPU、内存)的占用主要取决于查询的密度、效率等。
Max_used_connections
Mysql 的 Max_used_connections 是自服务器启动以来同时使用的最大连接数。
1 | mysql> show global status like 'Max_used_connections'; |
通过查看这个值,我们就能知道是否需要调整 max_connections
。
对于 Mysql 最大连接数值的设置范围比较理想的是:服务器响应的最大连接数值占服务器上限连接数值的比例值在10%以上,如果在10%以下,说明最大连接上限值设置过高,反之如果服务器响应的最大连接数值与上限连接数值很接近,则说明最大连接上限值设置过低。
解决方案
如果业务量并不大,没有高并发等场景,大部分情况下都是第一种原因,这也是最简单的解决方案,直接修改最大连接数量。
如果是因为访问量过高,这个时候就需要考虑增加从服务器或分散读压力了(不在本文谈论范围)。
通常修改最大连接数量有两种方式:
- 直接通过命令行进行修改:
1
mysql> set global max_connections = 1000;
使用这种方式需要注意的是,更新之后的最大连接数量,只在 Mysql 当前服务进程有效,也就是说一旦重启 Mysql,又会恢复到初始状态。因为 Mysql 启动后的初始化工作是从其配置文件中读取数据的,而这种方式没有对其配置文件做更改。
- 修改配置文件:
找到 my.ini
或 my.cnf
配置文件
1 | max_connections=1000 |
重启 Mysql 即可。