MySQL模式单表创建8186个分区报Too many partitions (including subpartitions) were defined错误

如题,在企业版3.1.2版本报该错误,开源版本应该也有类似问题。
企业版文档和开源文档都说支持8192个分区。
开源文档:


企业版文档:

报错信息如下:


pttable.sql (373.6 KB)

建表SQL见附件。

你好,麻烦将.sql文件转换成.txt文件上传

建分区表SQL.txt (373.6 KB)
可以了。。。

非常感谢您的配合,请稍等

根据您提供的sql,在单机模式下也原样复现了,其实根本原因是内存不够:
排查流程:

  • 执行语句报错:Too many partitions (including subpartitions) were defined

  • 报错如图:

  • 查看代码 ob_service.cpp:1215 行

  • reach_tenant_partition_limit 触发错误,查看reach_tenant_partition_limit方法报错

  • reach_tenant_partition_limit 1638行报错:
    WARN [STORAGE] reach_tenant_partition_limit_ (ob_partition_service.cpp:1638) [358][462][YB427F000001-0005E4B4365732B0] [lt=16] [dc=0] reach tenant max partition num limit(tenant_id=1, cur_part_cnt=1200, cur_pg_cnt=0, batch_cnt=8185, cur_part_mem_reserved=172032000, cur_pg_mem_reserved=0, acquired_mem=1173401600, tenant_mem_limit=322122500)

  • 查看reach_tenant_partition_limit 1638行 代码:

此处复现的根本原因是内存不够抛出错误,但是因为reach_tenant_partition_limit方法未返回错误码,导致报错始终为:too many partitions

建议您也查看一下observer.log,是否和我的排查复现相同,如果相同欢迎您去github上提相关issue

哦哦,非常感谢,也就是说,就算仅仅创建一个空的分区表,也是有最低内存要求的。
不知道仅创建需要多少内存?

另外就是为什么MySQL模式支持的分区个数比Oracle模式支持的分区个数少?

1 个赞

为什么MySQL模式支持的分区个数比Oracle模式支持的分区个数少?
因为要兼容mysql 和 oracel本身的特性

mysql分区:
Mysql Restrictions and Limitations on Partitioning 在 MySQL 5.6.7 之前,未使用 NDB存储引擎,其给定表的最大可能分区数为 1024。从 MySQL 5.6.7 开始,此限制增加到 8192 个分区。无论 MySQL 服务器版本如何,此最大值都包括子分区。