请问一下,8.5.4版本,对一个表加了索引和字段后,admin show ddl job 的状态一直为DONE,无法变成synced,请问这是为啥啊
DONE:当前执行 DDL 的 TiDB 节点已完成结构变更、数据回填(加索引 / 加字段),本地元数据生效。
synced:集群内所有 TiDB Server 节点全部拉取同步到这条 DDL 元数据,才算完全闭环。
一直卡在 DONE = 部分 TiDB 实例迟迟未同步这条 DDL 元信息。
- Owner 进程 CPU 打满、OOM、网络断连、磁盘满卡死;
- Owner 节点重启但未重新抢到 Owner 权限,无节点执行元数据同步广播逻辑; Owner 不推送 Schema 版本变更信号,其他 TiDB 不会刷新本地缓存,synced 永远为 0。
检查 DDL Owner、各节点 schema 版本、长事务、网络日志,等待 lease 超时或重选 Owner、重启节点即可
实在不行只能重启,或者一直等
DDL 显示 DONE 但不进入 synced,是部分 TiDB 节点未同步元数据,多由长事务阻塞、节点负载 / 网络异常、PD lease 问题导致。
说明有 tidb 无法 sync,然后查下为啥无法 sync
跨版本问题源于优化器规则和存储引擎层变更。
单节点完成 DDL,但集群部分节点未同步元数据,大概 DDL Owner 异常、长事务、网络 / 负载、租约问题导致。
-
STATE = DONE DDL Owner 已经完成元数据变更 + 数据回填(add index 的 reorg 阶段),TiKV 侧所有 Region 结构、索引数据全部落地,发起 DDL 的客户端 SQL 已经返回成功,业务读写已经可以正常使用新增字段 / 索引。 此时仅仅是:DDL Owner 还没收集校验完所有 TiDB Server 节点的 Schema 版本同步状态。
-
STATE = SYNCED 在 DONE 基础上,Owner 遍历集群全部 TiDB 实例,确认所有节点本地内存 Schema 缓存都加载了最新版本 Schema、MDL 锁全部对齐释放,任务才算闭环写入历史,状态变为 syncedTiDB
检查 DDL Owner、各节点 schema 版本、长事务、网络日志,等待 lease 超时或重选 Owner、重启节点即可
重启非 Owner 的 TiDB 节点试试
可以在每个节点看些使用对应sql的执行计划,看看是否使用到了索引,没有的,重启下看看
SELECT * FROM mysql.tidb_mdl_view ORDER BY TxnStart LIMIT 1 看下
DONE:完成结构变更、数据回填,业务已能用新表。
部分 TiDB 节点未同步Schema,或者检查下有没有异常 TiDB 节点
ADMIN SHOW DDL JOBS 里 DONE 表示该 job 已完成;synced 更多是集群 schema 版本对齐状态,不是每个 job 都必须再显示成 synced。可查 ADMIN SHOW DDL 看 owner 与当前 job,并用 SCHEMA VERSION 相关视图确认各 TiDB 实例已同步。若业务已能用新列/索引,通常已生效;若仍查不到新列,再查是否有后续 job 卡住或连到了未刷新的实例。
把show processlist里对应库的sleep进场除了root用户的全杀了就好了,昨天刚试了有效