首页 > 数据库 >mysql invalid conn排查

mysql invalid conn排查

时间:2023-03-07 23:57:07浏览次数:58  
标签:invalid mysql 超时 连接 conn 客户端

mysql invalid conn排查

服务监控系列文章

服务监控系列视频

问题背景

服务使用golang ,客户端库是go-mysql-driver ,系统测试环境频繁但是不总是报出invalid conn 错误,但实际拿sql执行时却是正常执行。

排查思路

原因分析

客户端使用了无效连接

由于连接无效,首先考虑客户端使用了过期连接。

mysql服务器端和客户端都能配置各自连接的最大生命周期。

如果客户端配置的连接最大生命周期大于服务端,并且客户端没有无效连接重连的机制,则会导致服务端的连接在过期以后,客户端使用已经过期的连接,从而引发invalid conn。

查询mysql 连接的最大空闲生命周期 s为单位

show global variables like 'wait_timeout';

image.png
客户端最大生命周期配置

db.SetConnMaxLifetime(time.Duration(timeout) * time.Hour) //reconnect after 1 hour

mysql server的最大生命周期大于golang客户端的连接最大生命周期,所以排除此原因。

连接被莫名的原因关掉了,抓包分析

一时间陷入僵局,连接究竟是为何无效。直接抓包分析。

sudo tcpdump -i lo port 3306 -w conn.pcap

专家系统发现异常包

将pcap文件用wireshark打开,用专家系统对抓到的包做一个整体的分析。
看到有8个异常的RST包,正常的连接开关是不会有RST产生的,着重分析下RST产生的原因。

image.png

发现问题

image.png看到具体发生异常的地方,mysql服务器在回复客户端一个ACK消息后,客户端等了10s对mysql服务器发起了Request Quit(mysql 协议)关闭连接的命令。

具体看下异常前后。
选择菜单栏的Statistics->Flow Graph,就可以打开数据流图窗口。
image.png可以看到过程如下:
1,11:55:49.05 在客户端向mysql 发起 Request Execute Statement 执行sql的命令,
2,mysql 恢复Ack
3, 但是mysql并没有把执行结果返回给客户端,所以客户端等待了10s后发起关闭连接的命令。
4,mysql 在11:55:59.27才返回了执行结果。
5,但是这个时候客户端已经把连接关闭了,对已经关闭的连接发送数据触发了RST信号,所以客户端回应服务器RST

看到这里,已经可以很明确的任务是服务器执行sql超时了,或者说是服务器返回结果时超时了。

回到客户端代码确认报错原因

在进一步,是不是超时导致的报警呢?
可以看到在读取缓冲区数据时,有可能报出ErrInvalidConn

// read packet header
		data, err := mc.buf.readNext(4)
		if err != nil {
			if cerr := mc.canceled.Value(); cerr != nil {
				return nil, cerr
			}
			errLog.Print(err)
			mc.Close()
			return nil, ErrInvalidConn
		}

继续查看mc.buf.readNext,发现超时代码

if b.timeout > 0 {
			if err := b.nc.SetReadDeadline(time.Now().Add(b.timeout)); err != nil {
				return err
			}
		}

mysql受到什么因素导致sql过长

因为是数据库,首先想到了磁盘,再次回到top,iostat ,iotop分析。
此次发现异常。
image.png发现磁盘io使用率偶尔会飙高,所以mysql执行速率受到了影响。

解决问题

占用磁盘使用率的几个项目主要是视频转码项目,转码的时间不是固定的,所以当转码的时候,在同一台主机上的mysql受到了影响,引发了超时,导致应用层报出invalid conn 错误。

经过确认,测试环境可暂时关闭转码功能,关闭后,再也没有报警出现。

正常情况下,当抓包看到mysql返回超时是,应该立即就去看系统io等硬件指标了,这里由于是测试环境,所以我还是去看了go-mysql-client 库的代码,进一步确认。

反思

测试环境监控体系不够完善,没有监控界面,不然应该一眼能看出磁盘io异常。

其次是回归到应用层看代码的时机较晚,还是被invalid conn迷惑了,其实如果go-mysql库报错为超时错误可能会更符合这个场景。

其实从一开始,就用了top和iostat 去分析系统磁盘占用情况,但是由于那段时间内指标并无异常,加上报错信息是invalid conn 导致我首先把问题定位到是网络连接上出的问题,并抓包分析。
看到这种偶发的错误,应该持续性的观察系统指标,这次只是看了十几秒钟就转而去分析其他因素了,实属不该。

测试环境开启慢日志

show variables like 'slow_query%';

image.png
开启慢日志

set global slow_query_log=1 

标签:invalid,mysql,超时,连接,conn,客户端
From: https://www.cnblogs.com/hobbybear/p/17190258.html

相关文章

  • MySQL timestamp类型
    MySQLTIMESTAMP简介MySQLTIMESTAMP是一种保存日期和时间组合的时间数据类型。TIMESTAMP列的格式为YYYY-MM-DDHH:MM:SS,固定为19个字符。TIMESTAMP值的范围从'1970-01-......
  • MySQL
    MySQL所有的sql语句都需要用分号结尾基本命令showdatabases;--查看所有的数据库use数据库名;--切换数据库use数据库名showtables;--查看数据库中所有的表......
  • Mysql 知识总结
    1mysql数据类型1.整数类型tinyint:1个字节(2^8)smallint:2个字节mediumint:3个字节int:4个字节bigint:8个字节2.浮点数类型float:(4个字节)1个符号位,8个指数位,23......
  • Starrocks出现Lost connection to MySQL server during query
    背景:在调度中出现这个报错,但是在后台执行的时候是成功的,每次在调度上执行6分钟即360S的时候出现了这个报错,排查后发现使用的nginx代理中设置的timeout设置的是360s,所以......
  • 连上mysql数据库了,先小发表一下
    首先我的mysql是8.0版本的,用的8版本的驱动包就连接失败找不到类,后来换成5版本的就好了。一开始我按照网上的教程,告诉我需要在子线程才能执行jdbc的连接,代码如下所示:r......
  • ubuntu22.04安装mysql
    1.安装sudoaptinstallmysql-server2.设置vim /etc/mysql/mysql.conf.d/mysqld.cnf[mysqld]后加入skip-grant-tables3.重启服务servicemysqlrestart4.免密码......
  • MySQL 中 varchar 的长度
    1.varchar(n)的最大值字符数是多少varchar最大可以保存65535字节,但是具体保存多少个字符,不同的编码不一样。MySQL5.0之前的版本:n指的是n个字节n的最大值是6......
  • mysql修改存储引擎,mysql修改表字符集,mysql修改列字符集,mysql修改排序规则,mysql修改行
    【1】修改存储引ALTERTABLE`qipa250_articles`ENGINE=INNODB;ALTERTABLE`qipa250_articles_text`ENGINE=INNODB;ALTERTABLE`qipa250_authors`ENGINE=INNODB;......
  • MySQL用户新建表报1227异常
    1、MySQL8新建用户createuser'firestone'@'%'identifiedby'123456';2、给用户授予test库所有权限grantallprivilegesonfirestone_pretank.*to'firestone'@'%';3......
  • MySQL5.7主从复制教程
     MySQL5.7主从复制教程 ​简述:主从复制,是用来建立一个和主数据库完全一样的数据库环境,称为从数据库,主数据库一般是准实时的业务数据库、事务处理库,从库做查询库。......