一、生产出错!

今天早上11点左右,我在工作休息之余,撸了一下猫。突然,工作群响了,老大在里面说:APP出错了!

妈啊,这太吓人了,因为只是说了出错,但是没说错误的信息。所以我赶紧到APP上看看。

这果然是出错了,而且还是简单而粗暴的500,太吓人了。

二、本地赶紧调试起来!

既然线上出错了,我们又不能直接进行调试,那当然得马上在本地搞起来了!

1、代码是否有错?

立马启动本地的项目,访问对应的接口,看看是不是代码哪里出错了。

好了,本地的代码和 SQL 都是没错的!

2、SQL 是否有错?

那么是不是测试库和生产库的表改了啥?

我又立马拿着后台打印的 SQL 直接去到测试库上面执行一遍,看看究竟是不是 SQL 可能存在问
题。emm,结果还是没错。

至于生产库,因为是在家办公,测不了~而且,一般修改都是先本地,接着测试,最后再生产吧。但是也有可能是紧急的需求,直接上生产了,这个也不好说。

此时,首先我们可以得出两个点。

  1. 代码是没问题的,因为本地的项目访问正常。
  2. SQL 暂时也是没问题的,因为在本地库和测试库执行都没问题。

    3、猜想~

    所以说,出现这个 bug,很有可能是有人直接对生产库的某个表进行了修改,而且我接口的 SQL 还用到了!

三、我啥都没改就又可以了!

1、找到原因了

既然代码和 SQL 都测过没问题了,只剩下生产库待确认了。

果不其然,不一会儿,老大又在群里说接口没问题了。老大的回复很明显,就是生产环境的某个表增加了一个字段,而且我的 SQL 确实用到那个表了。

2、深入原因

再回头来看看接口的 SQL,根据 tag 这个关键字搜索一下哪里用到了。发现了只有一个函数是关于 tag 的,所以去数据库里面看看这个函数。

函数源码:

到了这里,相信大家都晓得是什么情况了。

一个表新增 tag 字段后,导致两个表同时存在命名为 tag 的字段。而查询的时候没加上对应的表前缀,导致 MySQL 无法识别结果集到底是用哪个表的 tag 字段,最后就报错了。

四、具体的错误信息和总结

1、获取具体的错误信息

原来仅仅是一个小小的 SQL 规范问题,导致了一次生产线上的 bug。

因为异常是经过封装的,所以 APP 只返回了服务器异常(500)。所以我在本地重现了一下这个 bug,就是为了拿到具体的错误信息。

错误信息很简单和明了:Column 'tag' in field list is ambiguous。中文就是字段 tag 模棱两可。

2、总结:

  1. 所以说。虽然写 SQL 很简单,但是我们一定要按照规范些,不能说现在不出错就是没问题了,按照规范写更是为了避免以后的出错,以后我也要好好注意才行!
  2. 而且,我们既然做了全局异常处理,但是一定要将错误信息打印到后台或者是日志中,不然就像今次找不到具体的错误信息了~

题外话:

当然了,写出一手好 SQL ,不但要按照规范写,还需要深刻理解 MySQL 的组件和机制的原理。例如:binlog、undo、innoDB存储引擎、锁、索引和事务等等。

如果大家也想深入学习 MySQL ,可以关注我现在不断在输出的【大白话系列】MySQL 学习总结专栏。

【MySQL 线上 BUG 分析】之 多表同字段异常:Column ‘xxx’ in field list is ambiguous的更多相关文章

  1. 线上bug分析

    昨天下午大神把组内几十号人召集在一起开Online bug分析大会,主要是针对近期线上事故从事故原因和解决方案两个维度来分析. 对金融软件来说,每一次的线上事故都有可能给公司带来重大的损失,少扣了用户 ...

  2. 一次 MySQL 线上死锁分析实战

    关键词:MySQL Index Merge 前言 MySQL 的锁机制相信大家在学习 MySQL 的时候都有简单的了解过,那既然有锁就必定绕不开死锁这个问题.其实 MySQL 在大部分场景下是不会存在 ...

  3. 线上BUG:MySQL死锁分析实战

    原文链接:线上BUG:MySQL死锁分析实战 1 线上告警 我们不需要关注截图中得其他信息,只要能看到打印得org.springframework.dao.DeadlockLoserDataAcces ...

  4. MySQL慢日志线上问题分析及功能优化

    本文来源于数据库内核专栏. MySQL慢日志(slow log)是MySQL DBA及其他开发.运维人员需经常关注的一类信息.使用慢日志可找出执行时间较长或未走索引等SQL语句,为进行系统调优提供依据 ...

  5. 出现线上bug,测试人能做些什么?

    测试奇谭,BUG不见. 大家好,我是谭叔. 一提到线上问题,很多测试小白要么"原则性"恐惧,要么憨憨如也,不知如何下手. 本篇文章,我再细化下这道常见的面试题,跟大家捋捋发生线上问 ...

  6. 程序员如何描述清楚线上bug

    案例 一个管理后台的bug,把操作记录中的操作员姓名,写成了该操作员的id.原因是修改了一个返回操作人姓名的函数,返回了操作人的id.但是还有其他地方也用这个函数,导致其他地方把姓名字段填写成了操作员 ...

  7. 记一次线上bug排查-quartz线程调度相关

    记一次线上bug排查,与各位共同探讨. 概述:使用quartz做的定时任务,正式生产环境有个任务延迟了1小时之久才触发.在这一小时里各种排查找不出问题,直到延迟时间结束了,该任务才珊珊触发.原因主要就 ...

  8. 听说”双11”是这么解决线上bug的

    听说"双11"是这么解决线上bug的 --Android线上热修复的使用与原理 预备知识和开发环境 Android NDK编程 AndFix浅析 Android线上热修复的原理大同 ...

  9. 关于线上bug

    之所以想写下线上bug,因为发觉有些公司对线上bug的处理是比较严格甚至是很苛刻,涉及到的相关人可能会因此而背黑锅. 之所以会存在这样情况,因为公司各部门都有关联,特别是用户.老板的投诉,也给公司会造 ...

随机推荐

  1. 值得收藏!my.cnf配置文档详解

    MySql对于开发人员来说应该都比较熟悉,不管是小白还是老码农应该都能熟练使用.但是要说到的各种参数的配置,我敢说大部分人并不是很熟悉,当我们需要优化mysql,改变某项参数的时候.还是要到处在网上查 ...

  2. 2019版Idea如何激活

    1.下载jar包 链接: https://pan.baidu.com/s/1w4B4_hmiiueNDJMjYKaFyQ 提取码: fkpx 2.修改·vmoptions 1.Help" - ...

  3. 在idea中运行GitHub项目

    1.首先在本地建一个文件夹,比如qm 2. 在GitHub中找到你所运行项目的路径 3.在idea中[File]-->[New]--->[Project from Version Cont ...

  4. 从数组中取出n个不同的数组成子集 y 使 x = Σy

    /**  * 尝试获取arr子集 y  使 x=Σy  * @param {Array} arr   * @param {number} x   * @param {Array} res   */ f ...

  5. 三、JVM之方法区

    一.什么式方法区 方法区,也称非堆(Non-Heap),又是一个被线程共享的内存区域.其中主要存储加载的类字节码.class/method/field等元数据对象.static-final常量.sta ...

  6. 安装dbeaver,The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more than one time zone.

    在连接mysql时,出现了以下错误: 解决方法是 在数据库链接指定useUnicode=true&useSSL=false&characterEncoding=utf8&ser ...

  7. pandas DF去重

    实例 import pandas as pd data=pd.DataFrame({'产品':['A','A','A','A'],'数量':[50,50,30,30]}) 去重 data.drop_d ...

  8. springboot的yml不显示的原因

    首先排除插件原因 1 安装好插件Ctrl+Alt+S 2 查看修改的application.yml是什么格 在yaml格式中添加*.yaml和*.yml 3 查看maven是否配置完善

  9. Wordpress4.9.6 任意文件删除漏洞复现分析

    第一章 漏洞简介及危害分析 1.1漏洞介绍 WordPress可以说是当今最受欢迎的(我想说没有之一)基于PHP的开源CMS,其目前的全球用户高达数百万,并拥有超过4600万次的超高下载量.它是一个开 ...

  10. 深入浅出| java中的clone方法

    每天进步一丢丢,连接梦与想 我们还年轻,但这不是你浪费青春的理由 克隆和复制 clone,有人称之为克隆,有人称之为复制,其实都是同一个东西 本文称之为"克隆",毕竟人家方法名叫& ...