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 需求,让你什么时候提测;那肯定接受不了啊,随时陷入奔溃边缘,脾气瞬间暴涨,离职了不干了。
涉及业务:① 写业务操作数据库结束之后一定要释放当前的链接;② 系统初始化创建一块连接池;用户访问数据库时,从连接池中取出一个已建立的空闲连接对象;使用完毕之后,并不是关闭连接,而是放回连接池给下一个请求使用。

浙公网安备 33010602011771号