联系我们
18591797788
hubin@rlctech.com
北京市海淀区中关村南大街乙12号院天作国际B座1708室
18681942657
lvyuan@rlctech.com
上海市浦东新区商城路660号乐凯大厦26c-1
18049488781
xieyi@rlctech.com
广州市越秀区东风东路华宫大厦808号1608房
029-81109312
service@rlctech.com
西安市高新区天谷七路996号西安国家数字出版基地C座501
在 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 限制。