ddl阻塞问题

【 TiDB 版本】7.5.0
今天上午执行了2个DDL 操作:
1、 表ob_host添加列
2、 set global autocommit=off;
3、表ob_Host添加索引(只有6条数据)
再添加索引时 被阻塞了 一直处于running状态,

检查ddl leader的tidb.log 发现一直报
[2024/01/04 10:57:08.458 +08:00] [INFO] [syncer.go:362] ["syncer check all versions, someone is not synced"] [category=ddl] [info="instance ip 10.xxxx, port 4001, id 58d8f3e3-1508-4543-bf52-f7173d80f4ce"] ["ddl job id"=6928] [ver=820]
详细日志见附件

检查tidb_mdl_view 发现有job被阻塞信息
` | 6928 | ob_monitor | ob_host | create index ob_host_idx2 on ob_host(tenant_name ,db_role) | 933243620 | 01-04 11:06:07.640(446781867331420162) |
| 6928 | ob_monitor | ob_host | create index ob_host_idx2 on ob_host(tenant_name ,db_role) | 933243624 | 01-04 11:08:29.390(446781904490332164) |
| 1399 | ob_monitor | ob_host | alter table ob_host add username varchar(16) ,add password varchar(128) | 933243624 | 01-04 11:08:29.390(446781904490332164) |
| 1399 | ob_monitor | ob_host | alter table ob_host add username varchar(16) ,add password varchar(128) | 933243620 | 01-04 11:06:07.640(446781867331420162) |
| 1399 | ob_monitor | ob_host | alter table ob_host add username varchar(16) ,add password varchar(128) | 933243624 | 01-04 11:08:29.390(446781904490332164) |

上述的job除了当前running被阻塞的 显示的其他信息都是好几天前的 ,但是显示的dml语句的trx_start是今天的。


kill 上述 会话 ,再次检查只有ddl job=6928 的会话被Kill掉,添加索引操作完成,ddl job=1399 的试了2次也没被kill
image

问题
1、 被阻塞时 ddl owner的tidb.log 日志显示的是schema not synced,与实际表现来看不符
2、 tidb_mdl_view中记录的信息不准确,ddl job=1399的记录时间是今天的 ,且该job已经是synced。
3、 kill tidb 不好使,


下午再看时Mdl_view中的信息没有了
image

你kill是怎么kill,正常来说kill tidb是可以kill 掉的

加索引会读取全表数据索引。

mysql> show create table tidb_mdl_view\G
*************************** 1. row ***************************
                View: tidb_mdl_view
         Create View: CREATE ALGORITHM=UNDEFINED DEFINER=``@`` SQL SECURITY DEFINER VIEW `tidb_mdl_view` (`job_id`, `db_name`, `table_name`, `query`, `session_id`, `txnstart`, `SQL_DIGESTS`) AS (SELECT `job_id` AS `job_id`,`db_name` AS `db_name`,`table_name` AS `table_name`,`query` AS `query`,`session_id` AS `session_id`,`txnstart` AS `txnstart`,TIDB_DECODE_SQL_DIGESTS(`all_sql_digests`, 4096) AS `SQL_DIGESTS` FROM ((`information_schema`.`ddl_jobs`) JOIN `information_schema`.`cluster_tidb_trx`) JOIN `information_schema`.`cluster_processlist` WHERE (`ddl_jobs`.`state`!=_UTF8MB4'synced' AND `ddl_jobs`.`state`!=_UTF8MB4'cancelled') AND FIND_IN_SET(`ddl_jobs`.`table_id`, `cluster_tidb_trx`.`related_table_ids`) AND `cluster_tidb_trx`.`session_id`=`cluster_processlist`.`id`)
character_set_client: utf8mb4
collation_connection: utf8mb4_bin
1 row in set (0.00 sec)

`ddl_jobs`.`state`!=_UTF8MB4'synced' AND `ddl_jobs`.`state`!=_UTF8MB4'cancelled'

mdl视图表定义存在的 bug,它 job state 只过滤了 ‘sync’ 和 ‘cancelled’,还有一些其他代表已经结束的状态例如上面显示的 ‘done’ 没有过滤掉,导致错误的视图结果。

表DDL添加列出现异常导致后续添加索引异常