解决方案(类似于linux服务器杀进程):
// 1.查看最近所有sql进程
show full processlist;
// 2.kill 会话号;
kill 1373457;
周五的时候遇到一个特别操蛋的问题。
数据库(mysql) 部分SQL查询较慢,所以需要考虑优化的一些方面。
但由于本人粗心操作(新手上路),在测试环境 使用 navicat 设计修改表结构的时候设置联合主键:原先的主键还是id,在原先基础上对另一个经常查询的字段添加索引,但是实际操作的确是原先的单主键更改为联合主键(两个)。在数千条数据的测试环境操作几秒钟完事,而且查询速度确是有上升。
于是非常傻逼的直接上正式环境操作,但是忽略了两个非常重要的问题:
1.时间是周五,(我们)产品的业务高峰时间段;
2.正式环境表数据过百万。
结果点击执行之后sql一时半会跑不完,再另跑一个查询此表的普通sql发现sql进程一直在running,而且没找到相关取消操作,再到正式环境查看软件发现以无法对外提供服务(涉及到我更改的这个表的所有请求全部timeout)
等了10分钟发现关联还没有添加完,心里着实很慌.....
请教大佬-技术负责人:
解决方案:
1. 查看sql进程列表 执行 以下sql命令
// 查看最近所有sql进程
show full processlist;
2. 干掉目前执行中的查询或更改进程
// kill 会话号;
kill 1373456;
有的时候进程可能不止一个,多查看几次,多杀几遍即可。
潜在安全问题:
1.涉及到复杂事务、多表关联的谨慎操作,有可能产生其他未知影响,具体待研究;
2.涉及到存储过程的操作,目前未接触;
3.其他。
因为本人当时操作属于单表更新,直接操作目前未受到较大影响!
反思:
从下午大约5:20开始执行sql,一直到40还没有解决问题,找大佬帮忙看并解决,最终5:52解决,全程耗时半个多小时,线上服务基本等同于宕机半小时。想起来就后怕。
幸而部分重要逻辑是通过消息队列异步执行的,半小时内的失败请求、操作基本后续可以自动恢复,截止到目前(第二天下午2:00)还没有收到线上崩溃或者问题反馈。