Mysql连接数过多,导致连接不上数据库

报错代码:
➜  ~ mysql -uroot -p
ERROR 1040 (0000):Too many connections
报错原因:
① mysql链接数太多,已经超出我们设置的默认链接数;导致链接不上数据库,业务自然也拉跨了

② 可能存在mysql设置wait_timeout的值偏大,导致连接的空闲等待太长,则造成当前连接数变大
解决问题的思路:
### 查询mysql数据库当前设置的最大连接数

mysql> show variables like "%connections";
+------------------------+-------+
| Variable_name          | Value |
+------------------------+-------+
| max_connections        | 151   |  -- mysql支持的最大连接
| max_user_connections   | 0     |  -- 用户能最大连接进来的数量
| mysqlx_max_connections | 100   |  -- 可以接受的最大并发客户端连接数 跟max_connections相同;8.0版本增加
+------------------------+-------+
3 rows in set (0.01 sec)

### 再看看最大连接数
mysql> show status like 'Threads%';
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| Threads_cached    | 1     | -- 是指mysql管理的线程池中还有多少可以被复用的资源
| Threads_connected | 5     | -- 是指打开的连接数;跟show processlist结果相同
| Threads_created   | 10    | -- 是指新创建的thread
| Threads_running   | 2     | -- 是指真正运行中的连接数;当前并发数量
+-------------------+-------+
4 rows in set (0.04 sec)

### 查看链接超时配置

mysql> show variables like '%timeout%';
+-----------------------------------+----------+
| Variable_name                     | Value    |
+-----------------------------------+----------+
| connect_timeout                   | 10       |
| delayed_insert_timeout            | 300      |
| have_statement_timeout            | YES      |
| innodb_flush_log_at_timeout       | 1        |
| innodb_lock_wait_timeout          | 50       |
| innodb_rollback_on_timeout        | OFF      |
| interactive_timeout               | 28800    | -- 服务器关闭交互式连接前等待活动的秒数
| lock_wait_timeout                 | 31536000 |
| mysqlx_connect_timeout            | 30       |
| mysqlx_idle_worker_thread_timeout | 60       |
| mysqlx_interactive_timeout        | 28800    | -- 服务器关闭交互式连接前等待活动的秒数
| mysqlx_port_open_timeout          | 0        |
| mysqlx_read_timeout               | 30       |
| mysqlx_wait_timeout               | 28800    | -- 等待交互式客户端超时的秒数
| mysqlx_write_timeout              | 60       |
| net_read_timeout                  | 30       |
| net_write_timeout                 | 60       |
| rpl_stop_slave_timeout            | 31536000 |
| slave_net_timeout                 | 60       |
| wait_timeout                      | 28800    |  -- 服务器关闭非交互连接之前等待活动的秒数
+-----------------------------------+----------+
20 rows in set (0.00 sec)
问题解决方案:
### 设置最大连接数(必须要根据服务器的实际负载情况来设置,不是很推荐)
① mysql> set global max_connections =200;
  Query OK, 0 rows affected (0.00 sec)

② mysql> set global max_user_connections =100;
  Query OK, 0 rows affected (0.00 sec)

③ mysql> set global mysqlx_max_connections =100;
  Query OK, 0 rows affected (0.00 sec)

### 重启mysql服务,释放部分链接
systemctl start mysqld.service

### 如果是因为等待超时时间太长引起可以修改时间 (不推荐)
① mysql> set interactive_timeout =31536000;
  Query OK, 0 rows affected (0.00 sec)

② mysql> set wait_timeout =31536000;
  Query OK, 0 rows affected (0.00 sec)

以上都可以通过修改mysql的配置文件重启生效

调整最大连接数:存在安全隐患,我们无法确认数据库能承受最大连接压力;就好比你一天能做 3 个需求,突然组长给你 10 需求,让你什么时候提测;那肯定接受不了啊,随时陷入奔溃边缘,脾气瞬间暴涨,离职了不干了。

涉及业务:① 写业务操作数据库结束之后一定要释放当前的链接;② 系统初始化创建一块连接池;用户访问数据库时,从连接池中取出一个已建立的空闲连接对象;使用完毕之后,并不是关闭连接,而是放回连接池给下一个请求使用

posted @ 2025-08-13 12:32  寻码疹  阅读(122)  评论(0)    收藏  举报