开发者社区> 化雨u> 正文

一个SQL无法kill掉的案例

简介: 一个SQL无法kill掉的案例 问题描述 因为业务需要,客户有一个ddl需求扩展某一drds单表的列的长度,但是在drds上执行ddl的时候被一个select阻塞mdl(metadata lock)锁,详情见官方文档8.11.4 Metadata Locking。
+关注继续查看

一个SQL无法kill掉的案例

问题描述

因为业务需要,客户有一个ddl需求扩展某一drds单表的列的长度,但是在drds上执行ddl的时候被一个select阻塞mdl(metadata lock)锁,详情见官方文档8.11.4 Metadata Locking。报错以及SQL如下:
image
这样的SQL是手工执行,客户想要通过kill掉SQL来解决,但是出现问题:
image

执行kill命令成功,但是一直显示SQL为killed状态,还是在执行中。由于这个SQL一直不能释放资源,导致ddl无法执行。

解决过程

Killed状态是正在释放SQL所占用的资源,官方解释如下:
Killed
  Someone has sent a KILL statement to the thread and it should abort next time it checks the kill flag. The flag is checked in each major loop in MySQL, but in some cases it might still take a short time for the thread to die. If the thread is locked by some other thread, the kill takes effect as soon as the other thread releases its lock.

通过查看SQL的事务,发现这个查询所在的事务已经执行了一周以上的时间,如果是等待回滚的话,需要等待很长一段时间。(估计是hang死在这了)

image

看SQL的执行计划,笛卡尔积总共扫描200亿行数据。
image

为了快速恢复客户业务,首先想到的就是通过RDS主备切换,因为是drds单表,访问都是在0号库上,所以只针对RDS 0号库主备切换,然后重启备库。(还是需要重启解决啊==)
通过DRDS层面看这个SQL已经因为执行超时被kill了,但是下发到了RDS上还是在执行。

image

检查好主从状态,确定没有延迟,通过杜康进行主备切换,切换成功后验证使用ddl语句,发现报错:
image

image

根据报错发现是drds分库上表不存在。

DRDS单表与小表广播的区别:

单表与小表广播都是会在所有drds的分库上创建一张表,只不过小表广播的表所有的分表都有全表数据;而单表的数据只会存储在0号库,其他库只有一个表结构,这么做是为了方便将来可能使用小表广播。
小表广播:在各分库就完成了数据join汇总,避免跨库操作

检查分库分表情况,发现确实只有0号库有这张表,其他分库没有
image

image

SQL没有开启审计,客户反馈没有执行过删除其他分库的表命令,无法定位为什么导致表结构只有在0号库存在的问题,先解决当前问题。通过在DRDS上创建表,create table if not exists table_name,将分库的表结构补齐后,客户反馈执行ddl成功。
该处理备库了,备库不出意外的也出现了MDL锁,由于同步过来的ddl语句导致,开始重启备库了。
image

重启备库出现了小插曲,在杜康上重启备库失败,重跑也失败,最后是黑屏客户端登录到备库上,手动拉起的mysql进程,重新跑成功,有惊无险,问题解决!

总结:

Killed这种状态,一般是大事务、大查询、ddl等执行过程中被kill,回滚需要很长的一段时间,只能通过等待SQL事务回滚完成,这里是select阻塞直接重启mysql,可以通过切换主备后重启备库的方式解决。另外在执行ddl命令前可以先在备库执行,set sql_log_bin=OFF停止写binlog,然后主备切换,这样旧主上就不会因为这个ddl同步过来再次产生mdl锁,然后在旧主上执行ddl相同命令,从而降低对业务的影响。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
《Apache Flink 案例集(2022版)》——2.数据分析——快手-Flink SQL 在快手的扩展和实践(1)
《Apache Flink 案例集(2022版)》——2.数据分析——快手-Flink SQL 在快手的扩展和实践(1)
18 0
《Apache Flink 案例集(2022版)》——2.数据分析——快手-Flink SQL 在快手的扩展和实践(2)
《Apache Flink 案例集(2022版)》——2.数据分析——快手-Flink SQL 在快手的扩展和实践(2)
19 0
《Apache Flink 案例集(2022版)》——2.数据分析——快手-Flink SQL 在快手的扩展和实践(3)
《Apache Flink 案例集(2022版)》——2.数据分析——快手-Flink SQL 在快手的扩展和实践(3)
16 0
《Apache Flink 案例集(2022版)》——2.数据分析——快手-Flink SQL 在快手的扩展和实践(4)
《Apache Flink 案例集(2022版)》——2.数据分析——快手-Flink SQL 在快手的扩展和实践(4)
15 0
如何使用SQL任务计算房间电量消耗的实践案例
文本介绍一例物联网平台数据服务SQL洞察用于智能家居的实践案例
165 0
【SQL开发实战技巧】系列(十一):拿几个案例讲讲translate|regexp_replace|listagg|wmsys.wm_concat|substr|regexp_substr常用函数
translate|regexp_replace|listagg|wmsys.wm_concat|substr|regexp_substr常用函数。如何使用translate或regexp_replace提取姓名的大写首字母缩写、如何使用translate或regexp_replace按字符串中的数值排序、如何聚合表中的行创建一个以逗号分隔拼接的字符串(函数LISTAGG、wmsys.wm_concat)、如何使用substr或regexp_substr提取第N个分隔符的子串、如何分解IP地址
26 0
分享一个SQL的bypass小案例
分享一个SQL的bypass小案例
32 0
数据库sql去重操作 + 人大金仓案例
一般在增量导入数据后,表中会出现冗余的数据,因此对于表的去重操作主要分为两种:去重查询以及删除重复数据
90 0
sql调优之:字符集不一致导致的索引失效案例
生产上有一段sql,大概几百行,做的是inser into …select ;的操作,但是执行了一个多小时都出不来,正常情况下不会这么久,通过一步步定位,最后发现是其中某一段的join 特别慢导致的,后面对这段sql重点分析发现,这里的表竟然没有走索引,对于几十万以上的表之间的连接,若是没有索引那就是灾难性的,加不加索引就好比一个人力三轮与超跑的区别。
115 0
+关注
化雨u
智者乐水,仁者乐山
文章
问答
视频
文章排行榜
最热
最新
相关电子书
更多
第十二届 BigData NoSQL Meetup — 基于hbase的New sql落地实践
立即下载
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
相关实验场景
更多