MySQL · 答疑解惑 · MySQL 的那些网络超时错误

前言

我们在使用/运维 MySQL 过程中,经常会遇到一些网络相关的错误,比如:

Aborted connection 134328328 to db: 'test' user: 'root' host: '127.0.0.1' (Got timeout reading communication packets)

MySQL 的网络超时相关参数有好几个,这个超时到底是对应哪个参数呢?

在之前的月报中,我们介绍过 MySQL 的 网络通信模块 ,包括各模块间的关系,数据网络包是如何发送接受的,以及结果集的数据格式,大家可以先回顾下。

这里我们对 mysqld 处理网络包时,遇到的超时异常情况进行分析,希望大家在遇到网络相关的报错时,能更好理解和排查问题。

问题分析

MySQL 是平等网络协议,就是说 client 和 server 之间的网络交互是一来一回的,client 发送完请求后,必须等待 server 响应包回来,才能发下一个请求。
对 mysqld 来说,就是接收网络请求,然后内部处理,将结果集返回给客户端,然后等待下一个请求:

先看下 mysqld server 和网络超时相关的参数有哪些:

  • interactive_timeout
  • wait_timeout
  • net_read_timeout
  • net_write_timeout
  • connect_timeout

在底层实现上,不管是读还是写操作,超时都是通过 poll(&pfd, 1, timeout) 做的,参数之间的区别是针对连接的不同状态。

读超时

wait_timeout 是给读请求用的,在 do_command 开始就做设置:

my_net_set_read_timeout(net, thd->variables.net_wait_timeout);

这个时候,连接是空闲的,等待用户的请求。

等读完用户的请求包后,连接就变成 active 的,在调用 dispatch_command 执行 SQL 前,通过

my_net_set_read_timeout(net, thd->variables.net_read_timeout);

把超时设置回 net_read_timeout,之后在执行 SQL 请求过程中,server 和 client 基本不会有网络交互,所以这个超时基本用不上。

有一个特殊的情况是 LOAD DATA LOCAL FILE 命令,server 在执行过程中,需要和 client 再做网络交互。

interactive_timeout 是给交互模式的客户端使用的,比如我们常用的 mysql client 工具,这个是在认证过程中设置的,逻辑如下:

static void
server_mpvio_update_thd(THD *thd, MPVIO_EXT *mpvio)
{
  thd->client_capabilities= mpvio->client_capabilities;
  thd->max_client_packet_length= mpvio->max_client_packet_length;
  if (mpvio->client_capabilities & CLIENT_INTERACTIVE)
    thd->variables.net_wait_timeout= thd->variables.net_interactive_timeout;
  thd->security_ctx->user= mpvio->auth_info.user_name;
  if (thd->client_capabilities & CLIENT_IGNORE_SPACE)
    thd->variables.sql_mode|= MODE_IGNORE_SPACE;
}

如果客户端的能力位上设置了 CLIENT_INTERACTIVE,会用 interactive_timeout 的值覆盖 wait_timeout 的值。
而一般情况下,我们应用在建立连接时,是不会设置这个能力位的。

写超时
net_write_timeout 对应写超时,在连接认证完成后,server 和 client 交互过程中写超时一真是不变的。

认证超时

connect_timeout 是给连接认证过程用的,读和写都用这个值,认证完成后,读和写分别设置为 net_read_timeoutnet_write_timeout

总结

可以看到和读相关的超时参数是最多的,也比较容易搞混乱。

  1. 如果是认证过程中超时,不管是读还是,都是 connect_timeout;
  2. 对于读网络超时,一般是 wait_timeout/interactive_timeout,基本不会是 net_read_timeout(特例是业务用到 LOAD DATA LOCAL FILE);
  3. 对于写网络超时,都是 net_write_timeout。

在遇到超时情况下,可以根据这些原则判断对那个参数做调整。

比如下面这种情况:

2017-05-15 19:32:41 47930 [Warning] Aborted connection 6 to db: 'unconnected' user: 'root' host: 'localhost' (Got timeout reading communication packets)

很可能需要调整的 wait_timeout/interactive_timeout。

2017-05-15 20:06:27 5063 [Warning] Aborted connection 12 to db: 'test' user: 'root' host: 'localhost' (Got timeout writing communication packets)

需要调整 net_write_timeout

需要注意的是,MySQL 的关于网络的错误,除了超时以外都认为是 error,没有做进一步的细分,比如可能会看到下面这种日志,有可能是客户端异常退出了,也有可能是网络链路异常。

2017-05-15 19:34:57 47930 [Warning] Aborted connection 8 to db: 'unconnected' user: 'root' host: 'localhost' (Got an error reading communication packets)

2017-05-15 20:07:39 5063 [Warning] Aborted connection 13 to db: 'test' user: 'root' host: 'localhost' (Got an error writing communication packets)
时间: 2024-08-31 01:05:24

MySQL · 答疑解惑 · MySQL 的那些网络超时错误的相关文章

MySQL · 答疑解惑 · MySQL 锁问题最佳实践

前言 最近一段时间处理了较多锁的问题,包括锁等待导致业务连接堆积或超时,死锁导致业务失败等,这类问题对业务可能会造成严重的影响,没有处理经验的用户往往无从下手.下面将从整个数据库设计,开发,运维阶段介绍如何避免锁问题的发生,提供一些最佳实践供RDS的用户参考. 设计阶段 在数据库设计阶段,引擎选择和索引设计不当可能导致后期业务上线后出现较为严重的锁或者死锁问题. 1. 表引擎选择使用myisam,引发table level lock wait. 从5.5版本开始,MySQL官方就把默认引擎由my

[2016-03]MySQL · 答疑解惑 · MySQL 锁问题最佳实践

前言 最近一段时间处理了较多锁的问题,包括锁等待导致业务连接堆积或超时,死锁导致业务失败等,这类问题对业务可能会造成严重的影响,没有处理经验的用户往往无从下手.下面将从整个数据库设计,开发,运维阶段介绍如何避免锁问题的发生,提供一些最佳实践供RDS的用户参考. 设计阶段 在数据库设计阶段,引擎选择和索引设计不当可能导致后期业务上线后出现较为严重的锁或者死锁问题. 1. 表引擎选择使用myisam,引发table level lock wait. 从5.5版本开始,MySQL官方就把默认引擎由my

MySQL · 答疑解惑 · MySQL Sort 分页

背景 6.5号,小编在 Aliyun 的论坛中发现一位开发者提的一个问题,说 RDS 发现了一个超级大BUG,吓的小编一身冷汗 = =!! 赶紧来看看,背景是一个RDS用户创建了一张表,在一个都是NULL值的非索引字段上进行了排序并分页,用户发现第二页和第一页的数据有重复,然后以为是NULL值的问题,把这个字段都更新成相同的值,发现问题照旧.详细的信息可以登录阿里云的官方论坛查看. 小编进行了尝试,确实如此,并且5.5的版本和5.6的版本行为不一致,所以,必须要查明原因. 原因调查 在MySQL

MySQL · 答疑解惑 · MySQL 优化器 range 的代价计算

本文我们从一个索引选择的问题出发,来研究一下 MySQL 中 range 代价的计算过程,进而分析这种计算过程中存在的问题. 问题现象 第一种情况:situation_unique_key_id mysql> show create table cpa_order\G *************************** 1. row *************************** Table: cpa_order Create Table: CREATE TABLE `cpa_ord

MySQL · 答疑解惑 · 备库Seconds_Behind_Master计算

背景 在mysql主备环境下,主备同步过程如下,主库更新产生binlog, 备库io线程拉取主库binlog生成relay log.备库sql线程执行relay log从而保持和主库同步. 理论上主库有更新时,备库都存在延迟,且延迟时间为备库执行时间+网络传输时间即t4-t2. 那么mysql是怎么来计算备库延迟的? 先来看show slave status中的一些信息,io线程拉取主库binlog的位置: Master_Log_File: mysql-bin.000001 Read_Maste

MySQL · 答疑解惑 · mysqldump tips 两则

背景 用户在使用mysqldump导数据上云的时候碰到两个"诡异"的问题,简单分析分享下. TIP 1 --port端口无效? 本地有3306和3307两个端口的实例,执行命令为: mysqldump --host=localhost --port=300x -Ddb1 db1 -r outputfile 发现无论执行端口写入3306还是3307,导出的都是3306端口实例的数据. 代码分析 实际上不论是mysqldump还是mysql客户端,在连接数据库时都调用了 CLI_MYSQL

MySQL · 答疑解惑 · 外键删除bug分析

背景 你是否曾为Error on rename of './test/#sql-78fd_780371' to './test/t2' (errno: 150)这样的错误而不解,如stackoverflow上的这个问题? 下面我们来复现下: drop table t2; drop table t1; create table t1(c1 int primary key, c2 int); create table t2(c1 int primary key, c2 int , constrain

MySQL · 答疑解惑 · 浮点型的显示问题

背景 我们打开MySQL客户端,执行下面的SQL语句: drop table if exists t; create table t(id double)engine=innodb; insert into t values(1e-15),(1e-16); select * from t; select * from t出来的内容如下,我们看到浮点数1e-15用正常的数值来表示,1e-16用科学技术法来表示. +-------------------+ | id | +-------------

MySQL · 答疑解惑 · 物理备份死锁分析

背景 本文对 5.6 主备场景下,在备库做物理备份遇到死锁的case进行分析,希望对大家有所帮助. 这里用的的物理备份工具是 Percona-XtraBackup(PXB),有的同学可能不清楚其备份流程,所以这里先简单说下,PXB的备份步骤是这样的: 拷贝 InnoDB redo log,这是一个单独的线程在拷,直到备份结束: 拷贝所有InnoDB ibd文件: 加全局读锁,执行 FLUSH TABLES WITH READ LOCK(FTWRL); 拷贝 frm.MYD.MYI 等文件: 获取