favouriter 2020-08-06
客户跟我反馈他们的数据库通过客户端数据库工具连接不上了,并且截图我看了,数据库是mysql 报错内容"MySQL error: 2013, “Lost connection to MySQL server at ‘reading initial communication packet‘, system error: 0""
开启两个"session",一个用于实时监控mysql的错误日志,而且奇怪的是错误日志最后一条信息的输出时间为2020/08/04, 我就觉得很奇怪,今天都8月5号来了,难道这段时间数据库都不输出日志的吗? 但是由于间隔时间不长,然后数据库也连接不上,我先入为主的认为可能数据库已经假死, 导致日志信息都不输出,所以我并没有在意!
我开始启动数据库,但是还是启动失败,但是错误日志还是没有任何输出,我就觉得很奇怪, "磁盘空间也没满",为什么我连重启数据库怎么也不输出错误日志呢,没错误日志排查不就是盲查吗?
错误日志行不通,于是我就去看了下系统日志message,或许能找到点有用的信息, 突然发现里面打印了一条"no many open file",难道是因为进程打开的文件数超过了默认的设置限制吗? 我通过"ulimit -n" 看了下发现进程打开的文件数是65535而我mysql这刚启动怎么可能出现超过"65535"的可能, 于是我判断应该是有某个进程打开了文件数超过了"65535",但是我又不想也不对啊, 即使某个进程超过了"65535"的限制但是我"mysql"不受影响啊,难道是说系统打开的文件数达到了上限? 于是我通过"sysctl -a|grep fs.file"查看系统的限制发现也是"65535",原来是系统达到了临界点了, 于是我就通过"lsof |wc -l "查看当时系统打开的文件数,发现已经达到"70000"多了,终于找到了原因了
排序当前系统中打开文件数前十的进程
lsof |awk ‘{print $1}‘|sort|uniq -c |sort -nr|head -10
找到了原因接下来就是查看哪个进程打开的文件数最多了,发现是"java程序导致"的, 于是就反馈给我们客户让他找相关的开发同事着重排查下, 是不是打开文件的时候未"close"文件
1丶由于系统打开文件数上限,导致mysql错误日志无任何日志输出 2丶不要盲目的去尝试,通过看日志排错是最好的选择 3丶当自己的才华不足以满足自己的野心时,记得静下心来学习