我的理解是,
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。
谢谢大佬,我还是有些疑问。请教一下:
我理解的是
- 活跃事务所依赖数据版本有可能在major sstable中,假设在版本4的major sstable中。
- 假设活跃事务是个大事务,事务还没完成,但已经触发了major compaction,人工触发也好,自动触发也好。生成了版本5的major sstable。
- 您的意思是版本4的major sstable需要保留吗?如果保留的话是,是以什么存储级别保留的,是微块、宏块、还是sstable?
1、 若该事务涉及的数据已经被写入到 Major SSTable(例如版本4),而事务还未完成(如版本5已经生成),则:
如果没有开启 undo_retention多版本保留机制,那么旧版本将被覆盖;
如果开启了 undo_retention,系统会在 Minor SSTable 中保留指定时间范围内的历史版本。
undo_retention可以参考:undo_retention-V4.3.5-OceanBase 数据库文档-分布式数据库使用文档
2、 存储粒度是 SSTable 级别,不是微块或宏块。
OceanBase 的存储引擎通过 SSTable 的保留策略来管理数据版本。
根据文档库中的信息,我可以为您解答关于 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 或宏块级别保留活跃事务所需的版本行,直到所有引用都被释放。
如果您还有其他疑问,请随时提问!
更多信息请查看:
学习了
全是知识点
学到了