一个线上问题排查的经验分享

线上问题排查

事情起因:PM告知线上活动页面操作.接口均返回"数据库异常"(这个错误,是后端统一捕获了数据库异常,统一返回的错误信息,防止类似表结构信息随错误信息一起返回前端)

排查过程

  1. 第一步肯定是上服务器上看日志,看到错误信息:

    org.springframework.transaction.CannotCreateTransactionException: Could not open JDBC Connection for transaction; nested exception is java.sql.SQLTransientConnectionException: HikariPool-1 - Connection is not available, request timed out after 30000ms.
    当然到这个异常的时候,是比较懵逼的,之前解决线上问题的经验也不是很丰富,这个异常也是第一次遇到.首先第一反应肯定猜是不是数据库挂掉了.然后去看下数据库的服务,发现连得上,没什么问题.由于暂时没明白是什么问题,只能使用重启大法了.

  2. 重启之后,接口没有返回"数据库异常"这个错误了.但是问题又来了,接口请求时间非常长,几乎都在2-3s,没过多久,就又看到了上面的错误信息.接口响应慢,先去服务器上执行top命令查看一下服务器上cpu的使用情况,发现是正常的,那就基本排除了程序的问题

  3. 猜测应该还是数据库的问题,然后使用show processlist,简单的理解就是查看哪些线程正在访问数据库.返回的信息里面比较重要的几个字段command:简单来说就是这个线程正在做什么,time:执行耗时,info:具体执行的sql.果然,发现问题了,发现大量的线程在执行一个update语句,command:update for query rows.字面意思也很明白,查询要更新的数据.然后去看一下表结果,果然update语句中where字段没有索引.为了保险起见,再去找运维要了慢sql,发现除了这个update语句之外,还有几个执行比较慢的select,基本都是没加索引的锅.找运维加上对应的索引,重启服务,问题解决!

总结

由于测试服务器上的数据量基本都很小,所以像sql性能的问题再测试的时候很难复现,开发过程中还是要认真,不能偷懒,该加的索引还是要加上.遇到线上的问题,一定要珍惜(虽然这么说很怪),像我这样大部分程序员日常工作还是写业务代码为主.简单的功能也出不了什么大幺蛾子,尤其是数据量小的时候,什么sql性能,代码性能,也都提现不出来.出了问题,千万不要想着公司里有大牛,或者运维来处理什么的,还是要自己多动手.最后再附上昨天问题爆发时,其他的一些错误
### ### Error querying database. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is java.sql.SQLTransientConnectionException: HikariPool-1 - Connection is not available, request timed out after 30000ms.

### Error updating database. Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transaction

org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException:
其实如果早一点看到CannotGetJdbcConnectionException这个异常的话,大概就能猜出是慢sql导致获取不到数据库链接了
最后再附上一个关于sql优化的时候explain帖子不会看 Explain执行计划,劝你简历别写熟悉 SQL优化.让被问sql优化的时候,除了索引,能还讲点别的东西

展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客
应支付0元
点击重新获取
扫码支付

支付成功即可阅读