mysql线上连接超时和字段过长排查思路

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: mysql线上连接超时和字段过长排查思路

读书忌死读,死读钻牛角。——叶圣陶


1 orm和mysql字段的长度



sqlalchemy 用model创建表之后 如果你指定了varchar的长度是20 那么第一次用orm生成表的时候length=20 但是当你插入21个字符的时候 报错pymysql.err.DataError: (1406, "Data too long for column 'name' at row 1")。我们修改mysql字段长度到25 再次插入21个字符 但是记住我们并没有修改model的长度 也就是说model还是20字符长,我们最后发现成功插入数据库表中。


结论

model中varchar的长度只是第一次创建表的时候有用,后面只要通过mysql表字段去修改了,即使model varchar不修改,也没有问题。当然如果表字段varchar改为text也没有问题 即使数据库表字段是varchar。


2 数据库引擎没有设置超时



2.1 背景


我们发现,各个子页面都会调用大数据一个查询DB的操作,而这个数据大概是8千万。我们的sqlalchemy session查询非常耗时,大概50s左右,但是后来又满满好了,查询在1s左右。为了重现线上的问题我们做一下分析


2.2 分析


其实有时候我们遇到这样的问题,首先想到的就是优化查询,比如通过explain看看有没有命中索引啊,是否用到文件排序或者说回表查询啊,这种思路挺对的,你也必须过一遍,过完之后发现你的查询很NB,没什么问题,那这个时候我们就要站在更高的角度去看待问题,不要死死盯着你的sql,因为你再怎么优化无济于事。


考虑到是大数据环境,偶尔查询慢是正常的,因为有很多因素,比如带宽啊,网络啊以及负载啊之类的。所以我们怀疑如果这些因素导致我们查询慢,一定是我们那里没有设置超时时间导致sql变慢的,后来追溯源码,发现引擎底层是支持read_timeout的,而我们代码中在创建连接的时候并没有指定,因此必须立刻马上现在解决它。


2.3 解决


但是线上数据都是1s左右返回,如何线下模拟呢?


解决方案:锁表

先在创建engin的时候传入参数


比如


创建engine的时候,设置参数connect_args={"read_timeout":5} .这样创建的engine就会在读取数据超时的情况下抛出超时异常。

再把整个表以write的方式锁住,这样其他session就没办法查询或者修改,直到锁释放才会执行,否则会一直阻塞。这样我们就可以解决超时的现象。


我们先开启一个session会话,比如mysql终端。然后lock table big_data write; 然后我们程序启动,自然开启session去执行big_data的查询。这样等待5s之后抛出异常,完美还原案发现场


最后unlock tables


3   小结



有时候大家碰到问题,要经常汇总和整理,这样下次遇到类似问题直接找出来用,当你累积到一定程度,那么像这样的问题其实就是自然而然的解决了。


4 关注公众号



微信公众号:堆栈future

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
3天前
|
关系型数据库 MySQL 网络安全
DBeaver连接MySQL提示Access denied for user ‘‘@‘ip‘ (using password: YES)
“Access denied for user ''@'ip' (using password: YES)”错误通常与MySQL用户权限配置或网络设置有关。通过检查并正确配置用户名和密码、用户权限、MySQL配置文件及防火墙设置,可以有效解决此问题。希望本文能帮助您成功连接MySQL数据库。
15 4
|
21天前
|
分布式计算 关系型数据库 MySQL
SpringBoot项目中mysql字段映射使用JSONObject和JSONArray类型
SpringBoot项目中mysql字段映射使用JSONObject和JSONArray类型 图像处理 光通信 分布式计算 算法语言 信息技术 计算机应用
37 8
|
19天前
|
安全 关系型数据库 MySQL
【赵渝强老师】MySQL的连接方式
本文介绍了MySQL数据库服务器启动后的三种连接方式:本地连接、远程连接和安全连接。详细步骤包括使用root用户登录、修改密码、创建新用户、授权及配置SSL等。并附有视频讲解,帮助读者更好地理解和操作。
|
2月前
|
SQL Java 关系型数据库
java连接mysql查询数据(基础版,无框架)
【10月更文挑战第12天】该示例展示了如何使用Java通过JDBC连接MySQL数据库并查询数据。首先在项目中引入`mysql-connector-java`依赖,然后通过`JdbcUtil`类中的`main`方法实现数据库连接、执行SQL查询及结果处理,最后关闭相关资源。
|
2月前
|
SQL JavaScript 关系型数据库
node博客小项目:接口开发、连接mysql数据库
【10月更文挑战第14天】node博客小项目:接口开发、连接mysql数据库
|
2月前
|
Java 关系型数据库 MySQL
【编程基础知识】Eclipse连接MySQL 8.0时的JDK版本和驱动问题全解析
本文详细解析了在使用Eclipse连接MySQL 8.0时常见的JDK版本不兼容、驱动类错误和时区设置问题,并提供了清晰的解决方案。通过正确配置JDK版本、选择合适的驱动类和设置时区,确保Java应用能够顺利连接MySQL 8.0。
193 1
|
2月前
|
Java 关系型数据库 MySQL
springboot学习五:springboot整合Mybatis 连接 mysql数据库
这篇文章是关于如何使用Spring Boot整合MyBatis来连接MySQL数据库,并进行基本的增删改查操作的教程。
108 0
springboot学习五:springboot整合Mybatis 连接 mysql数据库
|
1月前
|
关系型数据库 MySQL Java
SpringBoot项目中mysql字段映射使用JSONObject和JSONArray类型
SpringBoot项目中mysql字段映射使用JSONObject和JSONArray类型
27 0
|
2月前
|
SQL JavaScript 关系型数据库
Node.js 连接 MySQL
10月更文挑战第9天
20 0
|
2月前
|
SQL 存储 关系型数据库
MySQL新增字段/索引会不会锁表?
MySQL新增字段/索引会不会锁表?
141 0