资讯专栏INFORMATION COLUMN

Oracle 之undo log探究

IT那活儿 / 1043人阅读
Oracle 之undo log探究
点击上方“IT那活儿”公众号,关注后了解更多内容,不管IT什么活儿,干就完了!!!

什么是undo log

Undo log用来记录数据修改的前映像。Undo log位于undo segments中,每个实例有多个undo segments,第一个undo segment位于system表空间中,其余的undo segment 位于undo表空间中。

Undo log的作用

Undo log有如下三大作用:
  • 用于事务回滚操作

    当事务需要回滚时,需要从undo log中获取数据修改的前映像,以便于将数据恢复到修改前的状态。

  • 提供一致性读

    当一个事务需要读取的数据正在被另一个事务修改时,为了避免脏读,需要利用undo log构造出数据块被修改前的一致性的数据块。

  • 用于实例恢复

    当实例崩溃重启后,需要通过undo log将未提交的事务回滚,使实例恢复到崩溃前的一致性状态。

undo log详细内容

如下通过实验详细分析下DML三种操作insert、update、delete时undo log记录的内容。
1. update操作
如下图所示b表中有3条数据:
对b表中的一条数据执行更新操作,不提交事务。
查询v$transaction视图,此视图记录了事务和undo相关的信息,通过此视图undo的信息找到记录上述修改操作的undo块。
上一步之所以不提交事务是因为事务提交后,事务信息会从此视图移除,无法定位undo信息。xid列标识事务ID,UBAFIL标识undo所在的文件号,UBABLK标识undo块号。
dump出对应的undo块:
打开trace文件,可以看到导出的是6号文件的897号块。
UNDO BLK表明是undo块,xid是事务ID,由三部分组成,XIDUSN.XIDSLOT.XIDSQN,与v$transaction视图中的三个字段对应。cnt对应UBAREC。
找到cnt: 0x18的记录条目,里面有ITL信息,以及数据修改前的值,col 1表示的是第二列,第一列为col 0,[10]表示此列有10个字节,53 7a 6c 53 64 76 6d 43 78 72是16进制,转换成ascII字符为SzlSdvmCxr,正好是修改前id=3的列A的值。
经过上述分析,可以得出结论,update操作时,undo中记录的只是更新的字段的旧值,不更新的字段值不会记录。
2. delete操作
dump出undo块,查看trace文件:
undo块中第7条记录记录了此事务的回滚信息:
记录了两列信息,转换成文本后,正好是8 和name8。由此可见当执行delete语句时,undo中记录的是删除的行的所有字段的值。
3. insert操作
执行一条insert语句,记住编号100,表示这行数据在数据块中的位置。
dump出undo块,查看trace文件:
查看undo块中第2条记录信息:
  • KDO Op code: DRP --表示操作类型,DRP=delete row piece。
  • bdba: 0x01800417 --对应的数据文件和块,转换成二进制,前10位为数据文件号,后22位为块号 ,6 号数据文件,1047号块。
  • slot: 100(0x64) --行在数据块中的位置,与上面select出来的row number正好对应。
由此可见,当执行insert时,undo中只会记录回滚时需要的操作DRP,和数据行的位置。
4. 同一个事务中对同一条数据多次修改
如果在同一个事务里,对某一行数据的某一个字段值进行了多次修改,如将name=a修改为name=b,再改为name=c,最后改成name=d,此时undo中会记录每一次的修改信息呢,还是只记录最后一次修改的信息呢?
查看undo块信息。
查看第6条undo记录。
  • col 1: [ 1] 63 --转换成字符为c。
  • rci 0x05 -- 指向同一个事务的上一条undo记录。
依次转换col 1的值为字符得到 c->b->a->name1,正好与更新的顺相反,依次撤销即可实现回滚。rci 0x00表示本事务的第一条记录。
因此可以得出如下结论:
在同一事务里,对某一个字段值反复更新,undo会记录每次操作的前镜像值,即会记录中间结果。
总 结

update、insert、delete操作时,undo中记录的信息不一样。

  • insert时,只记录了插入数据在数据块中的位置。
  • update时,记录的是修改字段的前镜像值。
  • delete时,记录的是整行数据。insert记录的信息最少,update记录的信息居中,delete记录的信息最多。
执行delete操作需要更多的undo空间记录回滚信息,回滚时需要从undo中拷贝更多的数据到数据块中。因此,delete操作的代价最昂贵


本文作者:江金林(上海新炬中北团队)

本文来源:“IT那活儿”公众号

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/129124.html

相关文章

发表评论

0条评论

IT那活儿

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<