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

一、生产出错!

今天早上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 学习总结专栏。

原文地址:https://www.cnblogs.com/Howinfun/p/12341593.html

时间: 2024-10-13 12:41:06

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

快速定位iOS线上BUG在哪个控制器崩溃

快速定位iOS线上BUG在哪个控制器崩溃 快速定位iOS线上App崩溃在哪个控制器里面,需要和后台配合使用 下载本项目并添加手动添加到项目里 新建所有的页面都继承于YZViewController 在AppDelegate的didFinishLaunchingWithOptions方法里面写下如下代码: if ([[[NSUserDefaults standardUserDefaults] valueForKey:@"BUG"] isKindOfClass:[NSDictionary

Column 'username' in field list is ambiguous、邮件漏发等问题的分析及解决

问题1.Column 'username' in field list is ambiguous ### The error may involve com.fx.oa.module.per.leave.api.shared.domain.PositiveEntity.queryListForPage-Inline ### The error occurred while setting parameters ### Cause: com.mysql.jdbc.exceptions.jdbc4.

mysql Error:1052 Column 'xxx' in where clause is ambiguous

Integrity constraint violation: 1052 Column 'deleted' in where clause is ambiguous MySQL查询的时候出现这个错误提示多半是因为: 1.多表查询的时候几个表中同时出现了某个相同的列名,而在查询条件WHERE后面又没有指定是那个表. 2.查询结果里面有两个相同的列名,而没有指定是哪个表. 比我我的原因就是查询两张表,每个表都有创建时间,但查询不知到加上哪涨,所以需要重新定位 mysql Error:1052 Col

Python Flask 向MySQL表里插入一条记录,提示Unknown column 'XXX' in 'field list

sql =' INSERT INTO `blog`.`user` (`id`, `username`) VALUES (%d, %s)' %(1,username) 我在给username赋值aaabbb后提示:"Unknown column 'aaaabbb' in 'field list'" 找了半天问题,原来是%s没加双引号. 改为如下 sql =' INSERT INTO `blog`.`user` (`id`, `username`) VALUES (%d, "%s

一次MySQL线上慢查询分析及索引使用

本文由作者郑智辉授权网易云社区发布. 0.前言 本文通过分析线上MySQL慢查询日志,定位出现问题的SQL,进行业务场景分析,结合索引的相关使用进行数据库优化.在两次处理问题过程中,进行的思考. 1.简要描述 在九月底某个新上的游戏业务MySQL慢查询日志 # Time: 2017-09-30T14:56:13.974292+08:00 # Query_time: 6.048835  Lock_time: 0.000038 Rows_sent: 0  Rows_examined: 1288441

Android线上bug热修复分析

针对app线上修复技术,目前有好几种解决方案,开源界往往一个方案会有好几种实现.重复的实现会有造轮子之嫌,但分析解决方案在技术上的探索和衍变,这轮子还是值得去推动的 关于Hot Fix技术 Hot Fix技术,简单来说就是针对线上已发布app出现了bug,在不推送新版本的情况下通过发布修复补丁进行修复.通常是刚上线的app,需要快速线上修复bug,类似的技术就叫做热修复或热补丁. 热修复技术能带来什么 让app具有了上线后被修复的可能性,增加事故风险可控性: 避免为修复bug而快速增发新版本,让

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

--Android线上热修复的使用与原理 预备知识和开发环境 Android NDK编程 AndFix浅析 Android线上热修复的原理大同小异.这里仅仅针对眼下最火的框架AndFix进行解说.主要从AndFix的使用.原理以及优缺点三个方面进行阐述. 使用方式 介绍 AndFix是一个AndroidApp的在线热补丁框架. 使用此框架,我们可以在不反复发版的情况下,在线改动App中的Bug.AndFix就是 "AndroidHot-Fix"的缩写. 就眼下来说,AndFix支持An

线上日志分析与其他一些脚本

对一些线上常用的脚本进行了一下总结和说明,免得以后忘记了~ 一·线上发布API集群的代码脚本: #!/bin/bash #Author CCC host=' 10.44.22.113 10.44.22.113 10.44.22.112 10.44.22.112 10.44.22.113 10.44.22.113 10.44.22.114 10.44.22.114 10.44.22.115 10.44.22.115 10.44.22.119 10.44.22.119 ' #basePath='/v

Docker + node(koa) + nginx + mysql 线上环境部署

在上一篇 Docker + node(koa) + nginx + mysql 开发环境搭建,我们进行了本地开发环境搭建 现在我们就来开始线上环境部署 如果本地环境搭建没有什么问题,那么线上部署的配置也就很简单了 我所使用的环境,Linux Mint,命令有不同可以适当更改 目录结构 - compose 新建,线上环境配置 - data - conf - node_modules - static - docker-compose.yml - docker-compose-prod.yml 新建