ClickHouse问题分析:报错:Type mismatch for column LO_SUPPKEY

举报
ZhjDayDayUp 发表于 2021/12/28 19:35:13 2021/12/28
【摘要】 在ClickHouse中,对修改列字段的操作(ALTER TABLE xxx MODIFY COLUMN xxx)并不友好,经常遇到卡住的问题,而且还无法kill。这时候,最好需要等待执行结束,否则可能出现一些别的麻烦问题。比如,在卡住的时候,妄图做些数据迁移的操作,就出现了如下错误:Type mismatch for column LO_SUPPKEY

问题现象

执行如下操作步骤后,出现报错:Type mismatch for column LO_SUPPKEY. Column has type UInt16, got type UInt32

# 建表(在同分片的两个副本上执行)
CREATE TABLE default.lineorder1
(
    `LO_ORDERKEY` UInt32,
    `LO_LINENUMBER` UInt8,
    `LO_CUSTKEY` UInt32,
    `LO_PARTKEY` UInt32,
    `LO_SUPPKEY` UInt32,
    `LO_ORDERDATE` Date,
    `LO_ORDERPRIORITY` LowCardinality(String),
    `LO_SHIPPRIORITY` UInt8,
    `LO_QUANTITY` UInt8,
    `LO_EXTENDEDPRICE` UInt32,
    `LO_ORDTOTALPRICE` UInt32,
    `LO_DISCOUNT` UInt8,
    `LO_REVENUE` UInt32,
    `LO_SUPPLYCOST` UInt32,
    `LO_TAX` UInt8,
    `LO_COMMITDATE` Date,
    `LO_SHIPMODE` LowCardinality(String)
)
ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/lineorder1', '{replica}')
PARTITION BY toYear(LO_ORDERDATE)
ORDER BY (LO_ORDERDATE, LO_ORDERKEY)
SETTINGS index_granularity = 8192;

CREATE TABLE default.lineorder2
(
    `LO_ORDERKEY` UInt32,
    `LO_LINENUMBER` UInt8,
    `LO_CUSTKEY` UInt32,
    `LO_PARTKEY` UInt32,
    `LO_SUPPKEY` UInt32,
    `LO_ORDERDATE` Date,
    `LO_ORDERPRIORITY` LowCardinality(String),
    `LO_SHIPPRIORITY` UInt8,
    `LO_QUANTITY` UInt8,
    `LO_EXTENDEDPRICE` UInt32,
    `LO_ORDTOTALPRICE` UInt32,
    `LO_DISCOUNT` UInt8,
    `LO_REVENUE` UInt32,
    `LO_SUPPLYCOST` UInt32,
    `LO_TAX` UInt8,
    `LO_COMMITDATE` Date,
    `LO_SHIPMODE` LowCardinality(String)
)
ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/lineorder2', '{replica}')
PARTITION BY toYear(LO_ORDERDATE)
ORDER BY (LO_ORDERDATE, LO_ORDERKEY)
SETTINGS index_granularity = 8192;

# 构造数据
./dbgen -s 10 -T l
clickhouse --client -m -q "insert into lineorder1 FORMAT CSV" < lineorder.tbl;

# 问题复现
# 副本1
# 第一步:
alter table lineorder1 modify column LO_SUPPKEY UInt16;
# 第二步:
alter table lineorder1 modify column LO_SUPPKEY UInt32;

# 副本2
# 第三步(第二步执行后,马上执行,为了在第二步卡住的时候执行)
alter table lineorder2 attach partition 1993 from lineorder1;
alter table lineorder2 detach partition 1993;
alter table lineorder2 attach partition 1993;

在最后执行attach的时候,就出现问题了。

问题分析

通过Clickhouse源码分析:ALTER TABLE xxx MODIFY COLUMN yyy流程分析,我们知道ALTER TABLE的代码流程。再来分析下这个问题,可以看下图:
image.png
可见在clickhouse中,alter table modify column 先要修改元数据,然后再修改数据,这个过程不是原子操作。如果,在修改完元数据后,修改数据之前,某个操作用了修改过的元数据和未修改的数据,就出现了当前这个问题。

问题恢复

1、确定出问题的part
2、查看元数据的类型(show create table xxx),和出问题part目录下(select path from system.parts where table = ‘xxx’ and name = 'yyy’查看)报错的元数据信息(columns.txt),将这两边的元数据类型修改为正确的即可。前者使用alter table modify,后者直接修改columns.txt的内容。
3、attach part/partition

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。