为何非分区表在修改分区时报错

【 TiDB 使用环境】生产环境
【 TiDB 版本】V4.0.8
【复现路径】
ALTER TABLE finance_r_m_deparement PARTITION BY RANGE (TO_DAYS(quarters)) (
PARTITION p20211 VALUES LESS THAN (‘20211’),
PARTITION p20212 VALUES LESS THAN (‘20212’),
PARTITION p20213 VALUES LESS THAN (‘20213’),
PARTITION p20214 VALUES LESS THAN (‘20214’),
PARTITION p20221 VALUES LESS THAN (‘20221’),
PARTITION p20222 VALUES LESS THAN (‘20222’),
PARTITION p20223 VALUES LESS THAN (‘20223’),
PARTITION p20224 VALUES LESS THAN (‘20224’),
PARTITION p20231 VALUES LESS THAN (‘20231’),
PARTITION p20232 VALUES LESS THAN (‘20232’),
PARTITION p20233 VALUES LESS THAN (‘20233’)
);
【遇到的问题:问题现象及影响】

现有一个3kw数据大表,想使用时间进行分区,结果如下图

【附件:截图/日志/监控】

不支持普通表在线改为分区表

那么是否有高效的方法,修改此类表为分区表呢?

建分区新表,导出导入 应该是最快的了

1 个赞

3000kw数据不算多,新建一个分区表,然后batch insert in select

1 个赞

正如上面h5n1大佬所言, TiDB 不支持将已经存在的表修改为分区表。
所以,一个已经有数据的表要转为分区表(假设表名为T),目前只能这样做:

  • 1 新建一个分区表 T_tmp,其表结构除了分区信息外,其他内容与表 T 保持一致。
    • 这一步就是一个建表语句,很快的。
  • 2 将表 T 的数据导入到 T_tmp 中。
    • 这一步由于涉及大量数据的迁移,不建议使用insert select from(大事务,太慢)
    • 可以考虑使用比较高效和简便的非事务 DML (https://docs.pingcap.com/zh/tidb/stable/non-transactional-dml#非事务-dml-语句),但是非事务 DML 是以牺牲事务的原子性和隔离性为代价,增强批量数据处理场景下的性能。
    • 比较建议使用官方的 dumpling + lightning 工具实现导出导入
    • 如果你们有 Flink 实时流同步工具,用这些第三方工具也是一个很不错的选择。我们通常是使用这种方式,事务处理且性能高(QPS 达到好几万)。
  • 3 校验表 T_tmp 和表 T 的数据一致性情况
    • 简单粗暴的方式就直接比较两边的总行数一致,抽样内容相同即可。
    • 如果要求检查到每一行数据,可以通过 sync-diff-inspector 工具,可以验证上下游数据在某个时间点的一致性
  • 4 drop 掉 表 T, 将 T_tmp 表 rename 为 T

至此,完成普通表到分区表的转换。

所以,业务上线之初就要评估是否建立分区表,如果要就得在新建表之前完成研判和决定,提前建好,不然后期处理会比较麻烦,尤其是数据量规模上来后。

1 个赞

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