念念不忘必有回响,排查问题不要心急,要静,带上耳机一顿思考。错误其实已经百度了,但是总是看不出来什么原因。用百度或许要先给百度拍错。
第一天开发发来问题
现象1: 报错1
开发:这个是ETL的报错,ETL工具是informatica。当天凌晨两点一直报错(把调度重新执行就可以了),到早晨之后MySQL就很慢。
[unixODBC][MySQL][ODBC 5.3(w) Driver]Lost connection to MySQL server at 'reading initial communication packet',
mysql的报错可以在mysql的error文档中找到:
https://dev.mysql.com/doc/
搜索方法是这样的
查到如下问题
英文版
然后看mysql的errorlog
这里问了一个朋友说是java用了已经弃用的tlsv1.1协议造成的,错误的连接,注意是错误的连接。
开发:只是在两点开始报错,informatica工具没有做过更改。这就有点难了。MySQL我没做过更改,informatica开发没做过更改。并且报错是从两周前才开始的
于是看了下mysql的errorlog发现
[Warning] Accepted a connection with deprecated protocol 'TLSv1.1' for account `userk`@`%` from host `1.1.1.2`. Client supplied username `user`
这个报错其实从安装就有了,于是怀疑是不是错误数状态达到了一定值。(后来想了想,错误达到一定程度的报错是另外的,如现象2:报错2)
后来反复阅读错误,我发现官网说是尝试使用经典MySQL协议连到X协议,意思是尝试,应该是informatica尝试来着。但是以前为啥没尝试呢,在看看mysql能不能关闭一些协议吧
再来说执行慢的
总结:第三天在思考的时候我怀疑是因为informatica在两点断开了,然后再开启同步导致了informatica在早晨同步数据导致的。
通过收集信息,iotop发现每秒的读有50M以上,iowait 10%以上,登录服务器都缓慢了。
从慢日志了抓出来一个100秒的SQL优化了下,SQL走了个错误的索引。force index(index_name很快)
忘记用iohigh.sh去抓IO高的SQL了。当时开发发来一个错误,我一直以为错误一直存在,我就想着先处理问题。
第二天开发又发来问题
现象2:报错2
Caused by: io.debezium.DebeziumException: Error reading MySQL variables: null, message from server: "Host '1.1.1.1' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts'"
这里说的是%的主机名被阻塞了,1.1.1.1虽然在mysqlerrorlog里没有报错,但是他匹配的是%,并且1.1.1.2(现象1: 报错1中的IP)一直有错误,他俩都是通过匹配%连接mysql的,通过msyql.user可以看到
官网地址: https://dev.mysql.com/doc/refman/5.7/en/host-cache.html
好像从这里看不出来什么,但是结合报错1可以发现问题。
第三天,开发又发来问题
现象:
直接官网是没有了
百度看了看让加skip-name-resolve,禁用DNS解析,官网看了参数,需要重启,于是想通过在/etc/hosts中加入应用对方的/etc/hosts,奈何应用服务器没有自己的hosts,并且写了MySQL的hosts。
看到一篇官方dns的文章,应该是解析错误了
https://dev.mysql.com/doc/refman/5.7/en/host-cache.html
https://dev.mysql.com/doc/refman/5.7/en/performance-schema-host-cache-table.html ---关于host_cache
每个列的解释
下次遇到问题的时候先查询下
select * from performance_schema.host_cache where IP = '1.1.1.3'G
这里可以看到解析确实失败了,但是还没找到为什么