记一次排查bug的过程,我总结了几个原则

起因

周一,老大给了我一个bug,说我们的APP的帮助中心搜索关键字的时候,没有结果返回,让我来排查解决。老大交代了一句,这个接口涉及到全文索引,所以可以重点排查下全文索引是否设置正确了。

顿时来了兴趣,第一步,我先验证一遍,发现测试线上的是可以正常使用的,而正式线是不行的。那我的目标就明确了,只要把测试线和正式线的差异找出来,就可以找到bug了。

排查过程

申请权限

接着申请了正式线的数据库可读权限,获取数据库表的结构和测试线表结构,一对比,发现两者一样,所以先排除了这个全文索引的设置错误。

大概浏览一遍代码

接着我打开了浏览器中的侧边栏 network ,查看这个接口的路径。

然后打开IDE,切换到所在项目的 master 分支,git pull 一遍,嗯,这个是必要的,因为要确保排查的代码是线上的最新代码。大概顺着接口看了一遍代码后,发现这个接口是逻辑是先去 Redis 中获取值,如果没有,再去数据库请求,然后再把值设置回 Redis 中,嗯,这就是一个接口的典型操作。

确认排查思路

那接下来的思路就是

  • 在设置 cache 的时候是否出现了问题;
  • 代码逻辑出现了问题,把可以正常显示的值导致不能正常显示。
  • 第三个:从数据库中获取值的时候,没有正确获取到。

开始排查

排查数据库的问题

这上面最简单的验证就是第三步,只要把要执行的 sql 去数据中请求一遍,就可以验证返回的结果是否正常的。

验证的结果是:数据库中获取的结果是正常的,所以排除了这个问题。

排查 cache 的问题

第二个可以去验证cache是否设置正确,这里有个注意点,因为中文在redis中是会序列化后再存进去的,所以如果你只是简单连接的话,看到的中文都是序列化后的数据。方便正常显示中文,你可以在连接的时候加上 –raw 的命令。
所以连接命令大概长这样。

1
redis-cli --raw -h xxxx -p 6379 -a xxxx

  • -h:是指域名
  • -p:是指端口
  • -a:是指密码

这样连接上去后就可以正常显示中文了。

我排查了相对应的 key 后,发现带中文的 key 对应的 value 是空的。带英文的 key 对应的 value 是有值。

那么我的初步怀疑就是是不是在 redis 中在设置 key 的,出现的中文编码乱码问题。

嗯,接着在这个错误的方向摸索了一遍。没有收获。

然后恍然大悟,既然所有的 key 都是显示正常了,那么 value 中没有值,那只能是从数据库中获取数据或者是代码逻辑的问题,因为这个时候已经排查过数据库的问题了,所以接下来把精力放在代码层面,开始阅读代码,看是否是代码逻辑出现的问题。

排查代码逻辑的问题

接着就是一遍遍看代码,一遍遍地把数据在脑中演示,到哪一步,数据应该是怎样的。

一番折腾下来,发现也没有效果。

重新梳理排查思路

这个时候我觉得不能这样了,需要梳理一遍思路。
在梳理的过程中,我意识到,每个部分都是可以 work 的,但是连接起来就有问题,那么问题就是在连接的部分,所以我把精力放在数据交互和连接的部分。

第二个是,我发现在搜索 3 个以上的关键字时是可以出现结果的,这个发现为后来找答案埋下了线索。

你是不是发现,完全和全文索引没有关系啊,哈哈哈,主角还没有登场呢,别急。

在这里我们总结一下整体的排查 bug 思路。我自己总结了几个原则

确保代码最新

嗯,这句话像是一句废话,但是有多少同学是在错误的道路上狂奔。所以有空没空都 git pull 一下总没错。

在确定排查思路前,先大致浏览下代码

这个时候浏览代码是为了确定涉及到的部分有哪些,评估下可能出错的地方。

最简单的验证原则。

在上面的例子中,去数据库执行一条 sql 语句是比直接看代码简单的。这个可以直接验证到结果,所以应该可以先去数据库中执行sql。

把看代码放在最后一步

如果这块代码逻辑很复杂,那么一定要把看代码的这块复杂的工作放在最后,是实在没有其他路子可走了再来看代码。

好了,我们继续。

排查继续

我们接着上面的问题是:

重新梳理思路

1、数据在连接的时候出现的错误。

2、搜索3个以上的关键词时,是有正常的结果的。

这个时候老大说,可以打上一些log,发布到预生产线,看看结果,这我就很开心了呀,我就能确定数据在哪块出现的问题,可以进一步把问题缩小。

打上 log 后,看了下数据,把问题定位在数据库这块,你看,人生就是这么奇妙,兜兜转转又回到了原点。

我直接把问题定义在了全文索引的问题上。其实这个时候也不敢确定,因为生产线上的 DDL 和 test 线上的 DDL 一样的。

我们因为前一段时间进行过一次数据库的迁移,所以,有可能是DTS 的 bug ,在迁移的时候导致全文索引失效了。

最后解决方式

再三确定后,决定还是重建一遍全文索引。

当重建了一遍全文索引后,所有的一切都正常了。最后附上几篇查询的参考资料,我觉得他们总结的很好,所以就不再继续做重复的工作了,生命太宝贵了,要多去做有意思的事情。

总结

排查 bug 时的原则

  • 确保代码最新
  • 在确定排查思路前,先大致浏览下代码
  • 最简单的验证原则
  • 把看代码放在最后一步

参考链接

ngram全文分析器

微调MySQL全文搜索

MySQL 之全文索引

spacedong wechat
愿意交个朋友吗~
觉得有收获么