升级增加TiFlash后DDL报错:ERROR 1105 (HY000): invalid ddl job type: none

为提高效率,请提供以下信息,问题描述清晰能够更快得到解决:


若提问为性能优化、故障排查类问题,请下载脚本运行。终端输出的打印结果,请务必全选并复制粘贴上传。

  1. tiup cluster display 看下当前集群状态
  2. 麻烦反馈下表结构
  3. 执行报错后,麻烦看下日志是否有更多详细信息,反馈下 tidb.log 和 tiflash.log ,多谢。

1、麻烦测试或观察一下 集群当前 DDL 的运行情况(是否其他的 DDL 运行正常)
2、给一下这个命令的结果:curl http://xx.xx.xx.xx:10080/info 其中 xx.xx.xx.xx 替换成 tidb-server 的 ip 及状态端口

另外,你的标题是升级,你是升级时执行的命令还是升级后执行的,最好环境描述一下

1.猜测是组件直接版本问题:请检查一下所有的 tidb/tiflash 是不是也是升级到 v4.0.12,tiflash 二进制查看版本方法
2.猜测是配置问题,请另外用tiup 启动一个 v4.0.12 的集群,然后测试这个语句是否有问题。应该是没有问题的,然后你再导入你的配置,再检查一下。

猜测是升级还没有完成,角色为 DDL owner 的 TiDB 节点还处于旧版本。

可以将 curl http://xx.xx.xx.xx:10080/info 在所有 TiDB 上执行一遍,检查 is_owner: true 的 TiDB 是否已经升上了 4.0.12。如果没有,可以通过 curl -X POST http://{TiDBIP}:10080/ddl/owner/resign 驱逐到其他节点,直到 DDL owner 的 TiDB 版本为 4.0.12。

针对第一个问题,我后来修改了一下是: 所有的 tidb/tiflash 是不是也是升级到 v4.0.12?这个要把所有的 二进制都检查一下。
第二个问题我再看看你这里细节

对于导入的集群,删配置是不行的,只能增加配置或修改导入的配置,若删配置,则会回退成导入时的配置(而不是新部署的集群的默认配置)

看看选一台 TiDB 执行 SQL 语句 admin show ddl 的结果呢

这里是指 admin show ddl, 不是 admin show ddl jobs, 麻烦请再贴一下结果。

只针对导入的集群会这样,这个是做成 feature 的,导入的集群会在 ~/.tiup/storage/cluster/clusters//ansible-imported-configs 文件夹里面存放导入时候的配置作为默认值,如果不想要这样的行为,把这个文件夹下面的配置文件删了就好了

1 个赞

感谢反馈。

这里有一篇文章介绍 TiDB 的 DDL 原理:【SOP 系列 03】在线表结构变更(Online DDL)

1 个赞

对于第一个问题,是会这样的,但是导入之后在 edit-config 里会显示各个组件的当前配置(前提是没手动删除):https://docs.pingcap.com/zh/tidb/stable/release-5.0.0-rc#部署及运维
所以,如果出现不一致,是能从 edit-config 里看出来的。另外就是,即使不要 ansible-imported-configs,后续扩容出来的和现有的也是不一样的,因为导入的时候分别把配置导入了各自的实例里面,新扩容的实例不会有导入的配置。

对于第二个问题,可以采用离线镜像的方式来实现:https://docs.pingcap.com/zh/tidb/stable/production-offline-deployment-using-tiup

1 个赞

麻烦 touch 一个空的文件试试
@ssnijik

我们会改进此问题,建了个 issue 用来 trace 这个问题:https://github.com/pingcap/tiup/issues/1347

导致这个问题的原因是,meta.yaml (edit-config 看到的配置) 和 ansible-imported-configs 同时存在导入的配置,导致这部分配置有两个副本,通过 edit-config 删除 meta.yaml 中的之后,ansible-imported-configs 中的配置继续生效。

我们的改进方案是:import 成功之后,会将 ansible-imported-configs 中所有的内容注释,这样就只会剩下 meta.yaml 一个副本。这个方案兼容 touch 的 workaround。

我们不能直接删除 ansible-imported-configs,因为有一段代码逻辑一定要将 ansible-imported-configs 应用到集群配置上,这段逻辑是来兼容老的集群的,这些集群 import 的时候没有把配置复制到 meta.yaml 中,他们的配置只存在于 ansible-imported-configs 中。如果删了 ansible-imported-configs 会导致这段逻辑报错,如果删了这段逻辑会导致老的集群配置不 work。

3 个赞

此话题已在最后回复的 1 分钟后被自动关闭。不再允许新回复。