undoSegment深入解析
发布网友
发布时间:2024-10-23 03:42
我来回答
共1个回答
热心网友
时间:2024-11-03 03:43
在数据库管理系统中,undo自动管理时设置undo_retention后,undo块会存在四种状态:Active、Inactive、Expired和Freed。Active表示正在被事务使用的undo块,如果事务未提交或回滚,则处于此状态;Inactive表示该undo块上没有活动事务,可以被其他事务覆盖;Expired表示undo块的Inactive状态超过undo_retention设定时间;Freed则表示undo块未被使用过,内容为空。
Undo Retention参数决定数据库在多长时间内保留已经提交的undo信息。长时间运行的查询可能需要旧的undo信息以获取数据块的旧版本,而Oracle Flashback特性也依赖于可用的旧undo信息。因此,保留旧的undo信息至关重要。自动undo管理启用时,始终存在一个当前undo保留期,这是数据库尝试在覆盖旧undo信息之前保留旧undo信息的最短时间。旧(已提交)undo信息如果比当前undo保留期更老,则称为过期;反之,则为未过期。
数据库根据undo表空间大小和系统活动自动调整undo保留期。可以通过设置UNDO_RETENTION初始化参数指定最小保留期(秒)。在空间允许的情况下,数据库尽力遵守指定的最小undo保留期。当可用空间用于新事务变得紧张时,数据库开始覆盖过期的undo。如果undo表空间在所有过期undo信息被覆盖后仍无空间用于新事务,数据库可能开始覆盖未过期的undo信息。若被覆盖的undo信息对当前长时间运行的查询的快照一致性至关重要,查询可能会因快照太旧而失败。
UNDO_RETENTION参数在固定大小的undo表空间中被忽略。数据库在空间紧张时可能覆盖未过期的undo信息。对于具有自动扩展选项的undo表空间,数据库试图遵守由UNDO_RETENTION指定的最小保留期。当空间紧张时,不是覆盖未过期的undo信息,而是表空间自动扩展。如果自动扩展undo表空间设置了MAXSIZE,则达到最大大小后,数据库可能开始覆盖未过期的undo信息。
数据库自动调整undo保留期,基于undo表空间的配置。如果undo表空间是固定大小的,数据库会针对该表空间大小和当前系统负载调整保留期,以获得最佳的undo保留。这可能大大超过指定的最小保留期。如果undo表空间配置了自动扩展选项,保留期会稍长于系统当时最长运行的查询。同样,这可能超过指定的最小保留期。
注意,undo保留自动调整不适用于LOB。这是因为在LOB中存储的undo信息存储在段本身,而不是undo表空间中。对于LOB,数据库试图遵守由UNDO_RETENTION指定的最小保留期。但是,如果空间紧张,可能覆盖未过期的LOB undo信息。
可以查询V$UNDOSTAT视图的TUNED_UNDORETENTION列来确定当前保留期。此视图包含过去4天内每10分钟统计收集间隔的每一行数据(4天后,数据在DBA_HIST_UNDOSTAT视图中可用)。TUNED_UNDORETENTION以秒为单位给出。
使用RMAN备份和恢复时,若undo表空间丢失,可能需要重新调整数据库配置或执行特定恢复步骤。关于Oracle释放过度使用的undo表空间,可以通过监控undo使用情况和合理调整UNDO_RETENTION参数来管理。理解Oracle undo有助于优化数据库性能,避免因undo管理不当导致的问题。
深入分析undo段的自动管理模式,了解undo block的分配算法。算法分为以下步骤:1、如果当前extent有空闲数据块,则使用当前extent;2、如果下一个extent处于过期状态,则环绕到下一个extent并使用该extent的第一个数据块;3、如果下一个extent未过期,则从undo表空间分配空间,如果有剩余空间则使用新分配extent的第一个数据块,此时undo表空间的使用率增加;4、如果没有剩余空闲extent,则从offline状态的回滚段中偷取过期extent,加入当前回滚段并使用第一个数据块;5、如果offline状态的回滚段中没有过期extent,则从online状态的回滚段中偷取过期区加入到当前的回滚段中并使用第一个数据块;6、如果undo表空间可以扩展,则扩展undo表空间并将新extent加入到当前回滚段中,同时使用第一个数据块,此时undo所占的操作系统空间增加。