MySQL ERROR 1040: Too many connections

如题,本章主要讲下当服务器出现 ERROR 1040: Too many connections错误时的一些处理心得。html

max_connections查看

## 查看最大链接数
SHOW VARIABLES LIKE "max_connections";
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| max_connections | 512   |
+-----------------+-------+

## 查看已使用最大链接数
SHOW VARIABLES LIKE 'Max_used_connections';
+----------------------+-------+
| Variable_name        | Value |
+----------------------+-------+
| Max_used_connections | 499   |
+----------------------+-------+

处理方案

这个问题通常有两种处理方案,解决方案很是容易,咱们只须要增长max_connections链接数便可。mysql

增长当前会话的mysql最大链接数

SET GLOBAL max_connections = 1000;

上面mysql链接值临时增长到1000,但仅适用于当前会话。一旦咱们从新启动mysql服务或从新启动系统,该值将重置为默认值。sql

永久增长mysql最大链接数

为了永久增长mysql链接数,咱们须要编辑mysql配置文件,即/etc/my.cnfshell

sudo vim /etc/my.cnf数据库

## 修改
max_connections = 1000

保存文件重启MySQL便可生效。编程

扩多少合适?

Max_connextions并非越大越好的,那么如何配置?vim

方式一

对于提升MySQL的并发,很大程度取决于内存,官方提供了一个关于innodb的内存计算方式缓存

innodb_buffer_pool_size
+ key_buffer_size
+ max_connections * (sort_buffer_size + read_buffer_size + binlog_cache_size)
+ max_connections * 2MB

方式二

安装比例扩容:服务器

max_used_connections / max_connections * 100% = [85, 90]%

最大使用链接数/最大链接数达到了80%~90%区间,就建议进行优化或者扩容了。并发

扩展

如下也涉及几种常见的影响MySQL性能的状况:

线程

SHOW STATUS LIKE  'Threads%';
+-------------------+--------+
| Variable_name     | Value  |
+-------------------+--------+
| Threads_cached    | 1      | 
| Threads_connected | 217    |
| Threads_created   | 29     |
| Threads_running   | 88     |
+-------------------+--------+

SHOW VARIABLES LIKE 'thread_cache_size';
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| thread_cache_size | 10     |
+-------------------+-------+
  • Threads_cached 线程在缓存中的数量
  • Threads_connected 当前打开的链接数
  • Threads_created 建立用于处理链接的线程数。
  • Threads_running 未休眠的线程数

若是Threads_created大,则可能要增长thread_cache_size值。缓存未命中率能够计算为Threads_created / Connections

查看表锁状况

SHOW GLOBAL STATUS LIKE 'table_locks%';
+-----------------------+-------+
| Variable_name         | Value |
+-----------------------+-------+
| Table_locks_immediate | 90    |
| Table_locks_waited    | 0     |
+-----------------------+-------+
  • Table_locks_immediate 当即得到表锁请求的次数
  • Table_locks_waited 没法当即得到对表锁的请求的次数,须要等待。这个值太高说明性能可能出现了问题,并影响链接的释放

慢查询

show variables like '%slow%';

+---------------------------+----------------------------------------------+
| Variable_name             | Value                                        |
+---------------------------+----------------------------------------------+
| slow_launch_time          | 2                                            |
| slow_query_log            | On                                           |
+---------------------------+----------------------------------------------+

线程详情

## 查看每一个线程的详细信息
SHOW PROCESSLIST;
+--------+----------+------------------+--------------+---------+-------+-------------+------------------+
| Id     | User     | Host             | db           | Command | Time  | State       | Info             |
+--------+----------+------------------+--------------+---------+-------+-------------+------------------+
|      3 | xxxadmin | localhost        | NULL         | Sleep   |     1 | cleaning up | NULL             |
|      4 | xxxadmin | localhost        | NULL         | Sleep   |     0 | cleaning up | NULL             |
|      5 | xxxadmin | localhost        | NULL         | Sleep   |     6 | cleaning up | NULL             |
+--------+----------+------------------+--------------+---------+-------+-------------+------------------+

总结

固然,以上只是一个大概的解决思路,不管使用哪种方式,都须要结合实际业务场景去扩容。

另外,对于生产环境,设置恰当的告警阈值,也是颇有必要的。

最后,在编程时,因为用MySQL语句调用数据库执行SQL,会分配一个线程操做MySQL,因此在结束调用后,须要回收链接,避免泄漏。

参考文章

https://dev.mysql.com/doc/ref...

https://dev.mysql.com/doc/ref...

https://dev.mysql.com/doc/ref...

MySQL Calculator

相关文章
相关标签/搜索