如何修改 OceanBase 数据库的合并方式

本文主要介绍如何修改 OceanBase 数据库的合并方式。

您可以通过表级属性

progressive_merge_num

来控制合并行为,也可以通过

default_progressive_merge_num

配置项来设置新建一张表时默认的渐进合并次数。

当您未对新建表指定

progressive_merge_num

属性时,系统会将表级属性

progressive_merge_num

的值设置为

default_progressive_merge_num

的值。

progressive_merge_num

属性的取值含义如下:

  • 0 :表示执行渐进合并,且渐进合并的次数为 100。
  • 1:表示强制执行全量合并,不执行渐进合并。
  • 大于 1 :表示发生 Schema 变更时按照指定轮次做渐进合并。

适用版本

OceanBase 数据库所有版本

全量合并

在全量合并过程中,会把当前的静态数据都读取出来,和内存中的动态数据合并后,再写到磁盘上去作为新的静态数据。

可以将表属性

progressive_merge_num

设置为

1

,表示将合并方式修改为全量合并。

obclient> ALTER TABLE $table SET progressive_merge_num=1;

增量合并

增量合并是相对于全量合并而言的概念,大多数情况下,当需要进行合并时并不是所有的宏块都需要被修改,当一个宏块没有增量修改时,可以直接重用它,而不是重写它,这种方式称之为增量合并。相对于全量合并的把所有的宏块的重写一遍而言,增量合并只重写发生了修改的宏块。

将表属性

progressive_merge_num

修改为

0

时,表示将合并方式设置为增量合并。

obclient> ALTER TABLE $table SET progressive_merge_num=0;

渐进合并

渐进合并是全量合并的一种实现方式。在一次合并过程中完成对所有数据的重写,对存储空间和合并时间都会是一个比较大的考验。为了解决这个问题,OceanBase 数据库引入了渐进合并,即把数据重写分散到多次合并中去做。假设把渐进轮次设置为

60

,那么一次合并就只会重写六十分之一的数据,在六十轮合并过后,数据就被整体重写了一遍。渐进合并减轻了 DBA 做 DDL 操作的负担,同时也使得 DDL 变得更加平滑。

将表属性

progressive_merge_num

设置为大于

1

的值时,表示将合并方式修改为渐进合并,并且每次合并

1/num

的数据。

obclient> ALTER TABLE $table SET progressive_merge_num=$num;