MySQL侧的诊断信息
当应用与MySQL数据库之间的通信出现问题比如连接错误或者异常中断时,可以通过查看如下信息来帮助问题诊断:
MySQL数据库运行期产生的error log。
MySQL数据库在响应外部请求时产生的general query log。
使用show status命令查看Aborted_xxx和Connection_errors_xxx变量的值。
检查host cache。
连接中断的现象及原因
如果客户应用与MySQL数据库在应用层成功的建立了通信链接,但未使用正确的方式关闭连接或者客户应用异常中止,那么MySQL数据库将增大Aborted_clients变量的值,并将这次事件写入error log。
可能的原因如下:
客户应用退出前未调用方法来关闭数据库连接。
客户应用与MySQL数据库之间建立的数据库连接长时间闲置,超出wait_timeout或者interactive_timeout变量定义的时间值,导致连接被MySQL数据库自动关闭。
在客户应用与MySQL数据库交换数据的过程中,客户应用突然异常中止。
连接建立不成功的现象及原因
如果客户应用无法成功的与MySQL数据库建立连接,或者说无法成功得到数据库连接对象,那么MySQL数据库将会增大Aborted_connects变量的值,同时将把相关信息记录至general query log中。
可能的原因如下:
客户应用没有获取访问MySQL数据库的特权。
客户应用访问MySQL数据库时使用了错误的口令。
客户应用使用数据库连接向MySQL数据库传递数据时,报文中包含了非法的信息。
客户应用与MySQL数据库建立连接时,超出connect_timeout变量定义的时长后,仍然无法得到连接创建的报文。直白的解释,当TCP层三次握手成功之后,MySQL数据库等待至多connect_timeout变量定义的时长,如果仍然无法收到客户应用发送的建立数据库连接的请求,那么将回复Bad handshake,同时关闭连接。
MySQL数据库的管理员要特别关注此类问题,确认MySQL数据库是否受到了外部的攻击,比如DoS。
其它可能的原因
排除了前述的原因,那么需要进一步确认是否存在如下的问题。
对于当前应用场景,max_allowed_packet变量的值过小,无法满足需要;或者查询请求需要的内存资源比较大,当前MySQL数据库的参数配置不能满足需要。
网络问题,比如驱动的bug或者网络设备的配置问题。这时可以在客户应用及MySQL数据库所在的设备上执行大文件传输,确认双向的传输速率是否符合预期。
底层线程库的Bug,影响并发读操作。
操作系统的TCP/IP配置不正确或者低效。
网络硬件问题,比如网卡、交换机、路由器工作不正常。