IT教程 ·

【MySQL 线上 BUG 剖析】之 多表同字段异常:Column ‘xxx’ in field list is ambiguous

疫情过后,制造业中小企业应用工业互联网数字化转型之路的探讨

一、生产失足!

本日早上11点摆布,我在事情歇息之余,撸了一下猫。倏忽,事情群响了,老大在内里说:APP失足了!
【MySQL 线上 BUG 剖析】之 多表同字段异常:Column ‘xxx’ in field list is ambiguous IT教程 第1张
妈啊,这太吓人了,由于只是说了失足,然则没说毛病的信息。所以我赶忙到APP上看看。
【MySQL 线上 BUG 剖析】之 多表同字段异常:Column ‘xxx’ in field list is ambiguous IT教程 第2张
这果然是失足了,而且照样简朴而粗犷的500,太吓人了。

二、当地赶忙调试起来!

既然线上失足了,我们又不能直接进行调试,那固然得立时在当地搞起来了!

1、代码是不是有错?

立马启动当地的项目,接见对应的接口,看看是不是是代码那里失足了。
【MySQL 线上 BUG 剖析】之 多表同字段异常:Column ‘xxx’ in field list is ambiguous IT教程 第3张
好了,当地的代码和 SQL 都是没错的!

2、SQL 是不是有错?

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

我又立马拿着背景打印的 SQL 直接去到测试库上面实行一遍,看看终究是不是是 SQL 大概存在问
题。emm,效果照样没错。

至于生产库,由于是在家办公,测不了~而且,平常修正都是先当地,接着测试,末了再生产吧。然则也有多是紧要的需求,直接上生产了,这个也不好说。

此时,起首我们能够得出两个点。

  1. 代码是没问题的,由于当地的项目接见一般。
  2. SQL 临时也是没问题的,由于在当地库和测试库实行都没问题。

    3、猜测~

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

三、我啥都没改就又能够了!

1、找到缘由了

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

果不其然,不一会儿,老大又在群里说接口没问题了。老大的复兴很明显,就是生产环境的某个表增加了一个字段,而且我的 SQL 确切用到谁人表了。
【MySQL 线上 BUG 剖析】之 多表同字段异常:Column ‘xxx’ in field list is ambiguous IT教程 第4张

2、深切缘由

再转头来看看接口的 SQL,依据 tag 这个关键字搜刮一下那里用到了。发现了只要一个函数是关于 tag 的,所以去数据库内里看看这个函数。
【MySQL 线上 BUG 剖析】之 多表同字段异常:Column ‘xxx’ in field list is ambiguous IT教程 第5张
函数源码:
【MySQL 线上 BUG 剖析】之 多表同字段异常:Column ‘xxx’ in field list is ambiguous IT教程 第6张
到了这里,置信人人都知道是什么状况了。

一个表新增 tag 字段后,致使两个表同时存在命名为 tag 的字段。而查询的时刻没加上对应的表前缀,致使 MySQL 没法辨认效果集终究是用哪一个表的 tag 字段,末了就报错了。

四、详细的毛病信息和总结

1、猎取详细的毛病信息

本来仅仅是一个小小的 SQL 范例问题,致使了一次生产线上的 bug。

由于非常是经由封装的,所以 APP 只返回了服务器非常(500)。所以我在当地重现了一下这个 bug,就是为了拿到详细的毛病信息。

毛病信息很简朴和清楚明了:Column 'tag' in field list is ambiguous。中文就是字段 tag 含糊其词。
【MySQL 线上 BUG 剖析】之 多表同字段异常:Column ‘xxx’ in field list is ambiguous IT教程 第7张

2、总结:

  1. 所以说。虽然写 SQL 很简朴,然则我们肯定要根据范例些,不能说如今不失足就是没问题了,根据范例写更是为了防止今后的失足,今后我也要好好注重才行!
  2. 而且,我们既然做了全局非常处置惩罚,然则肯定要将毛病信息打印到背景或者是日记中,不然就像今次找不到详细的毛病信息了~

题外话:

固然了,写出一手好 SQL ,不只要根据范例写,还需要深刻理解 MySQL 的组件和机制的道理。比方:binlog、undo、innoDB存储引擎、锁、索引和事件等等。

假如人人也想深切进修 MySQL ,能够关注我如今不停在输出的专栏。

构建ROP链实现远程栈溢出

参与评论