免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1919 | 回复: 5
打印 上一主题 下一主题

求助:关于undo放入旧值的过程 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-02-24 17:14 |只看该作者 |倒序浏览
本帖最后由 hbm1985 于 2010-02-24 17:17 编辑


我是新手,买了一本书《教你如何成为10G OCP》为入门打基础。但看到第7章有些地方不明白,undo放入的是旧值还是新值。放入后生成的redo记录又是怎么排列?书上是不是写错了。在网上找了很久也没有找到。请大伙帮一下忙。谢谢!
文章如容如下:
http://book.csdn.net/bookfiles/732/10073222578.shtml

对于DML语句来说,只要修改了数据块,Oracle数据库就会将修改前的数据保留下来,保存在undo segment里,而undo segment则保存在undo表空间里。从Oracle 9i起,有两种undo的管理方式:自动Undo管理(Automatic Undo Management,简称AUM)和手工Undo管理(Manual Undo Management,简称MUM)。Oracle 9i之前只能使用MUM,而且在MUM中,undo segment又叫做rollback segment。从Oracle 9i起,Oracle就建议使用AUM,而不应再使用MUM了。因此,我们不讨论MUM以及rollback segment。

读完本章以后,我们能够了解到:

ž 在DML语句的过程中,undo是如何被使用的;

ž undo的作用是什么,重点在于undo是如何完成一致性读的;

ž AUM是什么,如何配置AUM。

7.1  DML语句与undo  
当我们发出一条DML(比如update t set col1='A' where col1='B')语句时,其执行过程可大致概括为以下几步。

1. 在shared pool里进行解析,从而生成执行计划。具体解析过程见第5章。

2. 假设根据执行计划,得出col1='B'的记录存放在10号数据文件的54号数据块里。

3. 服务器进程在buffer cache里找一个可用的undo数据块,如果没有发现,则到undo表空间里找一个可用的undo块,并调入buffer cache。假设获得的undo数据块号为24号,位于11号undo数据文件里。

4. 将改变前的值,也就是A放入11号undo数据块。(问题。改变前的值,应该是B放入11号UNDO数据块?)

5. 由于undo数据块发生了变化,于是产生重做记录,假设重做记录号为120。

   行号     事务id   file#   block#  row     column      value

     120         T1      24      11          10       col1            A   

-----------------------------------------------------------------------------------
重做记录应该如下?:
   行号     事务id   file#   block#  row     column      value

     120         T1      24      11          10       col1            B  

6.  在buffer cache里找到54号数据块。如果没有发现,则从10号数据文件里调入。

7. 将改变后的值,也就是B放入54号数据块。(问题。改变后的值,应该是A放入54号数据块?)

8.  由于数据块发生了变化,于是产生重做记录,假设重做记录号为121。

   行号     事务id   file#   block#  row     column      value

    121        T1        10       54        10       col1             B   


------------------------------------------------------------------------------
重做记录应该如下?:
   行号     事务id   file#   block#  row     column      value

    121        T1        10       54        10       col1             A
-----------------------------------------------------------------------------


PS:当DBWn写入数据时,实例崩溃。下次启动时SMON会自动应用redo里面的重做记录。应该是从上往下。所以,先放入的旧值?

那么重做记录应该如下?:

   行号     事务id   file#   block#  row     column      value

     120         T1      24      11          10       col1            B
     121        T1        10       54        10       col1             A


9.控制权返回给用户,如果在SQL*Plus里执行DML,则表现为光标返回。

10. 当用户发出commit命令时,触发LGWR进程,将120与121这两个重做记录写入联机日志文件,并将54号数据块和11号undo数据块头部所记录的事务状态标记设置为已提交。然后控制权返回给用户,如果在SQL*Plus里执行DML操作,则表现为光标返回。

11.这个时候,54号数据块以及11号undo块并不一定被DBWn写入数据文件。只有在脏数据块的数量达到一定程度才会被写入。

事务只要被提交或回滚,那么该事务所使用的undo块就可以被覆盖。对于上面的例子来说,当第步,用户发出commit命令以后,11号undo块里的数据就可以被其他事务所覆盖。

论坛徽章:
1
数据库技术版块每日发帖之星
日期:2016-01-24 06:20:00
2 [报告]
发表于 2010-02-24 17:20 |只看该作者
放入的自然是旧值啊,没有前镜像,怎么实现回退(rollback)啊

论坛徽章:
0
3 [报告]
发表于 2010-02-24 17:24 |只看该作者
回复 2# Minsic
那么书上写的是错误的!?谢谢!{:3_191:}

论坛徽章:
59
2015七夕节徽章
日期:2015-08-24 11:17:25ChinaUnix专家徽章
日期:2015-07-20 09:19:30每周论坛发贴之星
日期:2015-07-20 09:19:42ChinaUnix元老
日期:2015-07-20 11:04:38荣誉版主
日期:2015-07-20 11:05:19巳蛇
日期:2015-07-20 11:05:26CU十二周年纪念徽章
日期:2015-07-20 11:05:27IT运维版块每日发帖之星
日期:2015-07-20 11:05:34操作系统版块每日发帖之星
日期:2015-07-20 11:05:36程序设计版块每日发帖之星
日期:2015-07-20 11:05:40数据库技术版块每日发帖之星
日期:2015-07-20 11:05:432015年辞旧岁徽章
日期:2015-07-20 11:05:44
4 [报告]
发表于 2010-02-24 20:34 |只看该作者
UNDO区放的应该是上次操作的数据吧。

论坛徽章:
7
天蝎座
日期:2013-08-16 23:19:32丑牛
日期:2014-01-08 09:20:14寅虎
日期:2014-01-11 11:03:44午马
日期:2014-04-28 11:02:40天秤座
日期:2014-05-16 23:24:24摩羯座
日期:2014-07-20 10:46:04卯兔
日期:2014-08-08 15:21:41
5 [报告]
发表于 2010-02-26 18:39 |只看该作者
undo段里放入的肯定是前镜像数据,这是Oracle的机制。

论坛徽章:
7
天蝎座
日期:2013-08-16 23:19:32丑牛
日期:2014-01-08 09:20:14寅虎
日期:2014-01-11 11:03:44午马
日期:2014-04-28 11:02:40天秤座
日期:2014-05-16 23:24:24摩羯座
日期:2014-07-20 10:46:04卯兔
日期:2014-08-08 15:21:41
6 [报告]
发表于 2010-02-26 18:40 |只看该作者
你看错了吧,在仔细看看
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP