DDL 常见问题排查
作者:Zheng Qi
DDL 概念原理
详见 TiDB DDL 架构
DDL 对 DML 的影响
Information schema is changed 报错:详见 触发 Information schema is changed 错误的原因
Information schema is out of date 报错:详见 触发 Information schema is out of date 错误的原因
Add index 对性能的影响:详见 线上负载与 ADD INDEX 相互影响测试
DDL 执行慢
已知情况 Add index:取决于表数据量大小和系统负载;空表加索引通常 3s 左右,5.0 版本以上 0.5s 左右 Create Database/Table 及其他 DDL:多数情况小于 1s,5.0 版本以上 0.5s 左右
常见现象
Case1: 多个 DDL 同时执行,通过 admin show ddl jobs 检查 DDL job 队列是否有等待。
Case2:启动集群后,执行的第一个 DDL 语句。
Case3:执行 kill -9 或异常掉电导致 TiDB 实例强制关闭。
Case4:TiDB 实例频繁启停,例如 TiDB 不断重复 panic 并被 systemctl 拉起的过程。
Case5:TiDB 版本不一致,例如升级过程中断导致某些 TiDB 未完成升级,通过 curl http://{TiDBIP}:10080/info/all 检查 TiDB 版本是否一致。
Case6:TiDB 和 PD 之间网络通信问题,比如网络中断、带宽打满等,通过 TiDB 监控面板 Schema Load 和 DDL 检查 Owner Handle Syncer Duration、Load Schema Duration 等延迟是否过高。
Case7:集群高负载,读写 TiKV 延迟高,通过 TiDB 监控 Meta - Meta Operations Duration 99 检查 DDL meta 相关延迟是否升高。
Case8:对于 Add index,主要时间消耗在索引数据回填操作,大表加索引可以在业务低峰期适当调大 tidb_ddl_reorg_batch_size
和 tidb_ddl_reorg_worker_cnt
。
Case9:创建带有 SHARD_ROW_ID_BITS 表时,使用 PRE_SPLIT_REGIONS 并且 tidb_scatter_region
设置为 1。
DDL 执行卡住
1、排除以上 DDL 执行慢的情况,确认 DDL 是卡住了。
2、找出 DDL owner 节点。
通过 curl http://{TiDBIP}:10080/info/all 获取当前集群的 owner;
通过监控 DDL - DDL META OPM 查看某个时间段的 owner,如下图所示。
3、如果 owner 不存在,尝试手动触发 owner 选举。
curl -X POST http://{TiDBIP}:10080/ddl/owner/resign
4、如果 owner 存在,导出 goroutine 堆栈并检查可能卡住的地方。
curl -G "http://{TIDBIP}:10080/debug/pprof/goroutine?debug=2" > goroutine
此前出现过由于访问 TiKV 异常无法更新任务队列导致 DDL 卡住的问题。