major freeze生成一个major sstable,为什么仅包含快照点的版本行


对于活跃事务的MVCC需要保留的版本行呢,major sstable不包含吗,major freeze的快照点是怎么选取的呐

3 个赞

我的理解是,
1、 oceanbase.DBA_OB_FREEZE_INFO记录了合并产生的版本信息
2、 版本行的保留:在合并过程中,为了支持 MVCC,旧版本的数据行不会立即被清理,而是保留在 SSTable 中,直到所有依赖这些版本的事务完成。
3、 Major SSTable 是经过合并后产生的基线数据结构,它通常包含某个时间点之前的已提交数据。对于活跃事务的版本行(即尚未提交的数据版本):
不包含:活跃事务的数据版本属于内存中的 MemStore 或 Minor SSTable,它们不会直接包含在 Major SSTable 中。
合并时机:只有在事务提交后,并且触发了 Minor Freeze 和 Major Freeze 后,这些数据版本才会逐步合并到最终的 Major SSTable 中。
因此,在一次完整的 Major Freeze 完成后,新生成的 Major SSTable 不包含活跃事务的数据版本,但旧的 SSTable 可能仍保留这些版本以支持 MVCC。

2 个赞

谢谢大佬,我还是有些疑问。请教一下:
我理解的是

  1. 活跃事务所依赖数据版本有可能在major sstable中,假设在版本4的major sstable中。
  2. 假设活跃事务是个大事务,事务还没完成,但已经触发了major compaction,人工触发也好,自动触发也好。生成了版本5的major sstable。
  3. 您的意思是版本4的major sstable需要保留吗?如果保留的话是,是以什么存储级别保留的,是微块、宏块、还是sstable?
3 个赞

1、 若该事务涉及的数据已经被写入到 Major SSTable(例如版本4),而事务还未完成(如版本5已经生成),则:
如果没有开启 undo_retention多版本保留机制,那么旧版本将被覆盖;
如果开启了 undo_retention,系统会在 Minor SSTable 中保留指定时间范围内的历史版本。

undo_retention可以参考:undo_retention-V4.3.5-OceanBase 数据库文档-分布式数据库使用文档

2、 存储粒度是 SSTable 级别,不是微块或宏块。
OceanBase 的存储引擎通过 SSTable 的保留策略来管理数据版本。

3 个赞

@论坛小助手

1 个赞

根据文档库中的信息,我可以为您解答关于 Major Freeze 和 Major SSTable 的相关问题。以下是针对您提出的问题的详细回答:

1. 为什么 Major SSTable 仅包含快照点的版本行?

根据文档片段 6 和片段 9 的描述,Major SSTable 是通过合并所有基线数据(包括 MemTable、L0 层 Mini SSTable 和 L1 层 Minor SSTable)生成的。在合并过程中,OceanBase 数据库会保留多版本的数据行,但这些多版本的数据行是基于 undo_retention 参数控制的(见文档片段 3)。

  • 快照点的选择:Major Freeze 的快照点选取是为了确保生成的 Major SSTable 包含的是某个时间点的一致性视图。这个时间点通常是在触发 Major Freeze 时确定的。
  • 活跃事务的 MVCC 版本行:活跃事务所需的 MVCC 版本行不会直接存储在 Major SSTable 中,而是通过增量转储文件(如 L0 和 L1 层的 SSTable)来保留。

因此,Major SSTable 仅包含快照点的版本行,而活跃事务的 MVCC 版本行则由其他层级的 SSTable 或者增量转储文件负责保留。


2. 活跃事务所依赖的数据版本是否可能在 Major SSTable 中?

是的,活跃事务所依赖的数据版本有可能在 Major SSTable 中,但这取决于事务的开始时间和 Major Freeze 的触发时间。如果事务的开始时间早于 Major Freeze 的触发时间,并且该事务的版本行在 undo_retention 时间范围内,则该版本行会被保留。

假设场景:

  • 版本 4 的 Major SSTable:假设当前有一个版本 4 的 Major SSTable 已经生成。
  • 大事务未完成:此时有一个大事务尚未完成,其版本行可能存在于 L0 或 L1 层的 SSTable 中。
  • 触发 Major Compaction:生成了版本 5 的 Major SSTable。

在这种情况下:

  • 如果版本 4 的 Major SSTable 中的数据仍然被某些活跃事务引用,则版本 4 的 Major SSTable 不会被立即删除。
  • OceanBase 数据库会通过增量转储文件(如 L0 和 L1 层的 SSTable)来保留这些活跃事务所需的 MVCC 版本行。

3. 版本 4 的 Major SSTable 是否需要保留?

根据文档片段 3 的说明,租户可以通过设置 undo_retention 参数来控制多版本数据的保留范围。如果 undo_retention 的值大于 0,则表示开启多版本转储,并且转储文件会保留这段时间内的多版本行数据。

存储级别的保留方式:

  • 微块或宏块级别:Major SSTable 中的数据是以宏块为单位存储的,每个宏块内部由多个微块组成。如果某个宏块中包含活跃事务所需的版本行,则整个宏块会被保留。
  • SSTable 级别:如果 Major SSTable 中的数据仍然被某些活跃事务引用,则该 SSTable 不会被删除。OceanBase 数据库会在后台维护一个引用计数器,确保只有当所有引用都被释放后,才会删除对应的 SSTable。

4. 总结

  • Major SSTable 的内容:仅包含快照点的版本行,活跃事务的 MVCC 版本行由其他层级的 SSTable 或增量转储文件负责保留。
  • 活跃事务的版本行:如果事务的版本行在 undo_retention 时间范围内,则会被保留。
  • 保留方式:OceanBase 数据库会以 SSTable 或宏块级别保留活跃事务所需的版本行,直到所有引用都被释放。

如果您还有其他疑问,请随时提问!

更多信息请查看:

  1. V3.x 与 V4.x 配置项和系统变量变更
  2. 转储管理概述
  3. undo_retention
  4. 转储和合并概述
  5. 转储
  6. OceanBase 数据库整体架构
  7. 数据库对象存储
  8. oceanbase.CDB_OB_FREEZE_INFO

学习了

全是知识点

学到了