OceanBase容量统计:租户、数据库、表大小

发布于:2025-09-07 ⋅ 阅读:(21) ⋅ 点赞:(0)

🍎 数据库版本:OceanBase V4

相关视图

🐘 以下视图从V4.0.0版本开始引入:

  • oceanbase.DBA_OB_TABLET_REPLICAS
  • oceanbase.CDB_OB_TABLE_LOCATIONS
  • oceanbase.CDB_OB_TABLET_REPLICAS

🐘 以下视图从V4.3.4版本开始引入:

  • oceanbase.CDB_OB_TABLE_SPACE_USAGE
  • oceanbase.CDB_OB_SPACE_USAGE
  • oceanbase.CDB_OB_SERVER_SPACE_USAGE

节点磁盘空间

  • 查看当前节点上OB数据文件(block_file)的大小:
du -sh /data/1/${cluster_name}/sstable/block_file
  • 查看当前节点上OB事务日志文件(clog)的大小:
du -sh /data/log1/${cluster_name}/clog
  • 查看当前节点上OB系统日志文件(syslog)的大小:
du -sh /home/admin/oceanbase/log
#du -sh /oceanbase/log

:如果安装数据库时自定义了安装路径,上面的数据文件和日志文件的路径可能不一样。

登录SYS租户,检查数据文件和日志文件相关的容量配置参数:

select svr_ip,tenant_id,scope,section,name,value,edit_level,default_value  
from oceanbase.gv$ob_parameters where name in  
('datafile_disk_percentage','datafile_size','datafile_next','datafile_maxsize',
'log_disk_percentage','log_disk_size',
'syslog_disk_size','max_syslog_file_count',
'data_disk_usage_limit_percentage');

+-------------+-----------+---------+------------+----------------------------------+-------+-------------------+---------------+
| svr_ip      | tenant_id | scope   | section    | name                             | value | edit_level        | default_value |
+-------------+-----------+---------+------------+----------------------------------+-------+-------------------+---------------+
| xx.yy.zz.aa |      NULL | CLUSTER | OBSERVER   | data_disk_usage_limit_percentage | 95    | DYNAMIC_EFFECTIVE | 90            |
| xx.yy.zz.aa |      NULL | CLUSTER | LOGSERVICE | log_disk_percentage              | 0     | DYNAMIC_EFFECTIVE | 0             |
| xx.yy.zz.aa |      NULL | CLUSTER | LOGSERVICE | log_disk_size                    | 452G  | DYNAMIC_EFFECTIVE | 0M            |
| xx.yy.zz.aa |      NULL | CLUSTER | OBSERVER   | syslog_disk_size                 | 0M    | DYNAMIC_EFFECTIVE | 0M            |
| xx.yy.zz.aa |      NULL | CLUSTER | OBSERVER   | max_syslog_file_count            | 80    | DYNAMIC_EFFECTIVE | 0             |
| xx.yy.zz.aa |      NULL | CLUSTER | SSTABLE    | datafile_disk_percentage         | 0     | DYNAMIC_EFFECTIVE | 0             |
| xx.yy.zz.aa |      NULL | CLUSTER | SSTABLE    | datafile_maxsize                 | 1024T | DYNAMIC_EFFECTIVE | 0             |
| xx.yy.zz.aa |      NULL | CLUSTER | SSTABLE    | datafile_next                    | 10G   | DYNAMIC_EFFECTIVE | 0             |
| xx.yy.zz.aa |      NULL | CLUSTER | SSTABLE    | datafile_size                    | 200G  | DYNAMIC_EFFECTIVE | 0M            |
+-------------+-----------+---------+------------+----------------------------------+-------+-------------------+---------------+

其中:

  • 数据文件空间大小由datafile_disk_percentagedatafile_maxsize共同决定。
  • 事务日志文件空间大小由log_disk_percentagelog_disk_size共同决定。
  • 系统日志文件空间大小由syslog_disk_sizemax_syslog_file_count共同决定。

数据文件和日志文件

登录SYS租户,查看各observer节点上数据文件使用情况:

SELECT
  svr_ip,
  svr_port,
  round(total_size/1024/1024/1024, 2) AS total_size_GB,
  round(free_size/1024/1024/1024, 2) AS free_size_GB,
  round(used_size/1024/1024/1024, 2) AS used_size_GB
FROM oceanbase.__all_virtual_disk_stat;

其中:

  • total_size:数据文件的总大小。对应/data/1/${cluster_name}/sstable/block_file
  • used_size:已使用的数据文件大小。
  • free_size:数据文件的剩余可用空间。

⚠️ :数据文件和事务日志文件共用一块磁盘或一个LVM挂载点时,total_size的值可能不准。

登录SYS租户,查看各observer节点上数据文件和日志文件空间使用情况:

select svr_ip,
round(LOG_DISK_CAPACITY/1024/1024/1024, 2) AS log_total_gb,
round(LOG_DISK_ASSIGNED/1024/1024/1024, 2) AS log_asgn_gb,
round(LOG_DISK_IN_USE/1024/1024/1024, 2) AS log_used_gb,
round(DATA_DISK_CAPACITY/1024/1024/1024, 2) AS data_total_gb,
round(DATA_DISK_ASSIGNED/1024/1024/1024, 2) AS data_asgn_gb,
round(DATA_DISK_IN_USE/1024/1024/1024, 2) AS data_used_gb,
round(DATA_DISK_ALLOCATED/1024/1024/1024, 2) AS data_alloc_gb
from GV$OB_SERVERS;

其中:

  • LOG_DISK_CAPACITY:事务日志盘空间总大小。对应/data/log1/${cluster_name}/clog

  • LOG_DISK_ASSIGNED:日志盘已分配大小,它是OBServer节点上所有Unit的LOG_DISK_SIZE总和。

  • LOG_DISK_IN_USE:日志盘已使用大小,单位为字节。

  • DATA_DISK_CAPACITY

    • 共享存储(Shared-Storage)模式下,表示OBServer节点上本地缓存空间的总大小,它是OBServer节点上所有Unit的DATA_DISK_SIZE规格之和的上限,单位为字节。
    • 无共享(Shared-Nothing)模式下,表示OBServer节点上数据盘空间总大小,单位为字节。
  • DATA_DISK_ASSIGNED:V4.3.3版本引入。

    • 共享存储(Shared-Storage)模式下,表示OBServer节点已分配给Unit的本地缓存大小,它是OBServer节点上所有Unit的DATA_DISK_SIZE规格的总和,单位为字节。
    • 无共享(Shared-Nothing)模式下,该字段值为NULL,表示未定义,允许竞争使用其他租户的磁盘空间。
  • DATA_DISK_IN_USE

    • 共享存储(Shared-Storage)模式下,表示OBServer节点已使用的本地缓存大小,它是OBServer节点上所有Unit的DATA_DISK_IN_USE之和,单位为字节。
    • 无共享(Shared-Nothing)模式下,表示OBServer节点已使用的数据盘大小,单位为字节。
  • DATA_DISK_ALLOCATED:OBServer已分配的数据盘大小,单位为字节。对应/data/1/${cluster_name}/sstable/block_file

⚠️ :数据文件和事务日志文件共用一块磁盘或一个LVM挂载点时,DATA_DISK_CAPACITY的值可能不准。

租户大小统计

登录SYS租户,查看指定租户的数据量(例如tenant_d=1002):

select
  svr_ip,
  svr_port,
  round(sum(data_size)/1024/1024/1024, 2) as data_size_gb,
  round(sum(required_size)/1024/1024/1024, 2) as required_size_gb
from oceanbase.CDB_OB_TABLET_REPLICAS
where TENANT_ID = 1002
group by svr_ip,svr_port;

登录SYS租户,查询业务租户在某个节点上的磁盘空间:

select tenant_id,tenant_name,server_ip,space_type,
round(data_bytes/1024/1024/1024, 2) as data_size_gb,
round(usage_bytes/1024/1024/1024, 2) as used_size_gb
from oceanbase.CDB_OB_SERVER_SPACE_USAGE
where TENANT_ID = 1002;

其中:

  • data_bytes:数据大小。
  • usage_bytes:数据实际占用的磁盘空间大小。
  • space_type字段的值有以下分类:
    • Tmp Data:临时文件大小。
    • Clog Data:事务日志大小。路径一般为/data/log1/${cluster_name}/clog/
    • Meta Data:元数据大小,包含sstable meta、tablet_meta。
    • Slog Data:Slog日志大小。路径一般为/data/1/${cluster_name}/slog/
    • Index Data:索引数据大小,即USER_INDEX。
    • Table Data:用户表数据大小,包含所有USER_TABLE、LOB_PIECE、LOB_META。

登录SYS租户,查询各个租户在所有节点合计占用存储空间的详细情况:

select tenant_id,tenant_name,space_type,
round(usage_bytes/1024/1024/1024, 2) as used_size_gb
from oceanbase.CDB_OB_SPACE_USAGE
where tenant_id = 1002;

其中space_type字段的值有以下分类:

  • Local Data:本地部署模式下的所有宏块。
    • 共享存储(Shared-Storage)模式下,包括租户所有副本节点的私有数据、所有元数据、所有临时文件;
    • 无共享(Shared-Nothing)模式下,包括租户所有副本节点的所有数据、所有元数据、所有临时文件。
  • clog Data:本地部署模式下的clog。
    • 共享存储(Shared-Storage)模式下,包括租户所有副本节点的私有clog;
    • 无共享(Shared-Nothing)模式下,包括租户所有副本节点的所有clog。
  • Shared Data:租户共享的多版本基线,仅适用于SS模式;SN模式下,该字段值恒为0,表示未共享数据。
  • PRIVATE:多副本多版本总和、临时文件。

Oracle业务租户下,也支持Oracle语法查看数据量:

select
  ROUND(SUM(BYTES) / 1024 / 1024 / 1024, 2) AS "SIZE(GB)"
FROM sys.DBA_SEGMENTS;

如果是MySQL模式的租户,无法和原生MySQL一样使用information_schema.tables进行统计。可以通过视图DBA_OB_TABLET_REPLICAS查看MySQL租户的数据量。

查看本租户的所有表数据量汇总:

select
  svr_ip,
  svr_port,
  round(sum(data_size)/1024/1024/1024, 2) as data_size_gb,
  round(sum(required_size)/1024/1024/1024, 2) as required_size_gb
from oceanbase.DBA_OB_TABLET_REPLICAS
group by svr_ip,svr_port;

Database大小统计

登录SYS租户,查询指定租户下所有数据库的大小:

select tenant_id,tenant_name,database_name,
round(sum(occupy_size)/1024/1024/1024, 2) AS occupy_gb,
round(sum(required_size)/1024/1024/1024, 2) AS required_gb
from oceanbase.CDB_OB_TABLE_SPACE_USAGE
group by tenant_id,tenant_name,database_name
having tenant_id=1002;

其中:

  • occupy_size:表压缩后落盘的数据量,单位为字节。
  • required_size:表压缩后落盘的数据量实际占用了多少磁盘空间,单位为字节。

Oracle业务租户下,也支持Oracle语法查看数据量:

select
  ROUND(SUM(BYTES) / 1024 / 1024 / 1024, 2) AS "SIZE(GB)"
FROM sys.DBA_SEGMENTS;

表大小统计

登录SYS租户,查询业务表的大小(将表和索引分别进行统计):

select 
  y.SVR_IP,y.DATABASE_NAME,
  case when y.TABLE_TYPE = 'INDEX' then '' else y.TABLE_NAME end as TABLE_NAME,
  y.TABLE_TYPE,
  sum(y.DATA_SIZE) AS "DATA_SIZE(MB)",
  sum(y.REQUIRED_SIZE) AS "REQUIRED_SIZE(MB)"
from (
  select a.TENANT_ID,a.SVR_IP,a.TABLET_ID,b.table_id,b.DATABASE_NAME,
  b.TABLE_NAME,b.TABLE_TYPE,ROUND(a.data_size/1024/1024,2) AS "DATA_SIZE",
  ROUND(a.required_size/1024/1024,2) AS "REQUIRED_SIZE" 
  from oceanbase.CDB_OB_TABLET_REPLICAS a 
  join oceanbase.CDB_OB_TABLE_LOCATIONS b 
  on a.TABLET_ID=b.TABLET_ID and a.svr_ip=b.svr_ip and a.tenant_id=b.tenant_id 
  where 
    a.TENANT_ID=1002 
    and b.DATABASE_NAME='UOT'
   and ( b.TABLE_NAME='OT_TSHOWCONFIG_BAKSQL'
        or b.DATA_TABLE_ID in (
	  select table_id from oceanbase.CDB_OB_TABLE_LOCATIONS 
	  where TENANT_ID=1002 and TABLE_NAME='OT_TSHOWCONFIG_BAKSQL')
       )order by b.table_id
     ) y
group by y.SVR_IP,y.DATABASE_NAME,y.TABLE_TYPE
order by y.SVR_IP,y.DATABASE_NAME asc,TABLE_NAME desc;   

⭐️ 该方法同时适用于Oracle租户和MySQL租户。查询时需要指定TENANT_IDDATABASE_NAMETABLE_NAME。业务表在Oracle租户中时,DATABASE_NAME对应为用户SCHEMA。

登录SYS租户,查询所有租户下的表和索引的大小:

select tenant_id,tenant_name,database_name,table_name,
round(occupy_size/1024/1024, 2) AS occupy_mb,
round(required_size/1024/1024, 2) AS required_mb
from oceanbase.CDB_OB_TABLE_SPACE_USAGE
where tenant_id=1002
and database_name='knowledge_base';

其中:

  • occupy_size:表压缩后落盘的数据量,单位为字节。
  • required_size:表压缩后落盘的数据量实际占用了多少磁盘空间,单位为字节。

Oracle业务租户下查询表大小也支持Oracle的语法:

select
  owner,
  SEGMENT_NAME,
  ROUND(BYTES/1024/1024, 2) AS "SIZE(M)"
FROM DBA_SEGMENTS
where
  SEGMENT_NAME = 'OT_TSHOWCONFIG_BAKSQL'
  and OWNER = 'UOT';

References
【1】一文搞定 OceanBase 各级别数据量统计:https://open.oceanbase.com/blog/16018455643
【2】OB 4.x 版本如何查询磁盘空间占用情况?https://open.oceanbase.com/blog/20224546128
【3】https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000002013533
【4】https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000003380698
【5】https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000003380316


网站公告

今日签到

点亮在社区的每一天
去签到