今天早上11点左右,我在工做休息之余,撸了一下猫。忽然,工做群响了,老大在里面说:APP出错了! 妈啊,这太吓人了,由于只是说了出错,可是没说错误的信息。因此我赶忙到APP上看看。
这果真是出错了,并且仍是简单而粗暴的500,太吓人了。html
既然线上出错了,咱们又不能直接进行调试,那固然得立刻在本地搞起来了!数据库
立马启动本地的项目,访问对应的接口,看看是否是代码哪里出错了。 好了,本地的代码和 SQL 都是没错的!服务器
那么是否是测试库和生产库的表改了啥?函数
我又立马拿着后台打印的 SQL 直接去到测试库上面执行一遍,看看到底是不是 SQL 可能存在问 题。emm,结果仍是没错。学习
至于生产库,由于是在家办公,测不了~并且,通常修改都是先本地,接着测试,最后再生产吧。可是也有多是紧急的需求,直接上生产了,这个也很差说。测试
此时,首先咱们能够得出两个点。spa
因此说,出现这个 bug,颇有多是有人直接对生产库的某个表进行了修改,并且我接口的 SQL 还用到了!.net
既然代码和 SQL 都测过没问题了,只剩下生产库待确认了。调试
果不其然,不一下子,老大又在群里说接口没问题了。老大的回复很明显,就是生产环境的某个表增长了一个字段,并且个人 SQL 确实用到那个表了。 日志
再回头来看看接口的 SQL,根据 tag 这个关键字搜索一下哪里用到了。发现了只有一个函数是关于 tag 的,因此去数据库里面看看这个函数。 函数源码:
到了这里,相信你们都晓得是什么状况了。
一个表新增 tag 字段后,致使两个表同时存在命名为 tag 的字段。而查询的时候没加上对应的表前缀,致使 MySQL 没法识别结果集究竟是用哪一个表的 tag 字段,最后就报错了。
原来仅仅是一个小小的 SQL 规范问题,致使了一次生产线上的 bug。
由于异常是通过封装的,因此 APP 只返回了服务器异常(500)。因此我在本地重现了一下这个 bug,就是为了拿到具体的错误信息。
错误信息很简单和明了:Column 'tag' in field list is ambiguous。中文就是字段 tag 模棱两可。
题外话:
固然了,写出一手好 SQL ,不但要按照规范写,还须要深入理解 MySQL 的组件和机制的原理。例如:binlog、undo、innoDB存储引擎、锁、索引和事务等等。
若是你们也想深刻学习 MySQL ,能够关注我如今不断在输出的【大白话系列】MySQL 学习总结专栏。
原文出处:https://www.cnblogs.com/Howinfun/p/12341593.html