首页 > 数据库 >mysql超出最大连接数解决方法

mysql超出最大连接数解决方法

时间:2023-09-01 19:01:04浏览次数:51  
标签:00 create mysql 连接数 sql 超出 gmt

遇到mysql超出最大连接数,相信不少人第一反应就是查看mysql进程,看有没有慢查询,当然这个做法是完全正确的!
但是很多时候真正的问题不在这里。
今天有遇到同样的问题,一味查看mysql进程和慢查询日志,无果。
后来老大提点了一下,查看一下nginx日志,发现有一两个访问执行时候比较长,然后使用top命令查看了一下服务器负载,惊了,居然超高!
最后发现原来有一台web分流主机挂了,导致另外几台web主机负载增高,从而导致了php-fpm的执行效率降低。
那么这跟mysql有什么关系呢?原因很简单,因为php执行时间过长,mysql连接迟迟未释放,就会导致连接数过多出现。
最后总结:其实很多时候,一个问题的根本原因并不是那么直接的呈现出来,需要自己去跟踪。
老大有一句很实用的话:遇到问题先查日志(mysql、php、nginx等)

 ===============================================================

排查连接数过多的方法

当用户收到链接数告警时,意味着连接数即将达到该实例的上限。如果实例的连接数超过了实例规定的连接数,将无法创建新的连接,这个时候会影响用户的业务;


Mysql 的连接通常是一个请求占用一个连接,如果该请求(update,insert,delete,select)长时间没有执行完毕,则会造成连接的堆积,迅速的消耗完数据库的连接数,这个时候技术支持人员就要登录数据库进行排序,看看到底是那些sql 占用了连接;

问题排查步骤:


1 、查看实例配置:

可登录RDS控制台“详情与配置”查看实例额定链接数,我们假设最高支持1500个链接


2、 查看当前的连接数:

1)可登录RDS控制台“性能监控”查看实例当前链接数。

2)或者登录数据库查询当前连接,可以使用同步账号或者用户的业务账号登录数据库,执行show processlist;

[[email protected] ~]# mysql -uroot -h127.0.0.1 -P3020 -e “show processlist”|wc -l

1262

可以看到该实例已经有1262 个连接


3、排查是什么动作占用了这些连接:

[[email protected] ~]# myql -uroot -h127.0.0.1 -P3018 -e “show full processlist”>/tmp/1.log

[email protected] # 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

……………….此处省略其他sql


4、分析连接占用的原因:

可以看到数据库中有长时间没有执行完成的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’) AN

D gmt_modified >= NAME_CONST(‘v_curr’,_binary’2012-12-24 10:32:00’ COLLATE ‘binary’)

是用户从sys_info 数据库中拉取订单到自己的业务库中那个,但是在orders 表上没有gmt_modified 的索引,导致了全表扫描;(更加详尽的排查方法可以参考:为什么我的RDS慢了);


第二条sql:

看到这条sql 正在进行sorting 排序,为什么导致sql 长时间sorting,通常情况下为排序的结果集太大导致排序不能在内存中完成,需要到磁盘上排序,进而导致了性能的下降;解决的办法就是降低排序的结果集,常用的手段是利用索引的有序性,消除排序,或者建立适当的索引减小结果集;我们可以看到第二条sql 的排序字段非常的复杂,但是我们可以看到查询的时间范围是很短,只有5 分钟的时间间隔,这个时候就可以在gmt_create上创建一个索引,过滤掉大部分的记录:

Alter tale order_1 add index ind_order_gmt_create(gmt_create);

(该用户对orders 进行了分表,大概有50 多张分表需要添加gmt_create 字段的索引);


5、经过上面两步的优化后,用户实例恢复正常:io 情况和connection 情况,可再次登录RDS控制台查看连接数。

标签:00,create,mysql,连接数,sql,超出,gmt
From: https://blog.51cto.com/u_14682436/7325530

相关文章

  • mysql的GTID同步
    什么是GTID?GTID(GlobalTransactionID)是对于一个已提交事务的编号,并且是一个全局唯一的编号。GTID实际上是由UUID+TID组成的。其中UUID是一个MySQL实例的唯一标识。TID代表了该实例上已经提交的事务数量,并且随着事务提交单调递增。下面是一个GTID的具体形式:03a1eb63......
  • 下载和安装MySQL服务器
    要下载和安装MySQL服务器,您可以按照以下步骤进行操作。请注意,MySQL的版本和安装方法可能会有所不同,因此确保查看官方网站以获取最新的安装指南和下载链接。以下是在常见的Windows、Linux和macOS操作系统上安装MySQL服务器的基本步骤:在Windows上安装MySQL服务器:访问MySQL官方......
  • 达梦数据库:第一章:MySQL数据库与达梦数据库的区别
    达梦数据库管理系统是达梦公司推出的具有完全自主知识产权的高性能数据库管理系统,简称DM,它具有如下特点:1、通用性达梦数据库管理系统兼容多种硬件体系,可运行于X86、X64、SPARC、POWER等硬件体系之上。DM各种平台上的数据存储结构和消息通信结构完全一致,使得DM各种组件在不同的硬......
  • MySQL 的 commit 是怎么 commit 的?【转】
    MySQL的 commit命令提交事务时,内部会进行两阶段(Prepare和Commit)提交,这篇文章基于MySQL8.0.33对MySQL的两阶段提交进行源码分析,带你了解提交事务过程中都经历了什么。以下是整体逻辑:一、Prepare阶段1.BinlogPrepare获取上一个事务最大的 sequencenumber时间戳。......
  • 【MySQL】MySQL主从复制延迟原因及处理思路
     MySQL主从复制延迟原因及处理思路主库DML请求频繁(TPS较大)主库写请求较多,有大量insert、delete、update并发操作,短时间产生了大量的binlog【原因分析】主库并发写入数据,而从库SQLThread为单线程应用日志,很容易造成relaylog堆积,产生延迟。【解决思路】做sharding,通过s......
  • 通过延迟从库来恢复MySQL数据【转】
    在前面,我们讲了,通过创建一个临时从库,再把数据同步到误操作的前一个事务,来恢复误删除的数据,可以点击跳转。但是临时准备一套从库,会多花费很多时间,那有没有更快的办法呢?这一篇文章,就讲一下通过延迟从库,来恢复误删除的数据。比如平时这个从库都是延迟主库1小时,当主库出现误操作,从......
  • Linux完全卸载MySQL(二进制包/源码 安装方式)
    测试环境说明:[root@linuxpg53~]#cat/etc/redhat-releaseCentOSLinuxrelease7.6.1810(Core)[root@linuxpg53~]#mysql--versionmysqlVer14.14Distrib5.7.30,forlinux-glibc2.12(x86_64)usingEditLinewrappermysql>status--------------mysqlVer......
  • mysql数据库运行sql:datetime(0) NULL DEFAULT NULL报错【杭州多测师_王sir】
     一、错误信息CREATETABLE`file`(`id`varchar(32)CHARACTERSETutf8mb4COLLATEutf8mb4_general_ciNOTNULLCOMMENT'文件md5',`name`varchar(128)CHARACTERSETutf8mb4COLLATEutf8mb4_general_ciNOTNULL,`create_time`datetime(0)NULLDEFA......
  • MySQL的基本概念和常见用法
    MySQL是一种流行的开源关系型数据库管理系统(RDBMS),广泛用于开发Web应用程序和管理数据。以下是MySQL的知识大纲,涵盖了MySQL的基本概念和常见用法:1.数据库基础什么是数据库?什么是关系型数据库?数据库管理系统(DBMS)的作用。MySQL的历史和发展。2.安装和配置下载和安装MySQL......
  • 软件测试|MySQL唯一约束详解
    简介MySQL唯一约束(UniqueKey)是指所有记录中字段的值不能重复出现。MySQL中的唯一约束是一种用于确保表中某列或多列的取值唯一的数据库约束。唯一约束的作用是防止表中出现重复的值,确保数据的完整性和一致性。在本文中,我们将详细介绍MySQL中唯一约束的定义、用法以及其在数据库设......