1.问题原因
1)客户端程序在退出之前没有调用mysql_close()。[写程序的疏忽,或者数据库的db类库没有自动关闭每次的连接]
2)客户端sleep的时间在wait_timeout或interactive_timeout规定的秒内没有发出任何请求到服务器。[类似常连,类似于不完整的tcp ip协议构造,服务端一直认为客户端仍然存在(有可能客户端已经断掉了)]
3)客户端程序在结束之前向服务器发送了请求还没得到返回结果就结束掉了。[参看:tcp ip协议的三次握手]
2.解决办法
2.2 修改max_connections 的最大连接数
show variables like ‘max_connections’ 查看最大连接数
SHOW full PROCESSLIST;
查看所有连接。
show status like 'Threads%'; 查看连接总数
四. 合理设置超时时间
之所以会出现大量 sleep
占满连接,除了业务量的原因外,也有可以从超时时间着手调整,可根据实际情况适当缩短超时时间,让 MySQL 可在短时间自动清理超时连接,以达到保证连接通常的目的。
默认情况下,两者都是 28800 秒(8 小时),我们可以在 MySQL 配置文件中修改这两个参数。
如果你使用的是mysql_pconnect
这种持久连接的话,可以将超时时间降到更合适的值,比如 600 (10 分钟)甚至 60(1 分钟)。这个超时时间并没有一个明确的时间,主要还是要看你的应用场景中的实际需求。
1.在配置文件中修改超时时间(需重启 MySQL 生效):
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
interactive_timeout=60
wait_timeout=60
关于MySQL 配置文件详解,你可以查看卡拉云的另一篇博客《MySQL 配置文件 my.cnf / my.ini 逐行详解》
2.临时变更连接超时时间(无需重启):
SET GLOBAL interactive_timeout = 60;
SET GLOBAL wait_timeout = 60;
注意:
扩展阅读:《如何远程连接 MySQL 数据库,阿里云腾讯云允许远程连接教程》
五. 查看及修改最大连接数
在 MySQL 中,默认连接数为 151,我们可以通过修改 MySQL 配置文件永久调整连接数参数,也可以通过 SQL 命令临时调整。
1.查看当前 MySQL 连接数
mysql> show variables like '%max_connections%';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| max_connections | 151 |
+-----------------+-------+
1 row in set (0.01 sec)
mysql>
2.临时调整当前 MySQL 连接数
set GLOBAL max_connections = 300;
3.通过修改 MySQL 配置文件调整最大连接数
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
在 [mysqld] 下面找到 max_connections
,如果没有可直接添加。
[mysqld]
...
max_connections = 300
...
sudo systemctl restart mysql
重启后,进入 MySQL ,我们可以看到最大连接数配置已经生效。
mysql> show variables like '%max_connections%';
+------------------------+-------+
| Variable_name | Value |
+------------------------+-------+
| max_connections | 300 |
| mysqlx_max_connections | 100 |
+------------------------+-------+
2 rows in set (0.02 sec)
mysql>
扩展阅读:《MySQL 配置文件 my.cnf / my.ini 逐行详解》
六. 无法登录 MySQL 时,如何修改最大连接数
在无法登录又无法重启 MySQL 时,我们可以使用以下方法进行操作,以增大连接数。
1.修改 pid 增大连接数
我们可以使用 gdb 工具,在不进入数据库的情况下,修改最大连接数。
gdb -p $(cat data/kalacloud.pid)
-ex "set max_connections=5000" -batch
此方法仅适用于特殊、紧急情况,在生产环境使用,有一定风险,慎用。
七. 提前布局,防患于未然
max_connections
:控制最大连接数。max_user_connections
:控制单个用户的最大连接数。当此参数为 100 时,那么任意用户(含 root 用户)最多可创建 100 个连接。
制定连接策略:
max_connections = 2000
max_user_connections= 300
当 MySQL 有 6 个用户时(不含 root ),单个用户最大连接数为 300,那么 6 个用户最多有 1800 连接。那么系统总会剩下 200 个连接留给 root 使用。
原文地址:https://blog.csdn.net/a15804226768/article/details/127886517
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_50268.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!