undo表空间空间不释放原因及解决办法

Undo的复杂性

在Oracle数据库中,任何进程都可以在任意时间点访问任意一条undo(undo)记录,以“隐藏”那些不应被其看到的数据。为了高效地满足这一需求,Oracle采用了专门的表空间——undo表空间(undo tablespace)来存储这些undo记录。数据库内核代码负责维护各种undo记录的指针,以便相关进程能够快速找到所需的undo记录。

在数据库中使用“普通”的数据文件来存储undo信息具有显著的优势。这些undo数据块可以利用与数据库中其他数据块相同的缓冲、写入和恢复机制。这意味着,管理undo块的方式与管理其他任何类型的数据块的方法是一致的,从而简化了数据库的管理和维护。

Undo的用途

1. 读一致性

undo的最常见用途是解决读一致性问题。读一致性确保会话在不应看到数据(块)的新版本时,可以访问更旧的版本。为了实现这一点,块中必须包含指向undo记录的指针,以“描述”如何隐藏块的更改。然而,可能会有任意数量的更改需要隐藏,而在一个块中没有足够的空间来存储所有这些指针。因此,Oracle在每个数据块内部只允许存放有限数量的指针(每个指针对应一个更改块的事务),这些指针存储在块的ITL(Interested Transaction List)条目中。

当一个进程创建一条undo记录时,它通常会覆盖一个已经存在的指针,并将之前指针的值作为新undo记录的一部分保留下来。这样,尽管空间有限,Oracle仍然能够有效地管理多个更改,并提供一致的数据视图。

2. 回滚

undo的第二大用途是回滚数据更改。这包括显式的回滚(例如,用户发出ROLLBACK命令或回滚到SAVEPOINT)以及由于事务某一步失败而导致的隐式回滚。在这种情况下,Oracle会自动执行语句级回滚。

读一致性主要关注单个数据块及其对应的undo记录指针链表,而回滚则涉及到事务的历史。因此,在回滚操作中,需要维护一个事务中所有undo记录的正确排序(实际上是反向顺序)的指针链表。这种指针链表确保在回滚时能够准确地恢复到事务开始之前的状态,使得数据的一致性得以保持。

undo表空间不释放的原因

从10.2版本开始,oracle默认开启隐含参数_undo_autotune,使undo进行自动调节。 但会引发bug 9681444 在12.1版本修复。

对于undo datafile是非自动扩张的情况下,oracle为了避免ora01555错误,会进行_undo_retention自动调节。在Oracle进行undo_retention自动调节的情况下,手动设置参数undo_retention将通常不会起作用。

undo表空间使用计算规则

1、在undo datafile autoextend off

结合undo表空间大小,根据v$undostat.TUNED_UNDORETENTION来决定undo_retention的大小,这种情况往往TUNED_UNDORETENTION值会很大,但undo空间使用成为数据库运行瓶颈。

2.在undo datafile autoextend on

根据v$undostat.MAXQUERYLEN+300来决定undo_retention的大小,最后取max(MAXQUERYLEN+300,undo_retention)最大值。

降低undo表空间使用率解决办法:

方法1

undo表空间数据文件使用自动扩展,并设置最大值 alter database datafile '+DATA/$SID/datafile/undotbs01.dbf' autoextend on maxsize 20480m;

方法2

关闭undo自动调节隐含参数 alter system set "_undo_autotune"=false scope=both sid='oradb1';

方法3

开启debug参数 alter system set "_smu_debug_mode"=33554432 scope=both sid='oradb1';

_smu_debug_mode的含义,请见mos:420525.1

查询undo状态

select d.segment_name, d.tablespace_name, s.waits, s.shrinks,
s.wraps, s.status
from v$rollstat s, dba_rollback_segs d
where s.usn = d.segment_id
order by 1;

通过查询v$rollstat中的shrink,warp字段(从一个回滚段切换到另一个回滚段次数) 如果这两个参数值特别大,查询是哪个异常事务在使用回滚段。 warp是事务大,跨回滚段。

本文由 mdnice 多平台发布

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值