【 使用环境 】生产环境 or 测试环境
【 OB or 其他组件 】
【 使用版本 】
【问题描述】清晰明确描述问题
【复现路径】问题出现前后相关操作
【附件及日志】推荐使用OceanBase敏捷诊断工具obdiag收集诊断信息,详情参见链接(右键跳转查看):
合并有4中方式:全量 ,增量,合并
default_progressive_merge_num = 0 就代表着增量合并吗 ???
OceanBase 数据库支持对表数据进行渐进合并,即在对表执行需要重写数据的 DDL 操作后,可以将表数据的重写分散到多次合并中,一次合并中只进行部分数据的重写。您可以通过表级属性 progressive_merge_num
来控制合并行为,也可以通过 default_progressive_merge_num
配置项来设置新建一张表时默认的渐进合并次数。
当您未对新建表指定 progressive_merge_num
属性时,系统会将表级属性 progressive_merge_num
的值设置为 default_progressive_merge_num
的值。
progressive_merge_num
属性的取值含义如下:
- progressive num = 0 时,表示使用默认值 100。
- progressive num = 1 时,表示强制执行全量合并,不执行渐进合并。
- progressive num = X 时,表示 X 轮合并重写完全部数据,每轮合并重写 1/X。
https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000220391
默认就是代表增量合并
- progressive num = 0 时,表示使用默认值 100。100次重写完所有数据
好像只能通过这个参数判断。没看到专门的参数
当默认值等于 0 , 代表默认值 100 就是 增量合并, 100次完成增量合并。
那和渐进合并有什么区别呢 ?? 最大区别在哪里 ?
根据文档库中的信息,我将为您详细解答关于 default_progressive_merge_num
参数值以及不同合并方式的区别。
1. 关于 default_progressive_merge_num = 0
的含义
-
默认值解释:当
default_progressive_merge_num
设置为 0 时,表示使用默认值 100。这意味着在表模式发生变化(如增加列、修改压缩算法)时,系统会进行渐进合并,并且默认情况下会进行 100 轮合并,每轮合并重写 1/100 的数据。 -
是否代表增量合并:
default_progressive_merge_num = 0
并不直接代表增量合并。它实际上是指渐进合并的默认行为,即通过多次小规模的合并来完成整个表的重写。而增量合并是指只合并被修改过的宏块,没有改变的宏块进行复用。
2. 如何确认当前使用的合并方式
要确认当前使用的合并方式,可以通过以下几种方法:
-
查看配置项:
- 使用 SQL 查询当前租户的配置项:
SHOW PARAMETERS LIKE 'default_progressive_merge_num';
- 查看表级别的
progressive_merge_num
属性:SHOW TABLE STATUS LIKE 'your_table_name';
- 使用 SQL 查询当前租户的配置项:
-
监控日志和统计信息:
- 通过 OCP 或者 OBProxy 等工具查看合并任务的日志和统计信息,了解具体的合并行为。
3. 渐进合并与增量合并的区别
-
渐进合并:
- 定义:每次全量合并一部分,若干轮次后整体数据被重写一遍。目的是控制单次合并的时间,避免一次性合并大量数据对系统性能的影响。
- 适用场景:主要用于表模式发生变化(如增加列、修改压缩算法)时,需要更新所有行的情况。
-
增量合并:
- 定义:仅仅合并被修改过的宏块,没有改变的宏块进行复用。极大地减少了合并的工作量,是 OceanBase 数据库目前默认的合并算法。
- 适用场景:适用于日常的数据维护,减少不必要的 IO 和 CPU 开销。
4. 总结
-
最大区别:
- 渐进合并 是一种分阶段完成全量合并的方式,通过多轮次逐步完成数据重写,适用于表结构变化等需要重写所有数据的场景。
- 增量合并 则是只处理被修改的数据块,复用未修改的数据块,适用于日常维护,减少资源消耗。
希望以上信息能帮助您更好地理解 default_progressive_merge_num
参数以及不同合并方式的区别。如果您有更多问题,欢迎继续咨询。
具体信息可参考以下文档:
根据文档库中的信息,要判断 OceanBase 数据库是否默认使用增量合并,可以通过以下几种方法进行确认:
1. 查看系统配置项
OceanBase 默认使用增量合并作为其合并算法。您可以通过查询系统参数来确认这一点。
SHOW PARAMETERS LIKE 'default_progressive_merge_num';
- 如果
default_progressive_merge_num
的值为 0(即默认值 100),则表示在表模式发生变化时会进行渐进合并。 - 但这并不影响日常的增量合并行为,因为增量合并是默认的合并算法。
2. 查看表级别的合并配置
您可以查看特定表的合并配置,以确认是否启用了增量合并。
SHOW TABLE STATUS LIKE 'your_table_name';
这将显示表的详细信息,包括其合并策略。
3. 监控和日志分析
通过 OCP 或者 OBProxy 等工具查看合并任务的日志和统计信息,了解具体的合并行为。
- OCP:登录 OCP 控制台,导航到“监控与告警”模块,查看合并任务的执行情况。
- OBProxy 日志:检查 OBProxy 的日志文件,寻找与合并相关的日志条目。
4. 使用 SQL 查询合并状态
您可以使用以下 SQL 查询当前租户的合并状态:
SELECT * FROM GV$OB_MAJOR_COMPACTION;
此视图提供了关于正在进行或已完成的合并任务的详细信息,包括合并类型(全量、增量等)。
5. 观察系统性能和资源使用
增量合并的一个显著特点是它对系统资源的影响较小。如果您观察到系统在合并期间的 IO 和 CPU 使用率较低,并且合并时间较短,这通常是增量合并的表现。
总结
根据文档中的信息,OceanBase 数据库默认使用增量合并作为其合并算法。要确认这一点,您可以:
- 查询系统参数
default_progressive_merge_num
。 - 查看表级别的合并配置。
- 使用监控工具和日志分析。
- 查询合并状态视图
GV$OB_MAJOR_COMPACTION
。 - 观察系统性能和资源使用情况。
希望这些方法能帮助您确认 OceanBase 是否默认使用增量合并。如果有更多问题,请随时联系我。
具体信息可参考以下文档:
可不可以这样子理解
-
没有DDL 的表 进行 增量合并
-
进行DDL 的表 进行 渐进合并
-
一次合并 可能触发 渐进合并,增量合并 。如果单表设置 progressive_merge_num =1 还会触发 全量合并
#####################################
一次合并 可能触发三种 对象 sstable 的 合并方式 ??
您的理解部分正确,但为了更清晰地解答您的疑问,我将详细解释不同合并方式的触发条件和应用场景。希望这能帮助您更好地理解 OceanBase 的合并机制。
1. 合并方式的触发条件
增量合并(Incremental Compaction)
- 适用场景:日常数据维护。
-
触发条件:
- 默认情况下,OceanBase 使用增量合并。
- 只有被修改过的宏块会被合并,未修改的宏块直接复用。
- 适用于没有 DDL 操作的表。
渐进合并(Progressive Compaction)
- 适用场景:表模式发生变化时(如增加列、修改压缩算法)。
-
触发条件:
- 当表结构发生变更时,系统会进行渐进合并。
- 渐进合并通过多轮次逐步完成数据重写,默认情况下是 100 轮。
- 如果设置了
progressive_merge_num = X
,则表示 X 轮合并重写完全部数据,每轮合并重写 1/X。
全量合并(Full Compaction)
- 适用场景:需要对整个表的数据进行重写的情况。
-
触发条件:
- 当设置
progressive_merge_num = 1
时,强制执行全量合并。 - 表模式发生变化且用户明确要求一次性完成所有数据的重写。
- 在某些特殊情况下,如存储属性发生变更(如修改压缩级别),可能需要全量合并。
- 当设置
2. ALTER SYSTEM MAJOR FREEZE;
是什么类型的合并?
ALTER SYSTEM MAJOR FREEZE;
触发的是 全量合并(Major Compaction)。具体来说:
- 全量合并:将静态数据全部读出并与动态数据合并为最终的静态数据。合并时间长,耗费 IO 和 CPU。
-
触发时机:当您手动执行
ALTER SYSTEM MAJOR FREEZE;
或者系统自动触发每日合并时,会启动全量合并。
3. 一次合并可能触发多种合并方式吗?
在一次合并操作中,确实可能会涉及不同的合并方式,但这取决于具体的上下文:
- 日常合并:默认使用增量合并,只处理被修改的数据块。
- DDL 操作后:对于进行了 DDL 操作的表,会触发渐进合并,分阶段完成数据重写。
-
特定配置下:如果设置了
progressive_merge_num = 1
,则会触发全量合并。
4. 总结
- 增量合并:默认用于日常数据维护,适用于没有 DDL 操作的表。
- 渐进合并:用于表模式发生变化时,分阶段完成数据重写。
-
全量合并:当设置
progressive_merge_num = 1
或者执行ALTER SYSTEM MAJOR FREEZE;
时触发,适用于需要一次性重写所有数据的情况。
示例 SQL 查询
要确认当前使用的合并方式,可以使用以下 SQL 查询:
-- 查看系统参数 default_progressive_merge_num
SHOW PARAMETERS LIKE 'default_progressive_merge_num';
-- 查看表级别的合并配置
SHOW TABLE STATUS LIKE 'your_table_name';
-- 查询当前租户的合并状态
SELECT * FROM GV$OB_MAJOR_COMPACTION;
希望这些解释能帮助您更清楚地理解 OceanBase 的合并机制。如果有更多问题,请随时联系我。
具体信息可参考以下文档:
通过表级属性progressive_merge_num控制合并行为,创建表时未指定progressive_merge_num则被设置为default_progressive_merge_num
控制表的合并行为,取值范围为[0-100]:
当设置为0时,表示执行渐进合并,每次合并均做增量合并,且渐进合并的次数为 100。
当设置为1时,每次合并均做全量合并,不执行渐进合并。
当设置为>1时,发生schema变更时按照指定轮次做渐进合并
开启渐进合并以后,会按照渐进轮次完成一次全量合并(这里的意思是所有宏块都打开重写),但每轮合并,只会打开重写一部分,其余部分都是按增量合并的逻辑执行(即能重用的宏块就重用)。
举个例子,合并一共涉及100个宏块,渐进轮次100,第一轮合并第一个宏块必须打开重写(全量合并),其余99个宏块可以根据是否有修改来进行重用(增量合并),第二轮第二个宏块必须打开重写,其余99个宏块可以根据是否有修改来进行重用,以此类推。
一次合并 可能触发三种 对象 sstable 的 合并方式 ??
会不会呢 ? 因为 不同表的progressive_merge_num 值不一样 。
你看看这个三个数值的含义 你理解一下
我这都是猜测。就是想在 社区中求证的。 麻烦各位老师准确答复下。
可能存在,但是当前默认是做增量合并。这个一般情况下不会有人修改progressive_merge_num参数