增加索引报错 ERROR 1150 cancelled DDL job

为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。

  • 【TiDB 版本】:3.0 rc
  • 【问题描述】:在对一个大表(3亿行)添加索引时报错: ERROR 1150 cancelled DDL job

sql:alter table xxx add index idx_xx(xx);

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

麻烦提供一下以下信息:

  1. select tidb_version() 的执行结果
  2. 通过 admin show ddl 以及 admin show ddl jobs 查看 ddl 语句的状态
  3. 对应 tidb-server 节点的 tidb.log 日志

1、select tidb_version() 的执行结果:

  • Version: 2.1.0-alpha.1-ff3dd160846b7d1aed9079c389fc188f7f5ea13e
    Check Table Before Drop: false’‘’
  • Release Version: v3.0.0
  • Git Commit Hash: 60965b006877ca7234adaced7890d7b029ed1306
  • Git Branch: HEAD
  • UTC Build Time: 2019-06-28 12:14:07
  • GoVersion: go version go1.12 linux/amd64
  • Race Enabled: false
  • TiKV Min Version: 2.1.0-alpha.1-ff3dd160846b7d1aed9079c389fc188f7f5ea13e
  • Check Table Before Drop: false

3、log:


[2020/05/05 18:11:52.086 +08:00] [INFO] [ddl_worker.go:302] [“[ddl] finish DDL job”] [worker=“worker 2, tp add index”] [job=“ID:13591, Type:add index, State:rollback done, SchemaState:none, SchemaID:6598, TableID:10868, RowCount:64028811, ArgLen:2, start time: 2020-05-05 17:16:13.141 +0800 CST, Err:[ddl:12]cancelled DDL job, ErrCount:514, SnapshotVersion:416460354051375106”]

通过 admin show ddl 以及 admin show ddl jobs 查看 ddl 语句的状态

第2步是指什么操作呢?
我这边是二进制部署的集群

https://pingcap.com/docs-cn/stable/reference/sql/statements/admin/#admin

在 MySQL 客户端中执行 admin show ddl 以及 admin show ddl jobs 查看 ddl 语句的状态

add index 这个操作执行了多久报的 ERROR 1150 的错误?
tidb tikv 实例有重启的情况吗?实例重启可以通过 grep -i welcome 对应的 tidb.log 或者 tikv.log 判断

DDL状态:

  • SCHEMA_VER OWNER_ID OWNER_ADDRESS RUNNING_JOBS SELF_ID QUERY
  • 420 8a0b4a47-4f04-4319-8afa-87a1be296896 10.17.64.52:4000 ID:13598, Type:add index, State:running, SchemaState:write reorganization, SchemaID:6598, TableID:10868, RowCount:1909123, ArgLen:0, start time: 2020-05-06 09:24:37.391 +0800 CST, Err:, ErrCount:0, SnapshotVersion:416475585679458305 8aa2c409-f98d-44b3-b262-19c6791e16c9 ALTER TABLE tablename ADD INDEX index_server_id(server_id)
  • JOB_ID DB_NAME TABLE_NAME JOB_TYPE SCHEMA_STATE SCHEMA_ID TABLE_ID ROW_COUNT START_TIME STATE
  • 13598 dbname tablename add index write reorganization 6598 10868 1909123 2020-05-06 09:24:37.391 +0800 CST running
  • 13593 dbname tablename add partition public 6598 10868 0 2020-05-06 07:18:09.991 +0800 CST synced
  • 13591 dbname tablename add index none 6598 10868 64028811 2020-05-05 17:16:13.141 +0800 CST rollback done
  • 13590 dbname tablename add index none 6598 10868 40464652 2020-05-05 16:13:25.941 +0800 CST rollback done

运行了55分钟;tikv无重启情况

  1. 能否发送这张表的表结构,是否是分区表? 和 添加索引的 sql?
  2. 麻烦从开始添加 索引到cancel 的 tidb 和 tikv 日志上传,多谢

1、是分区表
create sql:

  • CREATE TABLE xxx (
  • dt int(11) DEFAULT NULL COMMENT ‘日期’,
  • server_id varchar(10) DEFAULT NULL COMMENT ‘服务器id’,
  • serverip varchar(18) DEFAULT NULL COMMENT ‘服务器ip’,
  • server_isp varchar(20) DEFAULT NULL COMMENT ‘服务器运营商’,
  • hour tinyint(4) DEFAULT NULL COMMENT ‘小时’,
  • delay bigint(20) DEFAULT NULL COMMENT ‘数据量’,
  • users int(11) DEFAULT NULL COMMENT ‘用户量’
  • ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin
  • PARTITION BY RANGE ( dt ) (
  • PARTITION dt20180101 VALUES LESS THAN (20180101),
  • PARTITION dt20180102 VALUES LESS THAN (20180102),
  • PARTITION dt20180103 VALUES LESS THAN (20180103)
  • );

index SQL:
ALTER TABLE table_name
ADD INDEX index_server_id (server_id);

2、日志,不方便传文字版:


  1. 查看日志报错gc问题,建议调整gc 时间长一些. 参考以下文档,加完之后,再把gc 的时间改回来。

https://pingcap.com/docs-cn/v3.0/reference/garbage-collection/configuration/#gc-配置

  1. 请问 执行 DDL 之前,您有改过 什么参数吗?

1、这边情况是20+G,3亿+行的表,有什么好的调参建议(哪个参数 值多少)吗

2、没有修改过什么参数

你好,

是的,目前 gc 时间为 ‘10m0s’,可以通过 select VARIABLE_NAME, VARIABLE_VALUE from mysql.tidb; 来检查 tikv_gc_life_time 值,具体可看上面链接。

可以根据目前业务情况磁盘状态设置下 gc 时间,亦可以在测试环境试跑下看下执行时间为多少,建议在业务低峰期进行大表的 add index 操作,以防止频繁的数据操作增大 gc 占用空间,对 tidb 集群造成影响,

update mysql.tidb set VARIABLE_VALUE="24h" where VARIABLE_NAME="tikv_gc_life_time";

update mysql.tidb set VARIABLE_VALUE=“24h” where VARIABLE_NAME=“tikv_gc_life_time”;

有用,加上索引了,thx

btw,耗时6h

感谢回复,可以尝试将集群升级至 3.0 最新版,此版本对添加索引的 gc 时间设置也是做了优化,可以看下 release not 。

改为
update mysql.tidb set VARIABLE_VALUE=“12h” where VARIABLE_NAME=“tikv_gc_life_time”;
无用

update mysql.tidb set VARIABLE_VALUE=“24h” where VARIABLE_NAME=“tikv_gc_life_time”;
改为24 也有问题,依然显示

你好,这个帖子已经很久远,请开新帖我们追踪下你的问题

见此贴

OK~

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