oracle如何做膨胀数据_Oracle Undo段工作原理

【前言】Undo表空间是Oracle数据库尤为重要的表空间。其中存储的还原段用作支持Oracle数据库的回滚,一致性查询,闪回表,闪回查询的操作。那么Undo段具体的工作行为是怎么样的呢,我们来研究一下。

一、回滚段块的使用:

1.1 Seq序列值:

步骤1:

在每个回滚块的块头,有一个SEQ值,当事务延伸到新区时,新区的SEQ是上一区SEQ加1。如:

c0dddf19362d70d7eedc599842a77e52.png

步骤2:

cb320d959bcbfb3fe239d0968ca4548d.png

步骤3:事务B提交

步骤4:事务A发布新的更新声明,它所占回滚块开始增长:

79b9773f41ad4523ef2df87e891825cc.png

事务A增长,占用83、84、85、86、87块,但到达88块时,发现88、89块的序列值也是10,并不小于自身的序列值,事务A跳过88、89块,90块的序列值小于10,事务A占用90号块。

步骤5:

事务A继续增长,当事务A延伸至下一区时,下一区块的序列值为11:

c2acd288b87d999e61ddd28cd7785998.png

结论:只有当事务为块分配的序列值大于块本身的序列值时,事务才可占用此块。上例中事务 B已提交的块,只有当A事务提交后,另有其他事务从末尾区延伸到区0时,才会被占用。

1.2区的膨胀(Extend):

e329e9e34ec2767d6346706d8c81cb80.png

事务A不断增长,已经占满了区0。事务A又请求新的回滚块,由于事务Z从区1开始,因此区1有“活动事务”,此时Oracle再分配一个新区作为区1,老的区1变为区2,如下:

8249fce4d9796849f60ad5813b2d0b6d.png

就算老区1后还有空闲的老区2,此处还是会分配新区1的。

二、回滚和提交:

2.1回滚:

如果某一事务回滚,其操作步骤是:

1.在事务表中取出它的DBA列,此DBA是事务回滚链末端回滚块的DBA

2.通过此DBA找到回滚链的末端

3.沿回滚链从尾向前,依次取出回滚记录所对应的原表的DBA、行号、列号,以及其前映像信息。

4.将前映像信息重新写入原表相应的DBA中

从上面的步骤可以看到,回滚的顺序,与你操作的顺序正相反,如果你删除了1,2,3,4,5条记录,然后回滚,Oracle从后向前,依次插入5,4,3,2,1条记录。

2.2 提交:

事务提交后,事务表上的事务状态列被置为非活动。此事务不可再回滚,因为回滚先要到事务表查出事务回滚链的末尾块。

但是,提交后,虽然事务表上已经标明此事务是非活动事务,不过回滚块中的信息还在,虽然不能回滚,但这些回滚块中的信息在被覆盖前,仍是可以被读取的。

关于这一点,我们可以找个事务,提交后再DUMP它占用的回滚块,根据回滚段循环使用原则,这些回滚记录到下一轮循环时才会被覆盖。

2.2提交:

事务提交后,事务表上的事务状态列被置为非活动。此事务不可再回滚,因为回滚先要到事务表查出事务回滚链的末尾块。

但是,提交后,虽然事务表上已经标明此事务是非活动事务,不过回滚块中的信息还在,虽然不能回滚,但这些回滚块中的信息在被覆盖前,仍是可以被读取的。

关于这一点,我们可以找个事务,提交后再DUMP它占用的回滚块,根据回滚段循环使用原则,这些回滚记录到下一轮循环时才会被覆盖。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值