作者:dbtan |【转载时请以超链接形式标明文章出处作者信息】


回滚段存储的内容:

前面的日志中讲过,Redo中只会记录少量信息,这些信息足以重演事务;同样Undo中也只记录精简信息,这些信息足以撤销事务。

对于insert操作,回滚段只需要记录插入记录的rowid,如果回退,只需将该记录根据rowid删除即可;
对于update操作,回滚段只需要记录被更新字段的旧值即可(前镜像),回退时通过旧值覆盖新值即可完成回滚;
对于delete操作,Oracle则必须记录整行的数据,在回滚时,Oracle通过一个反向操作恢复删除的数据。

通过以上介绍可以简单总结一下:对于相同数据量的数据操作,通常insert产生最少的Undo,update产生的Undo居中,而delete操作产生的Undo最多。这也就是我们经常看到的,当一个大的Delete操作失败或者回滚,总是需要很长的时间,并且会有大量的Redo生成。所以通常在进行大规模数据删除操作时,推荐通过分批删除分次提交,以减少对于回滚段的占用和冲击

回滚段在Undo表空间中分配,其数据在Buffer Cache内存中的管理方式与用户数据一致,同样按照相同的规则写出到Undo表空间的数据文件上。Undo表空间中的存储空间同样按照Segment来分配和使用。回滚段的作用除了回退事务外,还要参与事务恢复,以及提供一致性。

因为Undo数据要参与事务恢复,所以在备份数据库时一定要包含Undo表空间,而且一旦Undo表空间损坏或丢失,那么数据库将会出现故障,需要进行介质恢复来恢复相关数据文件。

- The End -