使用OceanBase_CE 4.2.1.3版本创建表时提示Error 1499(HY000) :Too many partitions (lincluding subpartitions) were defined 问题

@论坛小助手
测试环境
OceanBase_CE 4.2.1.3版本
问题:创建表时提示Error 1499(HY000) :Too many partitions (lincluding subpartitions) were defined
如图所示

根据您的描述,“在使用 OceanBase_CE 4.2.1.3 版本创建表时提示错误 1499”,这表明您遇到了分区表定义过多的问题。针对此类问题,我们可以通过使用 obdiag 工具来收集相关日志信息,以便进一步分析和解决问题。

日志采集场景: 集群基础信息
日志采集命令: obdiag gather scene run --scene=observer.base

请您执行上述命令并提供采集到的日志压缩包。这将帮助我们更好地理解您的集群配置情况及可能存在的限制。

为了更准确地定位问题,请您提供以下信息:

  1. 您创建的表包含多少个分区(包括子分区)?
  2. 您是否可以分享创建表时使用的 SQL 语句?
  3. 当前集群中是否有其他类似的分区表?如果有,它们是如何定义的?

具体信息可参考以下文档:

  1. 0001 ~ 3999

附上敏捷诊断工具 obdiag 使用帮助链接

建表语句creat table xxx like xxxx;
分区相关如下

根据您提供的信息,错误 1499 表示“定义了太多的分区(包括子分区)”,这通常意味着您尝试创建的表的分区数量超出了系统允许的最大值。在 OceanBase 中,默认的最大分区数为 65535。从您提供的系统参数 max_partition_num 设置来看,其值确实被设定为 65535。

要解决这个问题,您可以采取以下几种方法:

  1. 减少分区数量:检查您的建表语句,确保定义的分区总数不超过 65535。如果可能的话,合并一些分区或重新设计分区策略以减少分区的数量。

  2. 调整系统参数:如果您确实需要更多的分区,并且确定这样做不会对系统的性能和管理带来负面影响,可以考虑调整 max_partition_num 参数。但是请注意,增加分区数量可能会导致更高的管理成本和潜在的性能影响。

  3. 优化分区策略:评估当前的分区策略是否合理。有时候,通过改变分区键或采用不同的分区方法(例如范围分区、列表分区等),可以在不牺牲查询性能的前提下减少所需的分区数量。

由于您没有直接提供具体的建表语句,我无法给出更具体的建议。但从您提供的系统参数信息来看,max_partition_num 的值为 65535,这意味着您需要确保创建的表的分区总数不超过这个值。

如果您已经尝试了上述方法仍然遇到问题,或者需要进一步的帮助来优化分区策略,请提供更多关于您的表结构和使用场景的详细信息,以便我们能够提供更有针对性的建议。

参考文档中的信息 [1],错误 1499 通常与创建分区表时定义了过多的分区有关。因此,按照上述步骤操作应该有助于解决您的问题。

具体信息可参考以下文档:

  1. 分页查询

(小助手的答复已结束,如未能解决您的问题,请继续提问并等待其他同学的回复,谢谢!)

你创建的分区是多少个呢?建表语句方便脱敏后发下吗?另外发下租户内存配置

老哥,
创建的分区查询是0;
建表语句是:create table _xxx like abc;
租户内存配置有调大



后面租户内存后面有加0,重启数据库发现还不行

–查看下租户资源配置

SELECT c.TENANT_ID, e.TENANT_NAME, concat(c.NAME, ': ', d.NAME)pool:conf,concat(c.UNIT_COUNT, ’ unit: ', d.min_cpu, ‘C/’, ROUND(d.MEMORY_SIZE/1024/1024/1024,0), “G”) unit_info FROM DBA_OB_RESOURCE_POOLS c, DBA_OB_UNIT_CONFIGS d, DBA_OB_TENANTS e WHERE c.UNIT_CONFIG_ID=d.UNIT_CONFIG_ID AND c.TENANT_ID=e.TENANT_ID AND c.TENANT_ID>1000 ORDER BY c.TENANT_ID;

建表语句是:create table _xxx like abc; abc是非分区表吗?查询下

select DATABASE_NAME,TABLE_NAME,PARTITION_NAME,SUBPARTITION_NAME from cdb_ob_table_locations where TABLE_NAME=‘abc’ and TENANT_ID=xxx;

CREATE TABLE _tmp_1b9ab30c90eecba10eed12896161b882be (
id bigint(16) NOT NULL AUTO_INCREMENT,
1 varchar(32) NOT NULL DEFAULT ‘’,
2 text DEFAULT NULL,
3 varchar(32) NOT NULL DEFAULT ‘’,
4 varchar(32) NOT NULL DEFAULT ‘’,
5 int(11) NOT NULL DEFAULT ‘0’,
6 bigint(16) NOT NULL DEFAULT ‘0’,
7 varchar(128) NOT NULL DEFAULT ‘0’,
8 int(8) NOT NULL DEFAULT ‘0’,
9 int(8) NOT NULL DEFAULT ‘0’,
10 varchar(128) NOT NULL DEFAULT ‘’,
11 int(8) NOT NULL DEFAULT ‘0’,
12 varchar(128) NOT NULL DEFAULT ‘0’,
13 int(11) NOT NULL DEFAULT ‘0’,
14 varchar(100) DEFAULT ‘’,
15 tinyint(3) NOT NULL DEFAULT ‘0’,
PRIMARY KEY (id),
UNIQUE KEY nodeinfo (6, 7) BLOCK_SIZE 16384 LOCAL,
KEY 2 (2(255)) BLOCK_SIZE 16384 LOCAL
) AUTO_INCREMENT = 1 AUTO_INCREMENT_MODE = ‘ORDER’ DEFAULT CHARSET = utf8mb4 ROW_FORMAT = DYNAMIC COMPRESSION = ‘zstd_1.3.8’ REPLICA_NUM = 1 BLOCK_SIZE = 16384 USE_BLOOM_FILTER = FALSE TABLET_SIZE = 134217728 PCTFREE = 0

这是对应建表语句

create table aaa select * from _tmp_1b9ab30c90eecba10eed12896161b882be;

@论坛小助手

根据您提供的建表语句以及后续的操作描述,您在创建表时并没有显式地指定任何分区。然而,您依然遇到了错误 1499,提示“Too many partitions (including subpartitions) were defined”。这表明问题可能并不在于分区本身,而是其他因素导致的。

考虑到您提到已经增加了租户的内存配置,但问题依旧存在,我们可以进一步探讨以下几个方面:

1. 检查隐含的分区

尽管您的建表语句中没有显式定义分区,但如果您是从另一个已经定义了分区的表 (_tmp_1b9ab30c90eecba10eed12896161b882be) 中选择数据来创建新表 (aaa),那么新表可能会继承源表的分区定义。请确认源表 _tmp_1b9ab30c90eecba10eed12896161b882be 是否已经定义了分区。

2. 核实系统参数

请再次确认 max_partition_num 参数的设置。尽管您提到已经增加了租户的内存配置,但请确保 max_partition_num 的值确实被正确更新,并且重启了数据库使更改生效。

3. 考虑其他限制

除了分区数量之外,还有其他可能的因素会导致类似的问题,例如表的复杂度(如索引数量、列定义等)。请检查您的表定义是否存在其他可能导致问题的地方。

4. 获取更多日志信息

如果以上检查均未发现问题,建议使用 obdiag 工具来收集详细的日志信息,以便进一步分析问题的原因。执行如下命令:

obdiag gather scene run --scene=observer.base

并将收集到的日志压缩包提供给技术支持人员进行分析。

综合建议

  • 检查源表的分区定义:确认源表 _tmp_1b9ab30c90eecba10eed12896161b882be 是否已经定义了分区。
  • 验证系统参数:确保 max_partition_num 的值已被正确更新,并且数据库已重启。
  • 简化表定义:如果可能,尝试简化表定义(例如减少索引数量、优化列定义等),看是否能解决问题。
  • 收集日志信息:使用 obdiag 工具收集日志信息,并联系技术支持人员进行进一步分析。

希望这些建议能帮助您解决问题。如果仍有疑问或需要进一步的帮助,请随时告知。

具体信息可参考以下文档:

  1. 0001 ~ 3999
  2. 4000 ~ 4499
  3. 4500 ~ 4999
  4. 分区概述

测试,用这个建表语句,建几百张表后,再建新表就会出现ERROR 1499 (HY000): Too many partitions (including subpartitions) were defined 这个报错ERROR 1499 (HY000): Too many partitions (including subpartitions) were defined
@论坛小助手

根据您提供的信息,当您在 OceanBase 中创建了大量表之后,再次尝试创建新表时出现了错误 1499:“Too many partitions (including subpartitions) were defined”。这表明尽管您创建的每个表本身没有定义分区,但整个集群中的分区总数可能已经接近或超过了系统允许的最大值。

在 OceanBase 中,每个表可以有自己的分区,而这些分区在整个集群中是统一管理的。即使您创建的表没有显式定义分区,OceanBase 仍会为每个表分配默认的分区。因此,当您创建了大量表之后,整个集群中的分区总数可能会达到上限。

为了解决这个问题,您可以尝试以下几种方法:

  1. 减少表的数量:检查您的应用逻辑,看看是否真的需要这么多表。如果可以合并某些表或重新设计数据模型以减少表的数量,这将有助于缓解问题。

  2. 调整 max_partition_num 参数:如果您的应用场景确实需要大量的表,并且您确定这样做不会对系统的性能和管理带来负面影响,可以考虑调整 max_partition_num 参数。但请注意,增加分区数量可能会导致更高的管理成本和潜在的性能影响。您需要权衡利弊后再做决定。

  3. 优化表设计:评估当前的表设计是否合理。有时候,通过改变表结构或采用不同的设计方法,可以在不牺牲查询性能的前提下减少所需的表数量。

  4. 检查集群状态:确保集群的状态良好,没有其他潜在的问题影响到分区的管理。使用 obdiag 工具收集详细的日志信息,并联系技术支持人员进行进一步分析。

具体来说,您可以尝试以下步骤:

  • 检查当前分区总数:使用 SHOW PARTITIONS 或相关命令查看当前集群中的分区总数。
  • 调整 max_partition_num 参数:如果需要,可以尝试调整 max_partition_num 参数。但请注意,这需要谨慎操作,并且可能需要重启集群才能生效。
  • 优化表设计:重新评估您的表设计,看看是否有可能减少表的数量或合并某些表。

希望这些建议能帮助您解决问题。如果仍有疑问或需要进一步的帮助,请随时告知。

具体信息可参考以下文档:

如果您需要进一步的技术支持,请联系 OceanBase 的官方支持团队。

具体信息可参考以下文档:

  1. 5000 ~ 5999
  2. 创建表组
  3. 创建表
  4. 4000 ~ 4499
  5. 创建表时表已存在,错误代码 ERROR 1050
  6. 0001 ~ 3999
  7. CREATE TABLE

SHOW PARTITIONS,在数据库中没有对应项,数据库版本是OceanBase_CE 4.2.1.3版本 for mysql
@社区小助手

单表分区数量受max_partition_num限制,MySQL模式默认是8192,从你前面的查询结果看设置的是65535,
另外每个 OBServer 节点的分区副本数可根据租户内存大小来预估,1G 内存约支持约 2 万 tablet(内存的计算需要扣除meta租户,2万tablet 受变量 _max_tablet_cnt_per_gb 控制)

–查看下租户资源配置

SELECT c.TENANT_ID, e.TENANT_NAME, concat(c.NAME, ': ', d.NAME)`pool:conf`,concat(c.UNIT_COUNT, ' unit: ', d.min_cpu, 'C/', ROUND(d.MEMORY_SIZE/1024/1024/1024,0), "G") unit_info FROM DBA_OB_RESOURCE_POOLS c, DBA_OB_UNIT_CONFIGS d, DBA_OB_TENANTS e WHERE c.UNIT_CONFIG_ID=d.UNIT_CONFIG_ID AND c.TENANT_ID=e.TENANT_ID AND c.TENANT_ID>1000 ORDER BY c.TENANT_ID;

查看指定表是否为分区表

select DATABASE_NAME,TABLE_NAME,PARTITION_NAME,SUBPARTITION_NAME from cdb_ob_table_locations where TABLE_NAME='abc' and TENANT_ID=xxx;

查看指定租户当前的分区表详情

select DATABASE_NAME,TABLE_NAME,PARTITION_NAME,SUBPARTITION_NAME from cdb_ob_table_locations where TENANT_ID=xxx and PARTITION_NAME <>'NULL';

老哥,我们是直接带参数启动的数据库。
/var/oceanbase-ce/bin/observer -r 127.0.0.1:2882:3306 -p 3306 -P 2882 -z zone1 -c 1710171466 -d /var/oceanbase-ce/store -I 127.0.0.1 -o __min_full_resource_pool_memory=2147483648,enable_syslog_recycle=True,enable_syslog_wf=False,max_syslog_file_count=4,memory_limit=6G,system_memory=4G,cpu_count=4,datafile_size=10G,datafile_maxsize=20G,datafile_next=2G,log_disk_size=20G

谢谢这几天的答复了。

image

现在测试看,到特定数量后就无法新增表了。

上面需要查询的信息和是否带参数启动是没有直接关系的,你是直接用的sys租户创建的分区表吗?
还是说用的普通租户?

这个问题有进展了吗