如题,本章主要讲下当服务器出现 ERROR 1040: Too many connections
错误时的一些处理心得。html
## 查看最大链接数 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
SET GLOBAL max_connections = 1000;
上面mysql链接值临时增长到1000,但仅适用于当前会话。一旦咱们从新启动mysql服务或从新启动系统,该值将重置为默认值。sql
为了永久增长mysql链接数,咱们须要编辑mysql配置文件,即/etc/my.cnf
。shell
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_created大,则可能要增长thread_cache_size值。缓存未命中率能够计算为Threads_created / Connections
SHOW GLOBAL STATUS LIKE 'table_locks%'; +-----------------------+-------+ | Variable_name | Value | +-----------------------+-------+ | Table_locks_immediate | 90 | | Table_locks_waited | 0 | +-----------------------+-------+
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...