ClickHouse问题分析:报错:Type mismatch for column LO_SUPPKEY
【摘要】 在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的代码流程。再来分析下这个问题,可以看下图:
可见在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)