一、UNDO块的四种状态
Active:正在使用该undo的事务还没有提交或回滚。 Inactive:该undo上没有活动的事务,该状态的undo可以被其他事务覆盖。 Expired:该undo持续inactive的时间超过undo_retention所指定的时间。 Freed:该undo块内容是空的,从来没有被使用过。
二、回滚段自动管理模式下UNDO block分配算法:
1、如果当前extent有空闲的数据块,则使用当前extent
2、如果当前extent的下一个extent已经处于过期(expired)状态,那么环绕(wrap)到一个extent,然后使用该extent的第一个数据块。
3、如果下一个extent没有expired,则从undo tablespace中分配空间。如果有剩余空间则使用新分配extent的第一个数据块。此时undo tablespace的使用率开始增加。
4、如果没有剩余空闲的extent,则从offline状态的回滚段中偷取(steal)过期的extent,加入当前回滚段,并使用第一个数据块。
5、如果offline状态的回滚段中没有expired extent,则从online状态的回滚段中偷取(steal)过期区加入到当前的回滚段中,并使用extent中的第一个数据块。
6、如果undo tablespace可以扩展,则扩展undo tablespace,并将新extent加入到当前的回滚段中,同时使用第一个数据块,此时undo所占的操作系统空间开始增加。
7、如果undo tablespace 不能扩展,则自动调整(下降幅度为10%)回滚段的保留时间,然后偷取在更短保留时间下的未过期的extent,如果还未找到过期的extent,则继续以10%的速度减少回滚段的保留时间,重复几次。
8、随机从其他offline状态的回滚段中偷取未过期(unexpired)的extent。
9、尝试使用当前回滚段中未过期的extent,如果所有的区都为ACTIVE状态,则进入下一步。
10、如果以上所有的尝试都失败,则报ORA-30036的错误。
步骤:
- 如果当前extent有空闲的数据块,则使用当前extent
- 如果当前extent没有空闲数据块,
- 但下一个extent已经处于过期(expired)状态,那么环绕(wrap)到一个extent,然后使用该extent的第一个数据块。
- 如果下一个extent没有expired,则从undo tablespace中分配空间。
- 如果undo tablespace有剩余空间则使用新分配extent的第一个数据块。此时undo tablespace的使用率开始增加。
- 如果undo tablespace中没有剩余空闲的extent
- 则从offline状态的回滚段中偷取(steal)过期的extent,加入当前回滚段,并使用第一个数据块。
- 如果offline状态的回滚段中没有expired extent,则从online状态的回滚段中偷取(steal)过期区加入到当前的回滚段中,并使用extent中的第一个数据块。
- 如果无法在offline或online状态的过期区获取回滚段
- 如果undo tablespace可以扩展,则扩展undo tablespace,并将新extent加入到当前的回滚段中,同时使用第一个数据块,此时undo所占的操作系统空间开始增加。
- 如果undo tablespace 不能扩展,则自动调整(下降幅度为10%)回滚段的保留时间,然后偷取在更短保留时间下的未过期的extent,如果还未找到过期的extent,则继续以10%的速度减少回滚段的保留时间,重复几次。
- 随机从其他offline状态的回滚段中偷取未过期(unexpired)的extent。
- 尝试使用当前回滚段中未过期的extent,如果所有的区都为ACTIVE状态,则进入下一步。
- 如果以上所有的尝试都失败,则报ORA-30036的错误。