天堂任鸟飞
#1
【 使用环境 】测试环境
【 OB or 其他组件 】OB
【 使用版本 】5.7.25-OceanBase_CE-v4.0.0.0
【问题描述】重排列的online ddl理论上应该是只修改schema元数据,很快能执行完成;但实际情况是走了创建临时表、补数据的整个流程,大表的情况下耗时长。
【复现路径】
建表语句:
CREATE TABLE sbtest1 (
id int(11) NOT NULL AUTO_INCREMENT,
k int(11) NOT NULL DEFAULT ‘0’,
c char(120) NOT NULL DEFAULT ‘’,
pad char(60) NOT NULL DEFAULT ‘’,
PRIMARY KEY (id)
)
partition by hash(id)
(partition p0,
partition p1,
partition p2,
partition p3,
partition p4);
表里有一亿条记录。
重排列的ddl:
alter table sbtest1 modify c char(120) NOT NULL DEFAULT ‘’ FIRST;
【问题现象及影响】
预期很快执行成功。但实际执行很久仍不出结果。
排查rs日志,可以看到明显的创建临时表和补数据的过程:
夏进
#4
重排列是offline ddl,数据需要重整,所以走了创建临时表,补数据流程
夏进
#6
确认是 offline的,感谢反馈,文档的描述我们后续会更正
天堂任鸟飞
#7
这是你们2月15日官方公众号的推文哈:
还是得严谨一点。
另外mariadb 10.4中针对重排列已经支持了instant算法了:
夏进
#8
好的收到,非常感谢,我已经反馈给相关同学,近期会修正,再次感谢!
夏进
#9
跟负责文档的同学确认了,我们会在文档上加上一个备注,作为修正:
OceanBase 3.x对于drop column / add column after/ before是不重整数据的, 在4.0版本我们对于这两个操作,包括新支持的reorder column,在4.0版本是走数据重整的方式,采用这种变更方式的好处是后续可以立即做分区交换,未来我们也会提供不重整数据的方式,优点是速度快,但做完这些操作后,不能立即做分区交换。
天堂任鸟飞
#10
好的,谢谢。这里把选择权交给用户的做法是合理的,这样就变成:
- 在用户不需要分区交换这个功能时,instant方式执行显然效率更高,另外分区交换操作也有别的替代方式;
- 用户需要分区交换功能,且能接受耗时长、有一定资源开销的情况下,再走数据重整方式。
2 个赞