租户创建或扩容提示机器资源不足
- 现象
在创建资源池的时候,或者在调整资源池资源规格的时候,碰到报错信息如下:
ERROR 4624 (HY000): machine resource 'zone1' is not enough to hold a new unit
- 原因
报错信息提示了某个 ZONE 里没有足够的资源创建该资源单元。通常是资源单元规格超出了集群资源可用资源。 所以创建资源池或者调整资源池之前需要计算集群可用资源。这个只需要查看视图 __all_virtual_server_stat
。 由于默认 SYS 租户的资源规格的 min_cpu
和 min_memory
跟对应的 max_cpu
和 max_memory
不一致,会导致集群剩余资源展示的不准。
查看剩余资源的 SQL:
select a.zone,concat(a.svr_ip,':',a.svr_port) observer, cpu_total, cpu_assigned, (cpu_total-cpu_assigned) cpu_free, mem_total/1024/1024/1024 mem_total_gb, mem_assigned/1024/1024/1024 mem_assign_gb, (mem_total-mem_assigned)/1024/1024/1024 mem_free_gb from __all_virtual_server_stat a join __all_server b on (a.svr_ip=b.svr_ip and a.svr_port=b.svr_port) order by a.zone, a.svr_ip ;
注意这个结果都是四舍五入的,会对结果有一点影响。保持所有资源的分配不要有小数点,则这个结果就准确了。
建表提示机器资源不足
- 现象
普通的建表语句,忽然报错提示机器资源不足。
MySQL [test]> create table t01(id bigint not null primary key auto_increment, c1 varchar(50), c2 datetime not null default current_timestamp); ERROR 4624 (HY000): machine resource is not enough to hold a new unit
- 原因
在三副本集群里,默认建表会创建三个副本。如果有节点掉线,并且该租户在那个节点上还有资源单元(resource unit
)存在,则这个建表语句就无法创建三个副本。默认情况下,OceanBase 为了保证表元数据强一致,就会报错。这个报错信息是跟机器资源有关,但是不是那么直接。但是可以通过修改租户参数关闭这个强约束。 参数名是:ob_create_table_strict_mode
MySQL [test]> show global variables like '%strict%'; +-----------------------------+-------+ | Variable_name | Value | +-----------------------------+-------+ | ob_create_table_strict_mode | ON | +-----------------------------+-------+ 1 row in set (0.009 sec)
- 解决方法
方法一:找出租户的资源单元所在节点,查看该节点掉线的原因,解决它,然后建表。这个时间可能有点长。 方法二:会话级别或者全局级别关闭参数 ob_create_table_strict_mode
,允许节点掉线情况下建表能成功。
MySQL [test]> set session ob_create_table_strict_mode=off; Query OK, 0 rows affected (0.001 sec) MySQL [test]> create table t01(id bigint not null primary key auto_increment, c1 varchar(50), c2 datetime not null default current_timestamp); Query OK, 0 rows affected (0.071 sec) MySQL [test]> desc t01; +-------+-------------+------+-----+-------------------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+-------------------+----------------+ | id | bigint(20) | NO | PRI | NULL | auto_increment | | c1 | varchar(50) | YES | | NULL | | | c2 | datetime | NO | | CURRENT_TIMESTAMP | | +-------+-------------+------+-----+-------------------+----------------+ 3 rows in set (0.011 sec)
注意:节点异常还是要尽快修复。方法二理论上还是有风险的。
附录:
- 3.1 查看 OceanBase 集群资源的使用情况
- 3.2 如何创建和连接 MySQL 租户
- 3.3 如何连接租户
- 3.4 如何对租户参数(或变量)进行设置
- 3.5 如何使用 MySQL 租户做常见数据库开发
- 3.6 如何使用 OceanBase 分区表进行水平拆分
- 3.7 (高级)如何使用 OceanBase 表分组
- 3.8(高级)如何使用 OceanBase 复制表
- 3.9 常见问题
结束语
加入教程直播群方式一:钉钉群号3255 4020
加入教程直播群方式二:扫码下方二维码加入