max_connections参数用于设置数据库允许的最大同时连接数。一旦连接数超过了这个设定的阈值,新的连接请求就会被拒绝,并且客户端可能会收到“Too many connections”错误消息。
MySQL8.4官方参考手册:https://dev.mysql.com/doc/refman/8.4/en/server-system-variables.html
max_connections
默认值151,最小值1,最大值100000。
假设max_connections=100,如果有100个客户端尝试同时连接数据库,所有连接都会被接受,当第102个客户端尝试连接时,将会收到“Too many connections”错误,无法连接。
我这里为什么说100和102呢,这是因为mysqld实际允许max_connections + 1个客户端连接,第101个连接保留给拥有CONNECTION_ADMIN特权(或已弃用的SUPER特权)的账户。这样设计是为了确保管理员在高负载情况下仍能访问数据库进行必要的管理操作。
演示示例
基于wlnmp源,安装MySQL8.4版本,配置max_connections参数,模拟“Too many connections”错误。
为了演示需要,修改my.cnf配置文件,max_connections设置为1,设置完成后重启数据库。
查询max_connections值
1 2 3 4 5 6 7 |
mysql> show variables like 'max_connections'; +-----------------+-------+ | Variable_name | Value | +-----------------+-------+ | max_connections | 1 | +-----------------+-------+ 1 row in set (0.00 sec) |
打开一个新的终端,执行一个60秒的SLEEP
1 |
mysql -uroot -p mysql -e "SELECT SLEEP(60);" |
查询当前MySQL连接数
1 2 3 4 5 6 7 |
mysql> SHOW STATUS LIKE 'Threads_connected'; +-------------------+-------+ | Variable_name | Value | +-------------------+-------+ | Threads_connected | 2 | +-------------------+-------+ 1 row in set (0.01 sec) |
当前客户端连接数是2,为了验证,我们再开启一个终端,执行任意查询,即可触发“Too many connections”。
1 |
mysql -uroot -p mysql -e "SELECT 1;" |
ERROR 1040 (HY000): Too many connections
注意事项
1、资源消耗:每个连接都会消耗服务器的内存和CPU资源。设置过高的max_connections可能导致资源耗尽。
2、连接池:在应用程序中,使用连接池可以有效管理连接数量,避免过多的空闲连接占用资源。
3、监控和调整:根据实际使用情况,定期监控连接数并调整max_connections。可以通过SHOW STATUS LIKE 'Threads_connected';查看当前连接数。
4、错误处理:应用程序应具备处理“Too many connections”错误的能力,确保在连接失败时有相应的重试机制或降级策略。
总结
max_connections是一个关键参数,用于控制MySQL服务器的并发连接能力。合理设置可以确保数据库的稳定性和性能。建议根据服务器的硬件配置和应用需求进行优化,并结合连接池技术来管理连接资源。
附,MySQL my.cnf配置文件生成器:https://dbcnf.wlnmp.com/
原文链接:MySQL max_connections参数介绍,转载请注明来源!