在从 MySQL 迁移到 Citus 集群期间,我使用了range
分发方法。迁移已完成,但现在我想将分发方式更改为hash
.
对于已有数据的现有表,有没有办法将分布方法从更改为更改range
?hash
我想出了以下程序,但不确定它是否有效:
- 为所有正在更改的分片更新表的
minvalue
和maxvalue
列pg_dist_shard
- 将表的分片存储类型列
pg_dist_partition
从更新r
为h
COMMIT;
在从 MySQL 迁移到 Citus 集群期间,我使用了range
分发方法。迁移已完成,但现在我想将分发方式更改为hash
.
对于已有数据的现有表,有没有办法将分布方法从更改为更改range
?hash
我想出了以下程序,但不确定它是否有效:
minvalue
和maxvalue
列pg_dist_shard
pg_dist_partition
从更新r
为h
COMMIT;
这是个好问题。目前,Citus 不提供直接更改现有数据的分区类型的方法。
在范围分区中,记录根据其分区列值和分片最小/最大值放置在分片中。如果记录 x 驻留在分片 y 中,则表示y.minvalue <= x.partition_column <= y.maxvalue
。
在散列分区中,对分区列进行散列,并根据此散列值路由记录。因此,您看到的最小/最大值pg_dist_shard
是散列函数结果的边界值。在这种情况下y.minvalue <= hash(x.partition_column) <= y.maxvalue
。
因此,进行您提到的更改最终会导致分配不正确。为了从范围分区切换到哈希分区,数据应该重新分布。为此,我建议将数据重新加载到一个空的散列分区表中。