# 常见问题

## 租户创建或扩容提示机器资源不足

+ 现象

在创建资源池的时候，或者在调整资源池资源规格的时候，碰到报错信息如下：

```sql
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：

```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
;
```

注意这个结果都是四舍五入的，会对结果有一点影响。保持所有资源的分配不要有小数点，则这个结果就准确了。

## 建表提示机器资源不足

+ 现象

普通的建表语句，忽然报错提示机器资源不足。

```sql
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`

```sql
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` ，允许节点掉线情况下建表能成功。

```sql
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)

```

注意：节点异常还是要尽快修复。方法二理论上还是有风险的。
