创建表失败,错误代码 4624

适用版本

OceanBase 数据库所有版本

问题现象

创建表失败,错误信息如下。

obclient> CREATE TABLE test(id int,name varchar(20)); ERROR 4624 (HY000): machine resource is not enough to hold a new unit

可能原因

根据错误信息 machine resource is not enough to hold a new unit,可能是由于在创建表时资源不足。

OceanBase 数据库中的系统变量 ob_create_table_strict_mode表示是否开启创建表时的检查,默认为 TRUE,表示会严格按照 Locality 建立副本,任何副本建立失败,则创建表失败。有关该系统变量的详细信息,请参见《OceanBase 数据库 参考指南》中的 系统变量 章节。

创建表失败的可能原因如下:

  • 创建表后,副本不满足多数派。例如对于 1-1-1 集群,创建表的副本数必须大于等于 2。
  • Unit 数量不满足。例如 1-1-1 集群,如果有一台服务器手动下线,则在创建表时不满足 Unit 数量期望。

特别地,如果您通过 OCP 下线集群中的 OBServer,OCP 会将 ob_create_table_strict_mode 设置为 FALSE,保证在节点下线期间可以正常创建表。

解决方式

如果期望临时规避该问题,可以将 ob_create_table_strict_mode设置为 FALSE,绕过 Locality 检查创建表。

对于不满足 Locality 的原因,可以通过以下方式解决。

  1. 检查集群状态,保证所有的节点的 STATUS列均为 ACTIVE。

如果存在节点的状态为 INACTIVE,则需要重新启动该节点。如果节点不能正常启动,则可能需要替换故障节点。

有关替换节点的方式,请参见 如何通过命令替换 OBServer 节点。

obclient> SELECT * FROM __all_server; ±---------------------------±---------------------------±---------------±---------±—±------±-----------±----------------±---------±----------------------±-------------------------------------------------------------------------------------±-----------------±-------------------±-------------±---------------±------------------+ | gmt_create | gmt_modified | svr_ip | svr_port | id | zone | inner_port | with_rootserver | status | block_migrate_in_time | build_version | stop_time | start_service_time | first_sessid | with_partition | last_offline_time | ±---------------------------±---------------------------±---------------±---------±—±------±-----------±----------------±---------±----------------------±-------------------------------------------------------------------------------------±-----------------±-------------------±-------------±---------------±------------------+ | 2021-03-15 19:54:10.941399 | 2021-03-19 14:36:41.674443 | xxx.xx.xxx.xxx | 2882 | 3 | zone3 | 2881 | 0 | active | 0 | 2.2.76_20210314152507-03d916596ba416277bf49a1a2fccb0b0d36a1631(Mar 14 2021 15:56:27) | 0 | 1615809362031132 | 0 | 1 | 0 | | 2021-03-15 19:54:10.939743 | 2021-03-15 19:56:03.152055 | xxx.xx.xxx.xxx | 2882 | 2 | zone2 | 2881 | 0 | active | 0 | 2.2.76_20210314152507-03d916596ba416277bf49a1a2fccb0b0d36a1631(Mar 14 2021 15:56:27) | 0 | 1615809361167053 | 0 | 1 | 0 | | 2021-03-15 19:54:10.945585 | 2021-03-15 19:56:02.727108 | xxx.xx.xxx.xxx | 2882 | 1 | zone1 | 2881 | 1 | active | 0 | 2.2.76_20210314152507-03d916596ba416277bf49a1a2fccb0b0d36a1631(Mar 14 2021 15:56:27) | 0 | 1615809360741581 | 0 | 1 | 0 | ±---------------------------±---------------------------±---------------±---------±—±------±-----------±----------------±---------±----------------------±-------------------------------------------------------------------------------------±-----------------±-------------------±-------------±---------------±------------------+ 3 rows in set (0.01 sec)

  1. 检查 Locality 配置和租户 Unit 分布情况。
  1. 检查 Locality 配置。

例如 1-1-1 集群中某租户的 Locality 为F@Zone1,创建表后副本不满足多数派,则会导致该错误。

obclient> SELECT tenant_id,tenant_name,locality FROM __all_tenant; ±----------±------------±---------------------------------------------------+ | tenant_id | tenant_name | locality | ±----------±------------±---------------------------------------------------+ | 1 | sys | FULL{1}@zone1, FULL{1}@zone2, FULL{1}@zone3 | | 1002 | MySQL | FULL{1}@zone1, FULL{1}@zone2, FULL{1}@zone3 | | 1003 | Oracle | FULL{1}@zone1, FULL{1}@zone2, FULL{1}@zone3 | ±----------±------------±---------------------------------------------------+ 3 rows in set (0.00 sec)

  1. 检查 Unit 数量。

检查 Unit 数量是否满足 Locality 的配置,保证所有 Unit 的状态均为 ACTIVE。

obclient> select * from __all_unit;