暂无图片
暂无图片
2
暂无图片
暂无图片
暂无图片
Oracle 数据库的UNDO原理和机制
2983
72页
29次
2020-02-25
5墨值下载
8
8
回滚与撤销
回滚与撤销
为了保证数据库中多个用户间的读一致性和能够回退事务,Oracle 必须拥有一种机制,
够为变更的数据构造一种前镜像 (before image)数据(保存修改之前的旧值) 以保证能够回滚
或撤消对数据库所作的修改,同时为数据恢复以及一致性读服务
这就是回滚(或撤消)。在上一章中我们提到 Redo,我们说 Redo 是用来保证在故障时事
务可以被恢复;那么 Undo 则是用来保证事务可以被回退或者撤销。
本章将着重介绍回滚(rollback)与撤销(undo)方面的知识。
8.1 什么是回滚和撤消
首先来介绍一下什么是回滚和撤消。我们知道,从 Oracle6 版本到 Oracle 9i 版本,Oracle
用数据库中的回滚段(Rollback来提供撤消数据Undo Data;而从 Oracle 9i 开始,Oracle
还提供了一种新的撤消数据Undo Data管理方式,就是使用 Oracle 自动管理的撤消UNDO
表空间Automatic Undo Management,通常可以被缩写为 AUM
事务使用回滚来记录变化前的数据或者撤销信息回忆一下上一章中讲过的一个例子
假定发出了一个更新语句:
UPDATE emp SET sal = 4000 Where empno= 7788;
下面看一下这个语句是怎样执行的(为了叙述方便,我们尽量简化了情况)
1 检查 empno=7788 记录在 Buffer Cache 中是否存在,如果不存在则读取到 Buffer
Cache
2 在回滚表空间的相应回滚段事务表上分配事务槽,这个操作需要记录 Redo 信息
3 从回滚段读入或者在 Buffer Cache 中创建 sal=3000 的前镜像,这需要产生 Redo
信息并记入 Redo Log Buffer
4 修改 Sal=4000,这是 update 的数据变更,需要记入 Redo Log Buffer
5 当用户提交时,会在 Redo Log Buffer 记录提交信息,并在回滚段标记该事务为非
激活inactive
在以上事务处理过程中,注意 REDO UNDO 是交替出现的,这两者对于数据库来说都
非常重要。在以上的步骤中,对于回滚段的操作存在多处,在事务开始时,首先需要在回滚表
空间获得一个事务槽,分配空间,然后创建前镜像,此后事务的修改才能进行,Oracle 必须
此来保证事务是可以回退的。
如果用户提交commit了事务,Oracle 会在日志文件记录提交,并且写出日志同时
回滚段中把该事务标记为已提交,提交事务在回滚段事务表的状态变为 INACIVE,然后该
事务所使用的回滚空间可以被重用,回滚段空间是循环使用的;如果用户回滚rollback
务,则 Oracle 需要从回滚段中把前镜像数据读取出来修改数据缓冲区,完成回滚,这个过
书名书名书名书名书名书名书名书名书名书名书名书名书名书名
·2·
程本身也要产生 Redo,所以回退这个操作是很昂贵的
Oracle 的性能优化中,有一个性能指标称为平均事务回滚率Rollback per transaction),
用来衡量数据库的提交与回滚效率。 Statspack 的报告中,可以从开头部分找到这个指标:
Load Profile
~~~~~~~~~~~~
% Blocks changed per Read: 0.37 Recursive Call %: 1.14
Rollback per transaction %: 38.22 Rows per Sort: 11.83
该参数计算公式如下:
Round(User rollbacks / (user commits + user rollbacks) ,4)* 100%
其中 user commits user rollbacks 数据来自系统的统计信息,可以从 V$SYSSTAT 视图
中得到,在 Statspack 中也包含着部分数据的输出,本例选择的报告相关部分摘录如下:
user commits 31,910 12.9 0.6
user rollbacks 19,740 8.0 0.4
按照公式计算就可以得出平均事务回滚率:
Round(19740 / (31910 + 19740),4) = .3822
这个指标应该接近于 0,如,则回滚过多。回滚过多不仅说明
数据库经历了太多的无效操作,而且这些操作会极大影响数据库性能。
8.2 回滚段存储的内容
在上一章中讲过,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 表空间损坏会丢失,那么数据库将会出现故障,需要进行介质恢复来恢复相关数
据文件:
of 72
5墨值下载
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文档的来源(墨天轮),文档链接,文档作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论

关注
最新上传
暂无内容,敬请期待...
下载排行榜
Top250 周榜 月榜