微信二维码

二维码 扫二维码马上关注
扫码咨询
云数据库RDS连接数过多的排除方法

一般情况下来自Mysql的一个请求将产生一个连接。阿里云数据库RDS具有最高的连接限制。最大连接数根据实例的性能而变化。当长时间执行请求(update、select、insert、delete)时,将会导致后续连接大量累计。如果连接数超过限制,实例将拒绝创建新连接,这将影响业务的正常运行。当用户收到连接数超过限制的短信提醒时,相关技术人员应登录数据库,并按照以下步骤检查并及时处理长时间执行的sql。避免访问被拒绝的情况。
排查步骤:
一、查看实例配置:
        在RDS控制台“详情与配置”查看实例的数据上限,这里假设支持1500个连接。
二、查看当前的连接数:
        在RDS控制台“性能监控”可以查看实例的当前连接数。
        在客户端内执行以下SQL查看连接数
        mysql -uroot -h127.0.0.1 -P3020 -e “show processlist”|wc -l
        1371
 
      从以上代码可以发现这种实例已经有1371个连接

三、排查下,看是什么动作占用了连接
        取出Mysql日志:
       
 
myql -uroot -h127.0.0.1 -P3018 -e “show full processlist”>/tmp/1.log
        查看日志文件:
        
more /tmp/1.log
       下边是我们服务器的一个案例日志:
        
615083 my_db 223.4.49.212:54115 my_db Query 100 Sending data
     INSERT INTO tmp_orders_modify (oid, tid, seller_id, status, gmt_create, gmt_modified)
     SELECT oid, tid, seller_id, status, gmt_create, gmt_modified
     FROM sys_info.orders WHERE
     gmt_modified < NAME_CONST(‘v_last’,_binary’2012-12-24 10:33:00’ COLLATE ‘binary’) AN D gmt_modified >= NAME_CONST(‘v_curr’,_binary’2012-12-24 10:32:00’ COLLATE ‘binary’)
     621564 my_db 223.4.49.212:46596 my_db Query 3890 sorting result
     insert into tmp_trades(sid, d, h, tc, tm, tp, ic, new_tp, old_tp)
     select a.seller_id as sid,
     …………
     from orders_1 as a where seller_id =1 and is_detail = ‘1’
     and created < date_format(‘2012-12-24 10:35:00’, ‘%Y-%m-%d %H:00:00’)
     and gmt_create < date_format(‘2012-12-24 10:40:00’, ‘%Y-%m-%d %H:%i:00’) and gmt_create >= date_format(‘2012-12-24 10:35:00’, ‘%Y-%m-%d%H:%i:00’)
     group by d, h
     order by d
     …………




四、分析连接zhanyon占用的原因:
    从上边的日志可以发现,后续连接请求无法执行时因为有SQL长时间未执行完毕,所以产生大量堆积,一直到耗尽额定的连接数!所以这就需要认真的排查下为什么sql因为什么导致很长时间没有执行完毕。是不是索引没有创建好还是sql执行时耗时太严重!
    第一条sql语句:
    
INSERT INTO tmp_orders_modify (oid, tid, seller_id, status, gmt_create, gmt_modified) SELECT oid, tid, seller_id, status, gmt_create, gmt_modified FROM sys_info.orders WHERE gmt_modified <               NAME_CONST(‘v_last’,_binary’2012-12-24 10:33:00’ COLLATE ‘binary’) AND gmt_modified >= NAME_CONST(‘v_curr’,_binary’2012-12-24 10:32:00’ COLLATE ‘binary’)
    
    
这条语句s是从sys_info数据库中啦取用户订单到自己的业务库中,但是在orders表上没有gmt_modified的索引,导致了全表扫描
       第二条sql语句:
       看到这条sql正在进行sorting排序,因为什么导致sql长时间sorting,一般情况下是排序的结果集太大导致排序不能再内存中完成,需要到磁盘上排序,所以导致性能下降。降低排序的结果集就是最好的解决办           法,最常用的就是利用索引的有序性来消除排序,或建立适当的索引减小结果集。可以看到第二条sql的排序字段比较复杂,但是我们可以看到查询的时间范围是很短,时间间隔只有五分钟,这时就可以在                 
gmt_create上创建一个索引,吧大部分的记录过滤掉:
      
Alter tale order_1 add index ind_order_gmt_create(gmt_create)
      
(用户对orders 进行了分表,差不多有50 多张分表是需要添加gmt_create 字段的索引)  
五、做好上边两步的优化后,用户实例恢复正常:
        io情况和connection情况,可以再一次登录rds控制台查看连接数。

更多精彩内容,请关注元吉优惠券网:专注阿里云代金券阿里云服务器报价腾讯代金券的免费领取
更多精彩内容推荐:
云服务器的优势
阿里云第四代云服务器全新上市
阿里云云虚拟主机控制台设置默认首页的方法

 阿里云常见问题合集三
上传网站程序的方法
怎样利用阿里云云虚拟主机建站




在线客服
热线电话

扫一扫 微信加好友