最近有个客户的oceanbase在操作业务租户的表做DDL时失败,开始是执行drop table长时间未成功 ,报错ora-600 internal error code, arguments – 4012, timeout. 后尝试重启租户失败,OCP状态显示一直处于“运维中”状态,下面简单记录该问题。
尝试通过OB OCP重启observer, 但是在stop zone环节 执行失败,日志提示
操作OCEANBASE失败,错误信息no memory or reach tenant memory limit
错误原因 连接sys 执行 alter system stop zone ? 失败, 错误信息 no meory or reach tenant memory limit
obclient(root@sys)[oceanbase]> select * from oceanbase.dba_ob_unit_configs where unit_config_id=1 \G
*************************** 1. row ***************************
UNIT_CONFIG_ID: 1
NAME: sys_unit_config
CREATE_TIME: 2025-07-01 20:37:40.658941
MODIFY_TIME: 2025-07-01 20:37:40.658941
MAX_CPU: 2
MIN_CPU: 2
MEMORY_SIZE: 5368709120
LOG_DISK_SIZE: 8589934592
MAX_IOPS: 9223372036854775807
MIN_IOPS: 9223372036854775807
IOPS_WEIGHT: 2
1 row in set (0.002 sec)
而且此时OCP 上的状态显示“运维中”,OCP 显示的【维护中】状态仅为 OCP METADB 中记录的租户状态,并非 OB 数据库本身的状态,租户实际上可以使用
原因
sys租户内存不足会影响DDL操作, 该环境使用的安装的默认配置,不符合生产库的最佳实践,
系统租户是 OceanBase 数据库的集群管理员为安装 OceanBase 数据库时自动创建。V4.2.1 版本前,系统租户实际可使用的内存上限为 sys_unit_config.memory_size。从 V4.2.1 版本开始,系统租户实际可使用的内存上限为:hidden_sys_memory + sys_unit_config.memory_size。
obclient(root@sys)[oceanbase]> select svr_ip,name,data_type,value,need_reboot,isdefault from __all_virtual_sys_parameter_stat where name in ('memory_limit','system_memory','__min_full_resource_pool_memory') order by 1,2;
+---------------+---------------------------------+-----------+------------+-------------+-----------+
| svr_ip | name | data_type | value | need_reboot | isdefault |
+---------------+---------------------------------+-----------+------------+-------------+-----------+
| 172.20.2x.213 | memory_limit | NULL | 0M | NULL | 1 |
| 172.20.2x.213 | system_memory | NULL | 0M | NULL | 1 |
| 172.20.2x.213 | __min_full_resource_pool_memory | NULL | 5368709120 | NULL | 1 |
| 172.20.2x.214 | memory_limit | NULL | 0M | NULL | 1 |
| 172.20.2x.214 | system_memory | NULL | 0M | NULL | 1 |
| 172.20.2x.214 | __min_full_resource_pool_memory | NULL | 5368709120 | NULL | 1 |
| 172.20.2x.215 | memory_limit | NULL | 0M | NULL | 1 |
| 172.20.2x.215 | system_memory | NULL | 0M | NULL | 1 |
| 172.20.2x.215 | __min_full_resource_pool_memory | NULL | 5368709120 | NULL | 1 |
+---------------+---------------------------------+-----------+------------+-------------+-----------+
9 rows in set (0.037 sec)
sys 租户和普通租户的重要组成部分略有不同:
- sys 租户上常见的 Cache 种类类别说明, 如schema_cache存放用户的 Schema 信息,用于提供 SQL 及系统正常运行所依赖的数据库对象的元信息。tablet_table_cache缓存 Tablet 中 schema version 和 table id 的对应关系。vtable_cache缓存 Table 的 Location 信息。等
OceanBase 数据库风险排查指南 中指出sys租户建议不要低于32g
解决方案
最佳实践建议 不要将 sys 租户内存设得太小
- 生产环境 sys 租户内存 ≥ 32GB(官方明确建议)。
- 避免在小于 64GB 内存的机器上部署生产集群,以防 sys 租户资源不足。
- 如需调整,通过
ALTER RESOURCE UNIT sys_unit_config修改,并在非高峰时段操作。
sys 租户也是一个普通租户,可通过 ALTER RESOURCE UNIT 动态调整其内存, 基于当前硬件资源和租户个数,先调整为20g.
alter resource unit sys_unit_config max_cpu 6, memory_size='20g';
— restart observer