×
技术社区 >  技术博客 >  OceanBase 报‑5188/1499?分区数超限排查与优化指南

OceanBase 报‑5188/1499?分区数超限排查与优化指南

1. 概述

在 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

本文档梳理了触发该报错的两种典型场景、排查方法及解决方案。

2. 限制说明

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。

3. 场景一:超出租户的分区副本数限制

3.1 判断方法

执行以下 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 万),则说明触达了此限制。

3.2 解决方案

方案 A:租户扩容(推荐)

调整租户 Unit 规格,增加租户内存。这是最根本的解决方式。

方案 B:优化分区表,清理不合理分区

常见浪费场景:

  • 存在大量无用的历史分区未清理
  • 提前创建了过多未来使用的空分区

建议定期清理不合理分区,避免资源浪费。

4. 场景二:超出单表允许的最大分区数

4.1 判断方法

常见于创建分区数较多的二级分区表时。可通过以下 SQL 查看当前参数值:

-- MySQL 租户在 oceanbase 数据库下执行
SELECT * FROM gv$ob_parameters WHERE name LIKE '%max_partition_num%';

4.2 解决方案

方案 A(推荐):合理使用分区表

重新评估分区策略,避免创建过多分区。可考虑:

  • 合并粒度过细的分区
  • 减少不必要的历史/未来分区

方案 B:调大单表最大分区数

-- MySQL 模式
ALTER SYSTEM SET max_partition_num = 20000;

注意:max_partition_num 取值范围为 [8192, 65536],Oracle 模式不支持调整。

5. 常用运维 SQL 汇总

5.1 查看各节点 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;

5.2 查看单表最大分区数参数

SELECT * FROM gv$ob_parameters WHERE name LIKE '%max_partition_num%';

5.3 查看租户下实际分区总数

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。

6. 租户内存与分区数换算参考

租户规格 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。

7. 注意事项

  1. 不建议调整 _max_tablet_cnt_per_gb:调大该参数意味着同等内存下塞入更多 tablet,会加大租户内存压力,可能导致内存分配失败,同时影响读写和合并性能。
  2. 不建议调整 _max_partition_cnt_per_server:同样会提升内存压力,生产环境不推荐修改。
  3. 版本升级关注:从 V4.2.1 BP2 及之前版本升级到 BP3 及之后版本时,需提前检查分区数是否超过 max_partition_num 限制。

精选推荐