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

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

🍎 数据库版本: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)的大小:
bash 复制代码
du -sh /data/1/${cluster_name}/sstable/block_file
  • 查看当前节点上OB事务日志文件(clog)的大小:
bash 复制代码
du -sh /data/log1/${cluster_name}/clog
  • 查看当前节点上OB系统日志文件(syslog)的大小:
bash 复制代码
du -sh /home/admin/oceanbase/log
#du -sh /oceanbase/log

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

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

sql 复制代码
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节点上数据文件使用情况:

sql 复制代码
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节点上数据文件和日志文件空间使用情况:

sql 复制代码
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):

sql 复制代码
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租户,查询业务租户在某个节点上的磁盘空间:

sql 复制代码
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租户,查询各个租户在所有节点合计占用存储空间的详细情况:

sql 复制代码
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语法查看数据量:

sql 复制代码
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租户的数据量。

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

sql 复制代码
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租户,查询指定租户下所有数据库的大小:

sql 复制代码
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语法查看数据量:

sql 复制代码
select
  ROUND(SUM(BYTES) / 1024 / 1024 / 1024, 2) AS "SIZE(GB)"
FROM sys.DBA_SEGMENTS;

表大小统计

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

sql 复制代码
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租户,查询所有租户下的表和索引的大小:

sql 复制代码
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的语法:

sql 复制代码
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

相关推荐
pan3035074795 小时前
mysql 回表查询(二次查询,如何检查,如何规避)
数据库·mysql
Michaelwubo5 小时前
elasticsearch-7.17.29 集群案例,k8s方式和原始方式
数据库
TDengine (老段)6 小时前
TDengine 选择函数 Last() 用户手册
大数据·数据库·sql·物联网·时序数据库·tdengine·涛思数据
little_xianzhong6 小时前
关于对逾期提醒的定时任务~改进完善
java·数据库·spring boot·spring·mybatis
Sally璐璐6 小时前
Go正则表达式实战指南
数据库·mysql·golang
小猪咪piggy6 小时前
【JavaEE】(23) 综合练习--博客系统
java·数据库·java-ee
bikong76 小时前
一种高效绘制余晖波形的方法Qt/C++
数据库·c++·qt
一叶飘零_sweeeet6 小时前
从 0 到 1 攻克订单表分表分库:亿级流量下的数据库架构实战指南
java·数据库·mysql·数据库架构·分库分表
xianyinsuifeng6 小时前
Oracle 10g → Oracle 19c 升级后问题解决方案(Pro*C 项目)
c语言·数据库·oracle