在 OceanBase 中建表时,可能会遇到如下报错:
| 模式 | 报错信息 |
|---|---|
| Oracle 模式 |
ORA-00600: internal error code, arguments: -5188, Too many partitions (including subpartitions) were defined |
| MySQL 模式 |
ErrorCode = 1499, SQLState = HY000, Details = Too many partitions (including subpartitions) were defined |
本文档梳理了触发该报错的两种典型场景、排查方法及解决方案。
OceanBase 中与分区数相关的限制主要有两层:
| 限制维度 | 说明 | 关键参数 |
|---|---|---|
| 租户级:分区副本总数 | 每个 OBServer 节点上的分区副本数受租户内存约束,1G 内存约支持 2 万 tablet |
_max_tablet_cnt_per_gb |
| 表级:单表最大分区数 | 单个表允许定义的最大分区数(含子分区) | MySQL 模式:
max_partition_num(默认 8192,最大 65536)Oracle 模式:固定上限 65536,无参数可调 |
补充说明
MySQL 模式的 max_partition_num限制自 V4.2.1 BP3 版本起引入,用于兼容 MySQL 官方限制。V4.1.x ~ V4.2.1 BP2 版本无此限制,升级后可能因分区数过多触发报错。tablet 是分区、索引等在底层的统一存储单元。 内存计算需扣除 Meta 租户(默认占整体租户规格的 10%,最小 512M)。简化估算公式: 租户最大分区 ≈ (租户内存 - 1G) × 20000。
执行以下 SQL,查看各节点当前 tablet 数量:
SELECT svr_ip, svr_port,
count(
1)
AS tablet_count
FROM oceanbase.dba_ob_tablet_replicas
GROUP
BY svr_ip, svr_port
ORDER
BY svr_ip, svr_port;
如果各节点 tablet 数量接近或超过预估上限(租户用户内存 × 2 万),则说明触达了此限制。
调整租户 Unit 规格,增加租户内存。这是最根本的解决方式。
常见浪费场景:
建议定期清理不合理分区,避免资源浪费。
常见于创建分区数较多的 二级分区表时。可通过以下 SQL 查看当前参数值:
-- MySQL 租户在 oceanbase 数据库下执行
SELECT *
FROM gv$ob_parameters
WHERE
name
LIKE
'%max_partition_num%';
重新评估分区策略,避免创建过多分区。可考虑:
-- MySQL 模式
ALTER
SYSTEM
SET max_partition_num =
20000;
注意:
max_partition_num取值范围为 [8192, 65536],Oracle 模式不支持调整。
SELECT svr_ip, svr_port,
count(
1)
AS tablet_count
FROM oceanbase.dba_ob_tablet_replicas
GROUP
BY svr_ip, svr_port
ORDER
BY svr_ip, svr_port;
SELECT *
FROM gv$ob_parameters
WHERE
name
LIKE
'%max_partition_num%';
SELECT svr_ip,
role,
count(*)
AS location_count
FROM oceanbase.CDB_OB_TABLE_LOCATIONS
GROUP
BY svr_ip,
role;
易混淆点:
CDB_OB_TABLE_LOCATIONS:展示表或分区所在的位置信息,涵盖系统表、用户表、索引表等(非分区表计为 1 个分区),适合统计
实际分区总数。
CDB_TAB_PARTITIONS:仅展示分区表的一级分区信息,不含子分区和索引。
统计租户下总分区数应使用
CDB_OB_TABLE_LOCATIONS,而非
CDB_TAB_PARTITIONS + CDB_TAB_SUBPARTITIONS。
| 租户规格 | Meta 租户内存 | 用户租户内存 | 预估最大 tablet 数 |
|---|---|---|---|
| 1G | 512M | 512M | ~1 万 |
| 2G | 1G | 1G | ~2 万 |
| 4G | 1G | 3G | ~6 万 |
| 8G | 1G | 7G | ~14 万 |
| ≥10G | 10% | 90% | 按用户内存 × 2 万计算 |
Meta 租户内存规则:规格 ≥ 10G 时占 10%;规格 ≥ 2G 时固定 1G;规格 < 2G 时固定 512M。
_max_tablet_cnt_per_gb:调大该参数意味着同等内存下塞入更多 tablet,会加大租户内存压力,可能导致内存分配失败,同时影响读写和合并性能。_max_partition_cnt_per_server:同样会提升内存压力,生产环境不推荐修改。max_partition_num 限制。如果在操作过程中遇到问题,欢迎在评论区留言交流,后续我们会持续分享更多实战运维干货,记得 关注不迷路 ,下次见~
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70047467/viewspace-3180282/ ,如需转载,请注明出处,否则将追究法律责任。