ITPub博客

首页 > 数据库 > 国内数据库 > OceanBase 报‑5188/1499?分区数超限排查与优化指南

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

原创 国内数据库 作者:瑞蓝创_RLC_888 时间:2026-08-20 18:01:55 0 删除 编辑

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 限制。

如果在操作过程中遇到问题,欢迎在评论区留言交流,后续我们会持续分享更多实战运维干货,记得    关注不迷路    ,下次见~

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70047467/viewspace-3180282/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
专注于企业信息科技战略咨询、数据中心规划及运维、智能化软件产品研发,致力于为金融、能源、电信、制造等行业提供智能的业务永续及流程自动化解决方案。

注册时间:2025-09-08

  • 博文量
    89
  • 访问量
    86696