OceanBase迁移表,相同的数据分区表占用的磁盘空间比非分区表多很多

【 使用环境 】测试环境
【 OB or 其他组件 】ob4.0-ce
【 使用版本 】ob4.0-ce
【问题描述】OceanBase迁移表,相同的数据分区表占用的磁盘空间比非分区表多很多
【复现路径】
使用oms迁移6张表,有2张1000多万的表,一张600多万的表,另外三张是100多万,迁移之前的磁盘占用情况:
select svr_ip,round(total_size/1024/1024/1024) total_size,round(free_size/1024/1024/1024) free_size,round((total_size-free_size)/1024/1024/1024) used_size from oceanbase.__all_virtual_disk_stat;


select /*+ parallel(30) / svr_ip, table_type, sum(size) / 1024 / 1024 / 1024 as size_G from __all_virtual_table_mgr where table_type > 0 group by 1,2 order by 3 desc;

select /
+ parallel(30) */ svr_ip, sum(original_size)/1024/1024/1024 as original_size_G, sum(occupy_size)/1024/1024/1024 as occupy_size_G from __all_virtual_tablet_sstable_macro_info group by 1 order by 2 desc;

(1)将这6张表迁移到OceanBase,非分区,合并转储完成后,磁盘占用情况:
select svr_ip,round(total_size/1024/1024/1024) total_size,round(free_size/1024/1024/1024) free_size,round((total_size-free_size)/1024/1024/1024) used_size from oceanbase.__all_virtual_disk_stat;


select /*+ parallel(30) / svr_ip, table_type, sum(size) / 1024 / 1024 / 1024 as size_G from __all_virtual_table_mgr where table_type > 0 group by 1,2 order by 3 desc;


select /
+ parallel(30) */ svr_ip, sum(original_size)/1024/1024/1024 as original_size_G, sum(occupy_size)/1024/1024/1024 as occupy_size_G from __all_virtual_tablet_sstable_macro_info group by 1 order by 2 desc;

(2)将这6张表迁移到OceanBase的分区表(根据order_id做100个hash分区,order_id是主键),合并转储完成后,磁盘占用情况:
select svr_ip,round(total_size/1024/1024/1024) total_size,round(free_size/1024/1024/1024) free_size,round((total_size-free_size)/1024/1024/1024) used_size from oceanbase.__all_virtual_disk_stat;


select /*+ parallel(30) / svr_ip, table_type, sum(size) / 1024 / 1024 / 1024 as size_G from __all_virtual_table_mgr where table_type > 0 group by 1,2 order by 3 desc;

select /
+ parallel(30) */ svr_ip, sum(original_size)/1024/1024/1024 as original_size_G, sum(occupy_size)/1024/1024/1024 as occupy_size_G from __all_virtual_tablet_sstable_macro_info group by 1 order by 2 desc;

可见,迁移到OceanBase非分区表,磁盘占用(64-60=)4G,但是将相同的表和数据迁移到OceanBase的分区表后,占用空间是(92-64)28G,为什么相同的表和数据分区和非分区占用的磁盘空间差距这么大?

【问题现象及影响】

【附件】

1 个赞

你的问题我们已经收到 会安排相关同学给你回复

请问下分区表和非分区表分别是在两个oceanbase集群吗

麻烦帮忙确认下:

  1. 数据是否迁移到两个不同的oceanbase集群
  2. 集群中是否除了6张表外,还有其他的表的存在。

ps:__all_virtual_disk_stat 和 __all_virtual_table_mgr 统计的是这个集群所有table的磁盘占用

是迁移到相同的集群中,有其他的表存在

理解了,能否帮忙执行下:select * from DBA_OB_ZONE_MAJOR_COMPACTION

麻烦再确认下当前磁盘使用:select svr_ip,round(total_size/1024/1024/1024) total_size,round(free_size/1024/1024/1024) free_size,round((total_size-free_size)/1024/1024/1024) used_size from oceanbase.__all_virtual_disk_stat;


之前是94G,现在减少了一些,变成87G了,不过占用还是挺多(87-64=)23G

看情况怀疑是中间数据比较大导致磁盘占用高,麻烦尝试执行一下:
select /*+ parallel(30) */ svr_ip, table_type, sum(size) / 1024 / 1024 / 1024 as size_G from __all_virtual_table_mgr where table_type > 0 group by 1,2 order by 3 desc; 查看type=12的数据有多少,如果比较大,麻烦再执行下 alter system major freeze tenant=all 做一次大合并


需要进行一次大合并么?

这段时间内有新增数据么,看着基线数据52比之前大47要大

有的,有oms同步这6张数据的增量,我现在停掉



现在101G了,感觉增量占用空间挺大的,mysql现在这6个表的ibd文件加起来才十几个G
感觉表分区后数据没有压缩,反而比mysql使用空间更大了

那看下停掉增量同步后,执行一个大合并,再看看__all_virtual_table_mgr这种表和__all_virtual_disk_stat统计的磁盘占用吧。不过看情况,因为还有memtable的数据需要合并,总体数据应该还会上升,现在的环境可能不太好区分两次迁移之后的磁盘增量。
现在你的问题是两次迁移的分区表和非分区表的数据增量不一样,如果有条件,可能要拉平了来看才比较直观:

  1. 迁移之前,创建两个空集群,一个导入分区表,另外一个导入到非分区表
  2. 两个集群分别做一次大合并,查看合并最后的磁盘占用。

如果确实分区表比非分区表的磁盘占用高,可能需要你那边提供table schema,我们内部复现看看了。

好的,我明天使用2个集群测试下,明天还使用这个帖子么?

就在这个帖子跟踪吧

嗯嗯,好的

今天用2个集群测试了,A集群这6张表是没有分区的,B集群的6张表使用order_id做了100个key分区,转储合并完成后磁盘使用情况是(只有这6张表,没有其他表):
集群A:


集群B:

没有分区的表占用5G,分区后占用16G

麻烦两个集群都查一下:select /*+ parallel(30) */ svr_ip, table_type, sum(size) / 1024 / 1024 / 1024 as size_G from __all_virtual_table_mgr group by 1,2 order by 3 desc;