当发生一个DML操作时,服务器进程会选择一个undo segment。AUM采用的是事务绑定undo segment的算法:
1、首先尝试将每个undo段绑定一个事务,也就是每个undo segment上只被一个事务使用。
2、如果不能发现完全空闲的(也就是没有与任何事务绑定)undo segment,则系统会尝试将其他脱机的undo segment脱机。
3、如果没有可用的undo segment进行联机,则会尝试创建一个新的undo segment。
4、如果上面步骤都不可行,也就是创建新的undo segment也没有可用空间了,则事务绑定算法才会尝试去找最早被使用的那个undo segment。这种情况下,才可能出现多个事务在同一个undo segment中存在。
undo segment的收缩通过SMON实现:
1、每隔12个小时收缩一次,删除那些idle状态的extents。
2、当前台进程进行DML而需要undo时,发现空间不够用,则会唤醒SMON收缩一次。也就是说将其他undo segment里暂时不用的extents拿来用。
使用AUM,并设置了undo_retention,undo块存在四种状态:
Active:正在使用该undo的事务还没有提交或回滚。
Inactive:该undo上没有活动的事务,该状态的undo可以被其他事务覆盖。
Expired:该undo持续inactive的时间超过undo_retention设定时间。
Free:该undo块是空的,从来没有被使用过。
当活动的事务使用undo segment时,在AUM模式下,事务可以在不同的undo segment之间交换undo空间,也就是在不同的undo segment
里交换extents。当一个正在执行的事务需要更多的undo空间时,首先会重用当前undo segment里的可用空间;如果当前undo segment
里的可用空间不足,则会按照下面的步骤获得所需要的extents:
1、获取undo表空间里可用的、空的extents。
2、获取其他undo里的expired状态的extents。
3、如果undo表空间里的数据文件启动了自动扩展(autoextend on),则数据文件进行自动扩展。
4、如果undo表空间里的数据文件没有启用自动扩展,则获取其他undo segment里的inactive状态的extents。
5、如果以上步骤均无法获得可用空间时,报空间不足的错误。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/24496749/viewspace-1045311/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/24496749/viewspace-1045311/