一个SQL无法kill掉的案例

本文涉及的产品
云原生数据库 PolarDB 分布式版,标准版 2核8GB
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
简介: 一个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开源数据库
本实验环境已内置PostgreSQL数据库以及PolarDB开源数据库:PolarDB PostgreSQL版和PolarDB分布式版,支持一键拉起使用,方便各位开发者学习使用。
目录
相关文章
拿php写个原生增删改查案例出来(提供全部代码+sql)
拿php写个原生增删改查案例出来(提供全部代码+sql)
拿php写个原生增删改查案例出来(提供全部代码+sql)
|
3月前
|
SQL 数据库
数据库数据恢复—SQL Server数据库报错“错误823”的数据恢复案例
SQL Server附加数据库出现错误823,附加数据库失败。数据库没有备份,无法通过备份恢复数据库。 SQL Server数据库出现823错误的可能原因有:数据库物理页面损坏、数据库物理页面校验值损坏导致无法识别该页面、断电或者文件系统问题导致页面丢失。
104 12
数据库数据恢复—SQL Server数据库报错“错误823”的数据恢复案例
|
6月前
|
SQL 监控 关系型数据库
实际应用中监控和诊断SQL语句执行情况的具体案例
实际应用中监控和诊断SQL语句执行情况的具体案例
|
2月前
|
SQL 大数据 API
大数据-132 - Flink SQL 基本介绍 与 HelloWorld案例
大数据-132 - Flink SQL 基本介绍 与 HelloWorld案例
46 0
|
4月前
|
SQL 存储 关系型数据库
5大步骤+10个案例,堪称SQL优化万能公式
5大步骤+10个案例,堪称SQL优化万能公式
|
5月前
|
SQL 存储 安全
数据库数据恢复—SQL Server数据库出现逻辑错误的数据恢复案例
SQL Server数据库数据恢复环境: 某品牌服务器存储中有两组raid5磁盘阵列。操作系统层面跑着SQL Server数据库,SQL Server数据库存放在D盘分区中。 SQL Server数据库故障: 存放SQL Server数据库的D盘分区容量不足,管理员在E盘中生成了一个.ndf的文件并且将数据库路径指向E盘继续使用。数据库继续运行一段时间后出现故障并报错,连接失效,SqlServer数据库无法附加查询。管理员多次尝试恢复数据库数据但是没有成功。
|
6月前
|
SQL Java 数据库连接
2万字实操案例之在Springboot框架下基于注解用Mybatis开发实现基础操作MySQL之预编译SQL主键返回增删改查
2万字实操案例之在Springboot框架下基于注解用Mybatis开发实现基础操作MySQL之预编译SQL主键返回增删改查
77 2
|
7月前
|
SQL 存储 小程序
数据库数据恢复—Sql Server数据库文件丢失的数据恢复案例
数据库数据恢复环境: 5块硬盘组建一组RAID5阵列,划分LUN供windows系统服务器使用。windows系统服务器内运行了Sql Server数据库,存储空间在操作系统层面划分了三个逻辑分区。 数据库故障: 数据库文件丢失,主要涉及3个数据库,数千张表。数据库文件丢失原因未知,不能确定丢失的数据库文件的存放位置。数据库文件丢失后,服务器仍处于开机状态,所幸未写入大量数据。
数据库数据恢复—Sql Server数据库文件丢失的数据恢复案例
|
6月前
|
SQL 关系型数据库 MySQL
MySQL数据库——索引(3)-索引语法(创建索引、查看索引、删除索引、案例演示),SQL性能分析(SQL执行频率,慢查询日志)
MySQL数据库——索引(3)-索引语法(创建索引、查看索引、删除索引、案例演示),SQL性能分析(SQL执行频率,慢查询日志)
60 2
|
7月前
|
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等)以及工业级案例教学