大家好,我们在做从其他数据库迁移到Apache Doris 2.1 存算一体 的过程中,遇到 AUTO LIST PARTITION 分区名长度上限 50 的问题,导致 load 时自动创建分区失败,想请教原因与解决方案/最佳实践。
1)业务背景(迁移诉求)
源库里已经按业务维度做了分区,我们希望在 Doris 里尽可能保持类似的分区组织方式,且不希望每来一批新数据就手工 ALTER TABLE ADD PARTITION。
如果不使用 AUTO 分区,采用手工 LIST 分区大概是这样:
PARTITION BY LIST(`ACCT_DATE`, `CLUSTER_ID`, `DB_NAME`) (
PARTITION p_20240409_hh_app_01_DC_018 VALUES IN (("20240409", "hh_app_01", "DC_018"))
)
那么后续每天/每个 cluster/db 组合都会不断出现新分区值,就需要持续执行类似:
ALTER TABLE TABLENAME
ADD PARTITION p_20260130_hh_cloud_01_DC_018
VALUES IN (("20260130", "hh_cloud_01", "DC_018"));
这在迁移后持续写入的场景下,运维成本较高,所以我们倾向使用 AUTO LIST PARTITION 让系统自动建分区。
2)问题现象
创建了 AUTO LIST PARTITION 的表后,load 数据触发自动建分区时失败,报错如下:
Partition name's length is over limit of 50. abort to create.
我们的分区列是 3 个字段:ACCT_DATE, CLUSTER_ID, DB_NAME。某些数据行里 CLUSTER_ID / DB_NAME 会比较长,导致自动生成的分区名(由分区列拼接 + 转义得到)超过 50。
3)核心问题
-
为什么 AUTO LIST PARTITION 的分区名长度要限制为 50?
这个限制是出于元数据存储、兼容性(MySQL 协议/内部对象命名)、性能/稳定性、还是其它原因? -
是否有配置项可以放宽/取消 50 的限制?
比如 FE/BE 配置、session 变量等。 -
如果没有配置项,是否只能通过改源码调整?相关限制是在 FE 侧校验还是 BE 侧校验(或两边都有)?
-
能否支持“自定义自动分区命名规则”?
我们实际更关心的是“分区 VALUES 能正确表达 (ACCT_DATE, CLUSTER_ID, DB_NAME)”,分区名本身不一定要把三列完整拼进去。
是否有办法让 AUTO 分区使用类似如下方式命名,避免超长:
p_{date}{shortHash}(hash 基于三列值)
或 p{sequence}(序号/自增),只要能与 VALUES 对应即可 -
如果当前确实无法放宽限制,社区对类似迁移/持续写入场景,有没有推荐的替代方案?