undo相关问题

oracle的DBA刚转OB,对OB的undo不是很理解,只看到undo_retention默认为1800s,oracle有表空间的概念,有快照过旧的概念,有一些疑惑:
1、ob有空间的概念吗?
2、如果有大量dml语句,他会一直占用空间吗?最大能占多少?
没找到想要的资料,哪位老师能提供一些资料。

@论坛小助手

根据文档库中的信息,以下是针对您的问题的详细解答:

1. OceanBase 是否有类似 Oracle 的 Undo 空间概念?

回答:
OceanBase 数据库确实存在类似于 Oracle 的 Undo 空间机制,但其设计与实现方式有所不同。OceanBase 使用多版本并发控制(MVCC)来支持事务隔离性和闪回查询功能,而 Undo 日志是实现 MVCC 的关键部分。

  • Undo 日志存储位置:在 OceanBase 中,Undo 日志并不是存储在一个独立的表空间中,而是直接存储在租户的数据文件中。具体来说,Undo 日志会随着数据的修改被写入到内存中的 MemTable 和磁盘上的 SSTable 中。
  • Undo Retention:通过租户级配置项 undo_retention 来控制 Undo 日志的保留时间,默认值为 1800 秒(30 分钟)。在此期间,Undo 日志会被保留以支持闪回查询和事务一致性读取。

参考文档


2. 如果有大量 DML 语句,Undo 日志是否会一直占用空间?最大能占多少?

回答:

(1)Undo 日志的生命周期

  • Undo 日志的保留时间:Undo 日志的保留时间由 undo_retention 参数决定。一旦超过该时间范围,Undo 日志将被清理。
  • 大版本合并的影响:当开启多版本转储时,OceanBase 在 Major 合并过程中会保留增量转储文件,但 Major SSTable 中不会存放多版本数据。因此,建议不要将 undo_retention 设置得过大,以免导致保留的 SSTable 数量超限。

(2)Undo 日志的空间占用

  • 动态管理:OceanBase 会根据业务负载动态管理 Undo 日志的空间占用。对于不再需要的 Undo 日志,系统会在合适的时间点进行清理。
  • 最大空间限制:Undo 日志的空间占用受到租户内存和磁盘配额的限制。具体来说:
    • 内存限制:租户的内存使用上限由 memory_limit 参数控制。Undo 日志相关的数据会优先存放在内存中,超出部分会逐步落盘。
    • 磁盘限制:租户的磁盘使用上限由 data_disk_utilization_thresholdlog_disk_utilization_limit_threshold 等参数控制。如果磁盘空间不足,系统会触发日志复用或拒绝新事务。

(3)避免空间过载的建议

  • 合理设置 undo_retention:根据业务需求调整 undo_retention 的值,避免设置过大导致不必要的空间占用。
  • 监控资源使用:定期检查租户的内存和磁盘使用情况,确保资源充足。
  • 及时清理历史数据:对于不再需要的历史数据,可以通过 Major 合并等方式清理。

参考文档


补充资料推荐

如果您希望进一步了解 OceanBase 的 Undo 机制及相关配置,可以参考以下文档:

  1. 闪回查询:详细介绍 OceanBase 的闪回查询功能及 undo_retention 的作用。
  2. 内存管理概述:解释 OceanBase 如何管理租户的内存资源,包括 Undo 日志的内存分配策略。
  3. 日志的控制与回收:描述 Clog 和 Redo 日志的管理机制,帮助理解 Undo 日志的持久化和清理过程。

希望以上信息能够解答您的疑惑!如果还有其他问题,欢迎继续提问。

详情请参考:

  1. 闪回查询
  2. 在您开始前
  3. undo_retention
  4. 产品 FAQ
  5. 内存管理概述
  6. Redo 日志
  7. 集群管理 FAQ
  8. 日志归档前准备
  9. 设置并行执行参数

OB没有表空间的概念,但是OB有MCVV多版本控制,通过多版本控制来保留历史版本的数据,实现ORACLE 的UNDO表空间的功能