mysql典型的超时异常你见过几种?


mysql典型的超时异常你见过几种?

文章插图

我们在使用MySQL的时候 , 由于各种原因会出现超时的情况 , 我认为常见的有连接超时、等待超时、锁等待超时等等 。可以使用show variables 来看看默认的各种类型超时时间 。mysql中超时时间单位为秒 。
show variables like '%timeout%'
mysql典型的超时异常你见过几种?

文章插图
默认超时时间
连接超时
  • connect_timeout:这个我认为可以讲是最常见的超时情况了 , 它是设置连接的超时时间 , 默认10秒 。它主要指的是mysql客户端与服务器之间的tcp连接结果 , 并且是多次连接的结果 , 每次连接除了基本的用户名和密码之外 , 还需要进行主机权限验证、域名解析 。如果此过程中有任何网络故障 , 通过设置连接超时 , 可以防止他们之间反复进行连接重试 , 网络故障不是一时半会能解决 , 超时设置可以使得程序正常中断 , 便于我们后续操作 。
  • wait_timeout:默认值为28800秒 。这个超时主要防止一些非网络问题导致客户端长期占用连接情况 , 例如某些原因导致锁表 , 而我们应用却一直要请求更新表 , 这样如果超过了等待时间 , mysql会主动断开连接 。
  • interactive_timeout:默认值为28800秒 。主要防止某些mysql服务器对象保持了睡眠状态超过了交互式等待时间 , mysql会主动断开连接 。交互式连接主要指的是客户端在命令行窗口 , 什么都不操作 , 而服务器在等待输入命令时候也要保持的连接 。
  • net_write_timeout:默认值60秒 。主要是客户端进行一个大数据查询 , mysql服务器返回结果集数据量很大 , 网络传输数据会耗时 , 如果耗时超过60秒 , mysql主动断开 , 避免连接浪费 。
  • net_read_timeout:默认值60秒 , 与上述返回相反 , 客户端读取了这个大的数据源 , 如果超时 , 则mysql主动断开 。
锁等待超时
  • Innodb_lock_wait_timeout:默认值50秒 , 行锁等待超时时间 , 当出现行级锁锁等待现象时候 , 锁等待时间超过50秒 , 会导致行级锁等待的sql语句回滚 , 如果希望整个事务回滚 , 需要开启innodb_rollback_on_timeout参数 。
  • innodb_rollback_on_timeout:默认值为OFF , 设置为on , 则因行级锁超时则会直接回滚整个事务操作 。
由此可见 , innodb存储引擎一旦出现锁超时异常 , 默认不会回滚事务 , 这对应用来说 , 非常不合理 , 所以锁等待超时异常发生后 , 你的应用程序应该自定义处理 , 要嘛提交事务 , 要嘛回滚事务 。
复制连接超时slave_net_timeout:mysql进行主从复制时候 , 当从服务器从主服务器读取二进制日志失败后 , 它会继续等待slave_net_timeout设置的时间后 , 重连服务器并获取数据 , 默认值60秒 。
MyISAM表延迟插入超时delayed_insert_tiemout:为MyISAM存储引擎设置的 , 主要为insert语句超时时间 , 在锁表情况下 , insert语句会一直处于等待中 , 当超过默认值300秒 , 则中断连接 。
总结本节重点讲解了各种超时情况 , 只有了解它们 , 我们才有可能针对性的优化 , 并且在超时异常出现之后 , 能快速定位及处理 。当然应用环境不同 , 超时异常产生原因复杂 , 这都需要我们在生产中积累经验 。

【mysql典型的超时异常你见过几种?】


    推荐阅读