容量估算:5亿数据要约占多少磁盘空间? 备份要多少空间?

【 使用环境 】生产环境 or 测试环境
【 OB or 其他组件 】
【 使用版本 】V4.3.5
【问题描述】有大佬估算过吗?容量估算:5亿数据要约占多少磁盘空间? 备份要多少空间?
【复现路径】问题出现前后相关操作
【附件及日志】推荐使用OceanBase敏捷诊断工具obdiag收集诊断信息,详情参见链接(右键跳转查看):

【SOP系列 22 】——故障诊断第一步(自助诊断和诊断信息收集)

【备注】基于 LLM 和开源文档 RAG 的论坛小助手已开放测试,在发帖时输入 [@论坛小助手] 即可召唤小助手,欢迎试用!

3 个赞

用户的问题是关于 OceanBase V4.3.5 在生产环境中存储 5 亿数据量所需的磁盘空间以及备份这些数据所需的磁盘空间。obdiag 工具主要用于日志采集和根因分析,对于估算数据存储和备份所需的空间并不是其主要功能。不过,我们可以基于一般的经验和 OceanBase 的特性给出一个大致的估算。

通常情况下,OceanBase 数据库中每条记录的实际占用空间取决于表结构设计(例如字段类型、是否使用了压缩等)、索引数量等因素。因此,无法直接给出一个确切的答案。为了更准确地评估磁盘空间需求,您可以参考以下步骤:

  1. 分析现有表结构,确定每条记录平均占用多少字节。
  2. 根据业务特点预估冗余度(如索引、历史版本保留策略等)。
  3. 考虑到 OceanBase 内置的数据压缩功能,实际物理存储可能会比原始大小小很多。
  4. 对于备份来说,增量备份会根据变化的数据量而定;全量备份则接近于当前数据库占用的空间总量。

建议您通过如下方式获取更精确的信息:

  • 使用 oceanbase.DBA_TAB_COLUMNS 等系统视图查询各列的数据类型及长度,结合业务逻辑计算单条记录大小。
  • 查看已有的统计信息或执行 ANALYZE TABLE 获取表级别的统计数据。
  • 参考官方文档了解有关压缩比的信息。

由于 obdiag 不适用于此类问题,所以这里不提供具体的 obdiag 命令。

为了能够更准确地帮助您,请提供以下信息:

  1. 表结构定义(包括字段类型、长度等信息)。
  2. 是否启用了压缩功能?如果启用了,请说明使用的压缩算法。
  3. 当前是否有现成的统计数据可以参考?
  4. 预计的索引数量和类型。
  5. 备份策略(例如:是做全量备份还是增量备份)。

附上敏捷诊断工具 obdiag 使用帮助链接

索引是分区索引, 压缩应该是OB内部的吧,备份可以采用 定期7天增量+1次全量的方式。全量后删掉增量的

我打算插入1千W数据,但是如何知道这个表的大小和占用的索引大小。以及备份的大小

2 个赞

根据您提供的信息,为了估算插入1千万条记录后表的大小、索引占用的空间以及备份所需的磁盘空间,您可以按照以下步骤操作:

1. 表结构定义与单行大小计算

首先需要明确表结构,包括字段类型及其长度。这有助于我们了解每条记录大致会占用多少字节。可以通过查询 oceanbase.DBA_TAB_COLUMNS 视图来获取这些信息。

SELECT 
    table_name, 
    column_name, 
    data_type, 
    char_length, 
    data_precision, 
    data_scale 
FROM 
    oceanbase.DBA_TAB_COLUMNS 
WHERE 
    table_name = 'YOUR_TABLE_NAME';

请将 'YOUR_TABLE_NAME' 替换为实际的表名。

2. 数据压缩情况确认

OceanBase 默认会对基线数据(SSTable)进行压缩以节省存储空间。如果不确定具体使用的压缩算法,可以查看建表语句中的 COMPRESSION 参数设置或者通过系统视图查询租户级别的默认压缩函数配置。

SHOW CREATE TABLE your_table_name;
-- 或者
SELECT value FROM oceanbase.__all_sys_parameter WHERE name='default_compress_func';

对于 V4.3.x 版本,默认压缩算法为 zstd_1.3.8。不同的压缩算法会影响最终的数据压缩比,请参考官方文档选择合适的压缩方式。

3. 索引大小评估

由于您提到使用了分区索引,那么除了主键索引外,还需要考虑额外创建的索引所占用的空间。通常情况下,索引的大小取决于索引列的数量及类型。对于分区索引而言,其大小还会受到分区键的影响。可以通过如下 SQL 查询现有索引的信息:

SELECT 
    index_name, 
    partitioned, 
    partitioning_type 
FROM 
    oceanbase.DBA_INDEXES 
WHERE 
    table_name = 'YOUR_TABLE_NAME';

同样地,请将 'YOUR_TABLE_NAME' 替换为实际的表名。

4. 插入测试并收集统计信息

在生产环境之外的安全环境中,尝试插入少量具有代表性的数据(例如1万条),然后执行 ANALYZE TABLE 来更新表的统计信息。之后可以通过 information_schema.TABLES 或者 oceanbase.DBA_TABLES 查看表的实际占用空间。

INSERT INTO your_table (...) VALUES (...); -- 插入一些测试数据
ANALYZE TABLE your_table_name COMPUTE STATISTICS;

SELECT 
    table_name, 
    round(data_length/1024/1024, 2) AS data_mb,
    round(index_length/1024/1024, 2) AS index_mb,
    round((data_length + index_length)/1024/1024, 2) AS total_mb
FROM 
    information_schema.TABLES 
WHERE 
    table_name = 'your_table_name';

这一步骤可以帮助您获得更准确的单条记录平均占用空间以及索引大小。

5. 备份策略下的空间需求

对于定期7天增量+1次全量的备份策略,在完成一次全量备份之后,接下来七天内的增量备份只会包含发生变化的数据部分。因此,首次全量备份时所需的空间接近于当前数据库中所有数据的总和;而后续每天的增量备份则取决于每日新增或修改的数据量。

  • 全量备份:大约等于整个数据库的数据总量。
  • 增量备份:取决于每日新增或修改的数据量,通常远小于全量备份。

当执行新的全量备份后,旧的增量备份文件可以根据您的管理策略被删除,从而释放相应的磁盘空间。

综上所述,为了得到更加精确的结果,请先按照上述方法收集必要的信息,并基于此做出合理的估算。如果您能提供更多关于表结构的具体细节,我也可以进一步帮助您进行更详细的分析。

详情请参考:

  1. 监控索引
  2. 数据压缩概述
  3. 体验并行导入和数据压缩
  4. 集群管理 FAQ
  5. 通用语法
  6. 向量索引
  7. 表压缩
  8. 合并管理概述
  9. 备份架构
  10. 产品 FAQ

(小助手的答复已结束,如未能解决您的问题,请继续提问并等待其他同学的回复,谢谢!)

1 个赞

这个可以查看表的磁盘占用量 估算差不多90g吧
SELECT sum(size)/1024/1024/1024 FROM (SELECT DATABASE_NAME,TABLE_NAME,TABLE_ID,PARTITION_NAME,TABLET_ID,ROLE
FROM oceanbase.DBA_OB_TABLE_LOCATIONS ) AA full join
(SELECT distinct(TABLET_ID) ,size
FROM oceanbase.GV$OB_SSTABLES ) BB on AA.TABLET_ID=BB.TABLET_ID
WHERE AA.role=‘leader’ and AA.table_name=’${表名}’;

2 个赞

好的。5亿数据只有100G这么小吗?
oracle的话 数据+索引 基本要在 1.5T - 2T之间

1 个赞

不好估算的,跟表的字段数、是否包含lob字段等都有关系。。如果要对比oracle,那影响oracle磁盘空间的因素就更多了。建议可以把数据搞到OB中染后用上面的SQL查下占用大小,不过可以肯定OB的压缩比至少都是数倍以上。
OB的物理备份跟数据库实际占用空间一致。

1 个赞

没有blob。 字段主要是整形和字符串。 到时候测试下 。

1 个赞

主要和字段的数量 行长 是否有大字段类型等 这个只是按照一般的估算 不算索引 只是数据 还是按照查询的表的磁盘为准

我们有个表155亿,1.7T。

另外一个表197亿,才606G
image

2 个赞

这看你的截图是606g 不可能是6.6g 绝对不可能

写错了,哈哈。。0

这压缩率很夸张啊,索引占用多少知道吗?,,不知道你一条记录多大的空间, 我们单条记录一般也就不到10KB吧。不知道模拟几千万或者1亿后会是多少。

mysql我之前找过很多表分析过,一般就一条数据就0.5k-1k,有大字段的会到1.5k。10k的少啊