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

正如上面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 个赞