问题描述
连接数满会导致客户端无法连接到RDS MySQL数据库。
问题原因
空闲连接过多。
活动连接过多。
解决方案
如果对实例或数据有修改、变更等风险操作,务必注意实例的容灾、容错能力,确保数据安全。
如果对实例(包括但不限于ECS、RDS)等进行配置与数据修改,建议提前创建快照或开启RDS日志备份等功能。
如果在阿里云平台授权或者提交过登录账号、密码等安全信息,建议及时修改。
定位
可以通过RDS控制台中云数据库RDS/实例列表/监控与报警页面,找到会话连接监控项,确认当前的连接问题是由于空闲连接数还是活跃连接数mysql.active_session导致的。
空闲连接过多
原因
应用使用长连接模式:对于长连接模式(比如Java应用),应用侧应该配置连接池。连接池的初始连接数设置过高,应用启动后建立多个到RDS实例空闲连接。
应用使用短连接模式:对于短连接模式(比如PHP应用),出现大量的空闲连接说明应用没有在查询执行完毕后显式的关闭连接。
解决方法
通过RDS控制台/会话管理、DMS或者
kill
命令来终止当前空闲会话,详细步骤请参见RDS MySQL如何终止会话。修改应用,长连接模式需要启用连接池的复用功能(建议也启用连接检测功能)。
修改应用,短连接模式需要在代码中修改查询结束后调用关闭连接的方法。
对于非交互模式连接,在控制台的参数设置里设置
wait_timeout
参数为较小值。wait_timeout
参数控制非交互模式连接的超时时间(单位秒,默认值为24小时即86400秒),当非交互式连接空闲时间超过wait_timeout
指定的时间后,RDS实例会主动关闭连接。对于交互模式连接,在控制台的参数设置里设置
interactive_timeout
参数为较小值。interactive_timeout
参数控制交互模式连接的超时时间(单位秒,默认值为2小时即7200秒),当交互式连接空闲时间超过interactive_timeout
指定的时间后,RDS实例会主动关闭连接。
在RDS MySQL实例连接数完全打满的情况下,通过DMS或者其他方式是无法连接实例的。因此对于长连接模式,建议连接池的最大连接数要略小于实例规格的连接数限制,比如保留10个连接给DMS或其他管理操作使用。当发生无法连接的情况时,建议先在控制台修改wait_timeout参数为较小值,促使RDS实例主动关闭空闲时间超过阈值的连接。
通常情况下,应用到RDS实例会采用非交互模式,具体采用哪个模式需要查看应用的连接方式配置,比如PHP通过传递MYSQL_CLIENT_INTERACTIVE常量给 mysql_connect() 函数即可开启连接的交互模式。
wait_timeout和interactive_timeout这两个参数的修改,修改前已经存在的会话保持修改前的设置,修改后新创建的会话使用新的参数设置。
活动连接过多
原因
慢查询SQL增多导致活动连接数堆积。
锁等待导致活动连接数堆积(包括InnoDB锁等待、表元数据锁等待)。
CPU使用率过高导致活动连接数堆积。
IOPS使用率高导致活动连接数堆积。
解决方法
InnoDB锁等待处理,请参见RDS for MySQL行锁等待和行锁等待超时的处理。
表元数据锁等待,请参见解决MDL锁导致无法操作数据库的问题。
CPU使用率高导致活动连接数堆积,请参见RDS MySQL/MariaDB版实例CPU使用率较高。
IOPS使用率高导致活动连接数堆积,请参见MySQL实例IOPS使用率高的原因和解决方法。