文章插图
我们在使用MySQL的时候 , 由于各种原因会出现超时的情况 , 我认为常见的有连接超时、等待超时、锁等待超时等等 。可以使用show variables 来看看默认的各种类型超时时间 。mysql中超时时间单位为秒 。
show variables like '%timeout%'
文章插图
默认超时时间
连接超时
- 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 , 则因行级锁超时则会直接回滚整个事务操作 。
复制连接超时slave_net_timeout:mysql进行主从复制时候 , 当从服务器从主服务器读取二进制日志失败后 , 它会继续等待slave_net_timeout设置的时间后 , 重连服务器并获取数据 , 默认值60秒 。
MyISAM表延迟插入超时delayed_insert_tiemout:为MyISAM存储引擎设置的 , 主要为insert语句超时时间 , 在锁表情况下 , insert语句会一直处于等待中 , 当超过默认值300秒 , 则中断连接 。
总结本节重点讲解了各种超时情况 , 只有了解它们 , 我们才有可能针对性的优化 , 并且在超时异常出现之后 , 能快速定位及处理 。当然应用环境不同 , 超时异常产生原因复杂 , 这都需要我们在生产中积累经验 。
【mysql典型的超时异常你见过几种?】
推荐阅读
- 一文看懂mysql两种join连接算法--NLJ和BNL
- mysql 大批量插入解决方案
- 如何解决MySQL order by limit语句的分页数据重复问题?
- MYSQL关于find_in_set函数的使用详解和like的区别之处
- Oracle数据库&MySQL与Oracle的区别
- 一文搞懂MySQL的Join,聊一聊秒杀架构设计
- Mysql无法启动情况下,如何恢复数据?
- 腾讯云服务器上安装mysql,并用navicat连接
- 在使用mysql数据库时,遇到重复数据怎么处理?
- MySQL从入门到进阶,看这一篇文章就够了