一个SQL无法kill掉的案例

本文涉及的产品
云原生数据库 PolarDB 分布式版,标准版 2核8GB
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: 一个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相同命令,从而降低对业务的影响。

相关实践学习
Polardb-x 弹性伸缩实验
本实验主要介绍如何对PolarDB-X进行手动收缩扩容,了解PolarDB-X 中各个节点的含义,以及如何对不同配置的PolarDB-x 进行压测。
目录
相关文章
拿php写个原生增删改查案例出来(提供全部代码+sql)
拿php写个原生增删改查案例出来(提供全部代码+sql)
拿php写个原生增删改查案例出来(提供全部代码+sql)
|
4月前
|
SQL 分布式计算 数据可视化
Spark SQL案例【电商购买数据分析】
Spark SQL案例【电商购买数据分析】
|
6天前
|
SQL 自然语言处理 数据库
NL2SQL实践系列(2):2024最新模型实战效果(Chat2DB-GLM、书生·浦语2、InternLM2-SQL等)以及工业级案例教学
NL2SQL实践系列(2):2024最新模型实战效果(Chat2DB-GLM、书生·浦语2、InternLM2-SQL等)以及工业级案例教学
NL2SQL实践系列(2):2024最新模型实战效果(Chat2DB-GLM、书生·浦语2、InternLM2-SQL等)以及工业级案例教学
|
4月前
|
SQL 分布式计算 数据挖掘
Spark_Day07:Spark SQL(DataFrame是什么和数据分析(案例讲解))
Spark_Day07:Spark SQL(DataFrame是什么和数据分析(案例讲解))
75 0
|
13天前
|
SQL 存储 数据挖掘
数据库数据恢复—RAID5上层Sql Server数据库数据恢复案例
服务器数据恢复环境: 一台安装windows server操作系统的服务器。一组由8块硬盘组建的RAID5,划分LUN供这台服务器使用。 在windows服务器内装有SqlServer数据库。存储空间LUN划分了两个逻辑分区。 服务器故障&初检: 由于未知原因,Sql Server数据库文件丢失,丢失数据涉及到3个库,表的数量有3000左右。数据库文件丢失原因还没有查清楚,也不能确定数据存储位置。 数据库文件丢失后服务器仍处于开机状态,所幸没有大量数据写入。 将raid5中所有磁盘编号后取出,经过硬件工程师检测,没有发现明显的硬件故障。以只读方式将所有磁盘进行扇区级的全盘镜像,镜像完成后将所
数据库数据恢复—RAID5上层Sql Server数据库数据恢复案例
|
1月前
|
SQL
sql server案例总结
sql server案例总结
11 0
原生php实现大案例(特色:不登录不能使用功能 注册 登录 文件上传 发帖 列表页 详情页 )提供sql
原生php实现大案例(特色:不登录不能使用功能 注册 登录 文件上传 发帖 列表页 详情页 )提供sql
|
3月前
|
SQL Oracle 关系型数据库
Oracle PL/SQL基础知识及应用案例
Oracle PL/SQL基础知识及应用案例
33 0
|
5月前
|
SQL 消息中间件 Kafka
Flink教程(17)- Flink Table与SQL(案例与SQL算子)
Flink教程(17)- Flink Table与SQL(案例与SQL算子)
69 0