---
title: 如何规划租户资源的容量？ -OceanBase数据库使用指南
description: 了解OceanBase数据库在实际应用中关于如何规划租户资源的容量？ 相关的常见问题和使用技巧，帮助您快速解决如何规划租户资源的容量？ 的难题。
---
切换语言

- 简体中文
- English

划线反馈

# 如何规划租户资源的容量？

更新时间：2023-11-16 04:26

适用版本： V2.1.x、V2.2.x、V3.1.x、V3.2.x 内容类型：How-to  

本文介绍合理规划租户资源容量的方法。

## OceanBase 侧的容量界定方法

OceanBase 数据库主要提供 CPU、Memory 和 Storage 等资源。租户容量资源通过在 OCP 界面上创建租户时，指定 Unit 规格和 Unit 数据来设定。

Unit 规格和 Unit 数据说明如下：

- Unit 规格指在单 Zone 的单 Server 的可分配资源总量，并不是指集群所有 Server 资源总量。
 - Unit 数量指一个租户可使用的资源（专有名词：资源池）可以包含多个资源单元。每个单元会根据当前集群负载，自动在每个 Zone 中选择一个 Server 负载，但同一个资源池的多个单元不能分配到同一个 Server，即一个资源池包含的单元个数不能超过单 Zone 内 Server 的个数。

  只有当租户在某个 Server 上有资源单元时，租户才能使用该 Server 存储数据。并且租户数据在同 Zone 的多个 Server 间，能够进一步负载均衡。

该租户被分配的所有资源总量为：Unit 规格*Unit 数量，类比 Oracle 侧，例如 4 Node RAC 上，4 个节点的资源总和。

该租户在连接运行时，可用的资源总量为：1 个 Unit 规格所定义的资源。类比于 Oracle 侧，例如 4 Node RAC 上，在 1 个节点的资源总和。

例如，在 3:3:3 集群部署方式下，某租户的资源池有 2 个单元，则每个 Zone 都会有 2 个 Server 负载 1 份数据，共有 6 个 Server 负载这三份数据。

该租户的数据只能在这 6 个 Server 上存储，在同 Zone 的 2 个 Server 间能够负载均衡。如果共用同一个集群的租户数量较多，每个资源池只能包含一个资源单元，因为此时单元总数已经比较多，能够做到比较好的负载均衡。

根据上图的资源分布情况，该租户在整个集群中需要的资源如下：

- 共需要 CPU=12 C（4*3），Memory=24 GB（8 GB*3）。
 - 共有 3 个 Zone，所以是 3 个副本。
 - 每个副本，在单个 Server 上被分配的资源是 CPU=4 C，Memory=8 GB。

从 Oracle 迁移数据至 OceanBase 数据库的过程中，建议 OceanBase 数据库资源的初始分配策略（即 Unit 规格）为 `[(Oracle_CPU_AAS * C /60%)]*K`。说明如下：

- Oracle_CPU_AAS 为 Oracle 侧的 CPU_AAS Per Instance（用尽了几个 CPU）。
 - C 为两侧的 CPU 主频比。
 - 60% 为保持 OBServer 侧单 CPU 的运行态 Max CPU PCT。
 - K 为根据业务特性需要的倍增系数。

## 脚本检查 Oracle 侧的资源使用情况

使用脚本收集 Oracle 侧的使用情况。Oracle 的容量规划，是一整套的方法和流程。但是目前在迁移过程中，您只需要检查以下容量相关的信息即可：

- CPU/Memory/Storage，以下的 Memory/CPU 指单节点。
 - CPU 的使用情况。
 - 占用用户存储的大小。
 - 分区数。

![1](https://help-static-aliyun-doc.aliyuncs.com/assets/img/zh-CN/5980695161/p237673.png)

## 脚本检查 OceanBase 侧资源的使用情况

使用 root 用户登录 sys 租户（`root/sys`）执行下述 SQL 脚本，您需要替换租户的名称。

#### 说明

`you can not expand this SQL by adding the "__all_database" and run under root/sys`，这是因为 `__all_database` 只是反映当前租户下的用户信息，所以下述脚本必须​在 `root/sys` 下执行。

```javascript
查询租户的资源池、资源单元配置名称、资源单元配置
obclient>SELECT c.tenant_id, e.tenant_name, concat(c.name, ': ', d.name) `pool:conf`,
concat(c.unit_count, ' unit: ', d.min_cpu, 'C/', ROUND(d.min_memory/1024/1024/1024,0), "G") unit_info
FROM __all_resource_pool c, __all_unit_config d, __all_tenant e
WHERE c.unit_config_id=d.unit_config_id AND c.tenant_id=e.tenant_id AND c.tenant_id>1000
AND e.tenant_name='CIS2271'
ORDER BY c.tenant_id;

检查租户已使用的存储
obclient>SELECT e.tenant_name,a.svr_ip,round(sum(a.required_size)/1024/1024/1024,0)  required_GB,sum(row_count)  AS  rows  
FROM  __all_virtual_meta_table  a
INNER JOIN __all_virtual_table  b ON a.table_id=b.table_id
INNER JOIN __all_virtual_database c ON b.database_id=c.database_id
INNER JOIN __all_tenant e ON b.tenant_id=e.tenant_id
WHERE e.tenant_name='CIS2271'
GROUP BY a.tenant_id,a.svr_ip
ORDER BY a.tenant_id,a.svr_ip;

检查租户的 Partition 总数
obclient>SELECT zone,svr_ip,tenant_name,count(1) cnt
FROM __all_virtual_meta_table a , __all_tenant b
WHERE a.tenant_id=b.tenant_id and b.tenant_name ='CIS2271'
GROUP BY zone,svr_ip,tenant_name ORDER BY zone,svr_ip,tenant_name desc;

检查集群的所有资源

磁盘空间实时统计
obclient>SELECT /*+READ_CONSISTENCY(WEAK), QUERY_TIMEOUT(100000000)*/ \
  b.zone,a.svr_ip, \
  round(total_size/1024/1024/1024, 2) total_G, \
  round((total_size - free_size) /1024/1024/1024, 2) used_G, \
  round(free_size/1024/1024/1024, 2) free_G, \
  concat(round((total_size - free_size) / total_size * 100, 2), '%') used_percent \
FROM __all_virtual_disk_stat a, __all_server b
WHERE a.svr_ip = b.svr_ip  ORDER BY b.zone,svr_ip;

所有可用的 CPU 和 Memory 情况
obclient>SELECT b.zone,a.svr_ip, a.cpu_total, a.cpu_assigned, a.cpu_assigned_percent, a.mem_total/1024/1024/1024 AS mem_total,
a.mem_assigned/1024/1024/1024 AS mem_assigned, (a.mem_total-a.mem_assigned)/1024/1024/1024 AS mem_free, a.mem_assigned_percent
From __all_virtual_server_stat a,__all_server b WHERE a.svr_ip = b.svr_ip  ORDER BY zone,cpu_assigned_percent desc;

```

您也可以直接在租户下，使用 `dba_segments.bytes` 检查。

```unknow
obclient>SELECT owner,segment_type,round(sum(bytes/power(1024,2))) size_MB

FROM dba_segments
GROUP BY owner,segment_type order by owner,segment_type;

```

**对比存储使用量的示例：**

| 数据库 | 公共库 | 物流库 |
| --- | --- | --- |
| Oracle 数据库 | 300 GB | 300 MB |
| OceanBase 数据库 | 23 GB | 115 MB |

检查方法如下：

- Oracle：通过 dba_segments 查询除 index 外，需要迁移的 data 数。
 - OceanBase 数据库：在租户的 sys 下，使用 dba_segments 查询。

Previous

[使用 OCP 创建备租户报 Incorrect arguments to get primary connection](https://www.oceanbase.com/knowledge-base/oceanbase-database-1000000003340855)

Next

[如何计算 SYS 租户的资源规格](https://www.oceanbase.com/knowledge-base/oceanbase-database-1000000000210115) ![有帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*y6ocSqN8cqsAAAAAAAAAAAAAARQnAQ)![无帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*BG9IQJyLHF8AAAAAAAAAAAAAARQnAQ)![反馈](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*eTWdQKCRKHwAAAAAAAAAAAAAARQnAQ)[AI](https://www.oceanbase.com/obi) 咨询热线
