服务器与mysql的连接出现⼤量close_wait
问题描述
数组的计算方法最近在查看我们游戏服务器的⽇志时发现每过⼀段时间,驱动都会报如下的错误⽇志:
<:124: write unix @->/var/run/mysqld/mysqld.sock: write: broken pipe复制代码
环境
mysql驱动: github/go-sql-driver/mysql (git SHA: be22b30)
Go version: go1.9 darwin/amd64
mysql version: Ver 5.7.19
c语言编程经典实例Server OS: Ubuntu 17.04
过程
然后开始查资料,到了 。
mysql无法连接到服务器
黑马程序员长沙校区⼤意就是,mysql有个wait_timeout变量,如果⼀个链接在这个这个变量设置的时间段内都是空闲的,那么mysql会主动断开这个连接。但是我们是使⽤的这个mysql驱动⽆法移除database/sql.DB连接池中已经⽆效的连接,导致客户端(我们的服务器)这边再次使⽤这个已经被断开的连接的时候就会报错。
查询数据库获得如下结果:
图⽚
mysql突然服务无法启动解决办法
软件编程有什么好处将MaxLifetime值设置为wait_timeout的⼀半即可:db.SetConnMaxLifetime(time.Second * 14400)
⼜出问题了
但是这样只能处理时间正常流逝的情况,为了⼿动改时间不出这种问题,我们决定每次改时间后将mysql也⼀同重启。但是由此⼜引出了新的问题。在我们的服务器重启运⾏半分钟左右(期间会有数据库查询等操作),发现⽇志⾥⾯多了Invalid connection的错误,使⽤netstat -an | grep 3306查看发现了⼤量close_wait状态的连接。
这种情况显⽽易见,肯定是mysql将我们服务器的连接断开了,猜测应该和前⾯的情况⼀致,是由于连
接空闲导致的。但是这并不合理,根据查询结果,我们mysql的wait_timeout变量值为28800,也就是说⾄少得空闲8个⼩时mysql才会主动断开连接,现在这点时间完全没有那么久。
继续查资料、分析
接着⼜是各种查资料,各种分析,最后在mysql的配置⽂件中发现,我们配置了wait_timeout=30。看来问题就出在这⾥了,空闲30秒后mysql就主动断开了连接,与实际情况相符合。那为什么我们使⽤show variables like '%timeout%';查询的结果是28800呢。原来使⽤命令查询得到的wait_timeout的值取决于interactive_timeout。虽然wait_timeout实际上是⽣效的,但是我们看到的,都是interactive_timeout的值。
更多
根据的描述,使⽤终端登录mysql进⾏连接时,mysql空闲断开取决于interactive_timeout,⽽我们使⽤⾮终端的形式连接时,mysql空闲断开取决于wait_timeout。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论