首页 > Oracle > Oracle undo表空间概述及其管理!
2013
12-12

Oracle undo表空间概述及其管理!

关于undo,相信了解oracle的童鞋对这个还是非常了解了。undo是oracle独有的特性,也是非常重要的一个特性。undo表空间用于提供事务回滚和一致性支持,flashback查询也是undo表空间里面的数据。下面我们来看一下undo的参数设置和管理。

首先看一下undo_retention参数

undo_retention用来指定undo中的记录保存时间,单位为秒,可以动态修改,默认值就是900秒,也就是15分钟。这个参数虽然指定undo数据的过期时间,但过期并不一定删除,而且undo中的数据也并不是一定会保留15分钟,还是要根据实物的优先级来决定的。

举个例子说明:一个新事物开始的时候,undo表空间已经写满了。新事物的数据会自动覆盖已提交的事物,如果已提交的事物还没有15分钟,数据还是会被覆盖掉。所以对于这个undo表空间大小的设置,需要根据数据库事物的大小来决定,尽可能的保证undo有足够的存储空间。

undo数据一旦超过undo_retention设定的时间,已经提交的事物的数据就无法访问,会被置为过期状态,只要别的事物数据还没有覆盖这部分undo数据,那这部分undo数据会一直存在。所以如果一个数据库的undo表空间设置足够大,数据库事物很小而且不多,那undo_retention这个参数的值并不会直接影响到数据库,只要没有事物覆盖undo数据,那就会持续有效。

当然undo表空间并不是一直都可以重用的,如果一个事物没有结束,也就是事物还没有提交,那这部分undo数据是不能被重用的,或者undo表空间指定了retention guarantee,undo数据也不会被重用,除非过了undo_retention的时间。也就是说,一旦数据已经提交,且超过了undo_retention规定的时间内,那这部分undo数据将被置为expired,这些回滚段将会被看做free space,此时数据可以被覆盖。但如果undo表空间满了,新的事物就会自动覆盖已经提交的事物数据,即使在undo_retention的时间内,也会覆盖,除非指定了retention guarantee模式,才能保证在undo_retention设定的时间内不被覆盖。这里我们先来看一下undo的扩展顺序和覆盖的优先级:

1. 先重用undo 空闲(free状态)的空间,如没有或不够,下一步。
2. 扩展undo 数据文件中free状态空间(dba_free_space.bytes),如不够时。 下一步
3. datafile 有自动扩展特性,则自动扩展,但这个受限于是不是raw(固定大小,一般是autoextend off)及asm(或文件系统,64位中单个数据文件最大为32g)的大小。
4. smon释放undo 空间中的expired空间使用。
5. 此时还不够的话,则使unexpired的空间,则原来放进unexpired的前数据被有可能被踢出,造成快照过旧出现。

如上扩展步骤中第4步就是覆盖过期的undo数据,也就是已经提交,且时间超过了undo_retention设定的时间,第5步就是覆盖还没有过期,但是已经提交的undo数据。此时如果想flashback到这部分数据的话,就会提示快照过旧,也就是著名的0-15555错误了。

下面我们来看一个简单的实验,undo表空间设置不合理,事物过多导致无法扩展undo或者覆盖undo表空间的情况:

1. 首先创建一个测试undo表空间,大小设置为1M

2. 切换当前的undo表空间位undo_test表空间

3. 创建一个测试表,并循环插入,致使事物大小超过1M

如上例子插入到test表后,并没有提交,导致产生的undo数据不能被覆盖,undo不能扩展,所以报错。

可以通过dba_undo_extents视图查看到当前的undo情况

ACTIVE:表示使用这个undo block的 transaction还未提交,处于活动状态。此时undo数据不能被覆盖。
EXPIRED :当undo datafile无法扩展时,smon会把这部分(超出undo retention时间外的)空间可回收,给新的会话使用,作预分配使用。
UNEXPIRED:保留undo retention时间内的空间。
Freed:表示该undo块内容是空的,从来没有被使用过。

此时我们可以查询当前session的undo使用情况,在为插入test表之前,当前session的undo数据为0。插入后可以看到此时的undo占用情况

如果事物提交之后,活动的undo数据被释放,此时这块undo数据可以被覆盖

关于undo的更多说明,请关注博客其他内容!

最后编辑:
作者:Jerry
一个积极向上的小青年,热衷于分享--Focus on DB,BI,ETL