怎样解决mysql连接过多的错误?

1、数据库系统允许的最大可连接数max_connections。这个参数是可以设置的。如果不设置,默认是100。最大是16384。2、数据库当前的连接线程数threads_connected。这是动态变化的。查看max_connections、max_connections的办法见后。如果 threads_connected == max_connections 时,数据库系统就不能提供更多的...
怎样解决mysql连接过多的错误?
  答:系统不能连接数据库,关键要看两个数据:
  1、数据库系统允许的最大可连接数max_connections。这个参数是可以设置的。如果不设置,默认是100。最大是16384。
  2、数据库当前的连接线程数threads_connected。这是动态变化的。
  查看max_connections、max_connections的办法见后。
  如果 threads_connected == max_connections 时,数据库系统就不能提供更多的连接数了,这时,如果程序还想新建连接线程,数据库系统就会拒绝,如果程序没做太多的错误处理,就会出现类似强坛的报错信息。
  因为创建和销毁数据库的连接,都会消耗系统的资源。而且为了避免在同一时间同时打开过多的连接线程,现在编程一般都使用所谓数据库连接池技术。
  但数据库连接池技术,并不能避免程序错误导致连接资源消耗殆尽。
  这种情况通常发生在程序未能及时释放数据库连接资源或其他原因造成数据库连接资源不能释放,但强坛系统估计不会发生这种低级的编程错误。
  该错误的简便的检查办法是,在刷新强坛页面时,不断监视threads_connected的变化。如果max_connections足够大,而 threads_connected值不断增加以至达到max_connections,那么,就应该检查程序了。当然,如果采用数据库连接池技术, threads_connected增长到数据库连接池的最大连接线程数时,就不再增长了。
  从强坛出错的情况看,更大的可能性是数据库系统没能进行适当地配置。下面提出一点建议。供参考
  让你们的工程师把MySQL的最大允许连接数从默认的100调成32000。这就不会老出现连接过多的问题了。
  查看max_connections
  进入MySQL,用命令:
  show variables
  查看数据库最大可连接数的变量值:2013-10-27
在MySQL 8.0 之前, 我们假设一下有一条烂SQL,
mysqlselect * from t1 order by rand() ;
以多个线程在跑,导致CPU被跑满了,其他的请求只能被阻塞进不来。那这种情况怎么办?

大概有以下几种解决办法:
设置max_execution_time 来阻止太长的读SQL。那可能存在的问题是会把所有长SQL都给KILL 掉。有些必须要执行很长时间的也会被误杀。
自己写个脚本检测这类语句,比如order by rand(), 超过一定时间用Kill query thread_id 给杀掉。
那能不能不要杀掉而让他正常运行,但是又不影响其他的请求呢?
那mysql 8.0 引入的资源组(resource group,后面简写微RG)可以基本上解决这类问题。
比如我可以用 RG 来在SQL层面给他限制在特定的一个CPU核上,这样我就不管他,让他继续运行,如果有新的此类语句,让他排队好了。
为什么说基本呢?目前只能绑定CPU资源,其他的暂时不行。
那我来演示下如何使用RG。
创建一个资源组user_ytt. 这里解释下各个参数的含义,
type = user 表示这是一个用户态线程,也就是前台的请求线程。如果type=system,表示后台线程,用来限制mysql自己的线程,比如Innodb purge thread,innodb read thread等等。
vcpu 代表cpu的逻辑核数,这里0-1代表前两个核被绑定到这个RG。可以用lscpu,top等列出自己的CPU相关信息。
thread_priority 设置优先级。user 级优先级设置大于0。
mysqlmysql> create resource group user_ytt type = user vcpu = 0-1 thread_priority=19 enable;Query OK, 0 rows affected (0.03 sec)
RG相关信息可以从 information_schema.resource_groups 系统表里检索。
mysqlmysql> select * from information_schema.resource_groups;+---------------------+---------------------+------------------------+----------+-----------------+| RESOURCE_GROUP_NAME | RESOURCE_GROUP_TYPE | RESOURCE_GROUP_ENABLED | VCPU_IDS | THREAD_PRIORITY |+---------------------+---------------------+------------------------+----------+-----------------+| USR_default | USER | 1 | 0-3 | 0 || SYS_default | SYSTEM | 1 | 0-3 | 0 || user_ytt | USER | 1 | 0-1 | 19 |+---------------------+---------------------+------------------------+----------+-----------------+3 rows in set (0.00 sec)
我们来给语句select guid from t1 group by left(guid,8) order by rand() 赋予RG user_ytt。
mysql> show processlist;+-----+-----------------+-----------+------+---------+-------+------------------------+-----------------------------------------------------------+| Id | User | Host | db | Command | Time | State | Info |+-----+-----------------+-----------+------+---------+-------+------------------------+-----------------------------------------------------------+| 4 | event_scheduler | localhost | NULL | Daemon | 10179 | Waiting on empty queue | NULL || 240 | root | localhost | ytt | Query | 101 | Creating sort index | select guid from t1 group by left(guid,8) order by rand() || 245 | root | localhost | ytt | Query | 0 | starting | show processlist |+-----+-----------------+-----------+------+---------+-------+------------------------+-----------------------------------------------------------+3 rows in set (0.00 sec)
找到连接240对应的thread_id。
mysqlmysql> select thread_id from performance_schema.threads where processlist_id = 240;+-----------+| thread_id |+-----------+| 278 |+-----------+1 row in set (0.00 sec)
给这个线程278赋予RG user_ytt。没报错就算成功了。
mysqlmysql> set resource group user_ytt for 278;Query OK, 0 rows affected (0.00 sec)
当然这个是在运维层面来做的,我们也可以在开发层面结合 MYSQL HINT 来单独给这个语句赋予RG。比如:
mysqlmysql> select /*+ resource_group(user_ytt) */guid from t1 group by left(guid,8) order by rand()....8388602 rows in set (4 min 46.09 sec)
RG的限制:
Linux 平台上需要开启 CAPSYSNICE 特性。比如我机器上用systemd 给mysql 服务加上
systemctl edit mysql@80 [Service]AmbientCapabilities=CAP_SYS_NICE
mysql 线程池开启后RG失效。
freebsd,solaris 平台thread_priority 失效。
目前只能绑定CPU,不能绑定其他资源。
2020-05-25
mengvlog 阅读 7 次 更新于 2025-07-20 16:54:59 我来答关注问题0
  • MySQL默认或设定的最大连接数外,还为root权限预留了一个额外通道,使最大连接数达到max_connections + 1。但在实际工作场景中,这个额外通道也可能被占用,导致无法通过调整参数解决“连接数过多”的问题。出现MySQL连接数过多的常见原因包括:未正确关闭mysql_connect操作、当sleep连接占满最大连接数max_...

  •  文暄生活科普 Mysql 1040报错Too many connections原因及解决办法

    一种更推荐的方法是调整连接等待时间。这可以通过修改MySQL的配置文件来实现,比如在`my.cnf`或`my.ini`中找到`max_connections`或`wait_timeout`等参数,根据实际情况适当增加等待时间,允许更多的连接请求在一段时间内排队。但是,注意这仅是临时解决办法,重启MySQL后会恢复原设置。当遇到无法登录MySQL...

  • 1、数据库系统允许的最大可连接数max_connections。这个参数是可以设置的。如果不设置,默认是100。最大是16384。2、数据库当前的连接线程数threads_connected。这是动态变化的。查看max_connections、max_connections的办法见后。如果 threads_connected == max_connections 时,数据库系统就不能提供更多的连...

  •  深空见闻 针对 mysql 数据库的 django orm "too many connections" 解决方案

    调整数据库连接池大小:核心思路:通过调整连接池的大小,来限制同时打开的连接数,从而避免超过 MySQL 数据库的最大连接数限制。操作建议:根据实际情况调整连接池的大小,确保连接数不会过多。这通常需要在数据库连接配置中进行设置。使用连接池管理工具:核心思路:利用连接池管理工具(如 DBUtils、SQLAlc...

  •  阿暄生活 Win7系统使用数据库时mysql频繁掉线无法连接的两种解决方法

    Win7系统使用数据库时mysql频繁掉线无法连接的两种解决方法:方法一:卸载KB967723补丁 步骤:登录服务器:首先,需要登录到出现问题的Win7系统服务器。进入控制面板:在服务器桌面上,点击“开始”菜单,选择“控制面板”。添加和删除程序:在控制面板中,找到并点击“程序和功能”下的“查看已安装的更新”...

檬味博客在线解答立即免费咨询

mySQL相关话题

Copyright © 2023 WWW.MENGVLOG.COM - 檬味博客
返回顶部