DDL操作卡死,重启tidbserver无效

一个好的问题描述有利于社区小伙伴更快帮你定位到问题,高效解决你的问题

【问题复现路径】DDL操作无响应,查看admin show ddl jobs后用ADMIN CANCEL DDL JOBS 86307终止DDL,状态一直cancelling卡死,集群3个tidbserver尝试重启其中两个,最后一个生产环境比较重要不支持重启,OWNER在重启tidbserver后会跳到另一个tidbserver,导致关于这张表的所有DDL操作无法进行

表数据不多,70多条

手头上有机器不
先扩2个 TiDB 节点

没,生产环境的没有额外机器了

你把部署情况说一下,多少台机器,布了多少个tidb pd tikv

3tidb,3pd,3tikv,3tiflash

看一下数据库的日志,有没有报错信息

全部重启才行

先确认 DDL 卡在哪个阶段

先查 job 详细信息:

ADMIN SHOW DDL JOBS 10;

重点看:

STATE
SCHEMA_STATE
TYPE
QUERY

DDL Owner 节点切换后,原僵死 Job 的元数据未正常清理,导致新 Owner 无法接管该表的 DDL 锁

试试如下两个方法:
方法1、数据库客户端执行如下sql:
UPDATE mysql.tidb_ddl_job
SET state = ‘cancelled’
WHERE job_id = 86307;
方法2、执行如下命令:
ADMIN CANCEL DDL JOB 86307 FORCE;

#元数据锁的可观测性

先看看是不是元数据锁阻塞了 DDL 执行,https://docs.pingcap.com/zh/tidb/stable/metadata-lock/#元数据锁的可观测性

[

mysql.tidb_mdl_view

](mysql.tidb_mdl_view)查看一下是否有元数据锁

使用 ADMIN RESUME DDL OWNER 重新选举 Owner

数据量这么少,重建表不就可以了吗

新的 Owner 节点可能无法正确接管或清理那个 卡死 的取消任务

这么小的表,应该还是锁的问题,应该先把锁处理了,ddl语句就过去了

处理掉锁之后可以过了吗