楼主: haitian

[精华] update的机制问题

[复制链接]
论坛徽章:
5
ITPUB元老
日期:2005-02-28 12:57:00授权会员
日期:2005-10-30 17:05:33ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44ITPUB十周年纪念徽章
日期:2011-11-01 16:19:41
31#
发表于 2004-4-22 19:45 | 只看该作者
谢谢biti,看来一个简单的问题后面也蕴涵这么丰富的知识

使用道具 举报

回复
招聘 : 数据库管理员
论坛徽章:
21
授权会员
日期:2005-10-30 17:05:332012新春纪念徽章
日期:2012-02-13 15:11:362012新春纪念徽章
日期:2012-02-13 15:11:362012新春纪念徽章
日期:2012-02-13 15:11:362012新春纪念徽章
日期:2012-02-13 15:11:36马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:142012新春纪念徽章
日期:2012-02-13 15:11:36
32#
发表于 2004-7-8 13:03 | 只看该作者
据说要顶一下才能在深入区看到

使用道具 举报

回复
论坛徽章:
4
ITPUB元老
日期:2006-08-29 15:16:29ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:442010新春纪念徽章
日期:2010-03-01 11:07:21ITPUB9周年纪念徽章
日期:2010-10-08 09:31:21
33#
发表于 2004-7-22 22:56 | 只看该作者
最初由 grassbell 发布
[B]据说要顶一下才能在深入区看到 [/B]


同意,你真是铁杆

使用道具 举报

回复
论坛徽章:
10
授权会员
日期:2005-10-30 17:05:332010年世界杯参赛球队:科特迪瓦
日期:2010-04-15 12:20:472010年世界杯参赛球队:智利
日期:2010-04-13 17:15:21生肖徽章2007版:蛇
日期:2009-09-24 13:54:11生肖徽章2007版:龙
日期:2009-09-22 13:56:012009日食纪念
日期:2009-07-22 09:30:00生肖徽章2007版:龙
日期:2009-02-10 13:45:15生肖徽章2007版:狗
日期:2009-02-03 13:53:34会员2006贡献徽章
日期:2006-04-17 13:46:34ITPUB十周年纪念徽章
日期:2011-11-01 16:20:28
34#
发表于 2005-2-16 15:06 | 只看该作者

Re: o

最初由 biti_rainy 发布
[B]1:update的变化前数据写入日志文件,是为了恢复的时候 写入回滚段的
[/B]


这一点真的是很难理解呀!
我还没看到恢复,这样看来恢复的全过程也是无懈无击,可以应付随时的当机了。

使用道具 举报

回复
论坛徽章:
10
授权会员
日期:2005-10-30 17:05:332010年世界杯参赛球队:科特迪瓦
日期:2010-04-15 12:20:472010年世界杯参赛球队:智利
日期:2010-04-13 17:15:21生肖徽章2007版:蛇
日期:2009-09-24 13:54:11生肖徽章2007版:龙
日期:2009-09-22 13:56:012009日食纪念
日期:2009-07-22 09:30:00生肖徽章2007版:龙
日期:2009-02-10 13:45:15生肖徽章2007版:狗
日期:2009-02-03 13:53:34会员2006贡献徽章
日期:2006-04-17 13:46:34ITPUB十周年纪念徽章
日期:2011-11-01 16:20:28
35#
发表于 2005-2-16 15:22 | 只看该作者

Re: 噢

最初由 biti_rainy 发布
[B]3:回滚段不是 DBWR 写的,回滚段应该是 server  process写的,redo  buffer 也是 server  process写的,lgwr 是写 buffer 进文件
[/B]


biti:这句话是不是笔误?
我是这样理解的:回滚段是位于data file中的,data buffer中的回滚段的block和其它类型的block在DBWR和SERVER PROCESS的角度来看是一样的,SERVER PROCESS负责将其从回滚段读到data buffer中,如果需要还负责对其进行更改,同时产生redo entries写进redo buffer,DBWR负责将其刷回到回滚段中去。
如有错误请指正。

还想借此机会问个问题:
对数据文件的更改可以回滚,那么对回滚段内容的更改可以回滚吗,或者说需要吗?

使用道具 举报

回复
论坛徽章:
86
ITPUB元老
日期:2005-02-28 12:57:002012新春纪念徽章
日期:2012-01-04 11:49:542012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:20咸鸭蛋
日期:2012-05-08 10:27:19版主8段
日期:2012-05-15 15:24:112013年新春福章
日期:2013-02-25 14:51:24
36#
发表于 2005-2-16 16:39 | 只看该作者

Re: Re: 噢

最初由 wyq21973 发布
[B]

biti:这句话是不是笔误?
我是这样理解的:回滚段是位于data file中的,data buffer中的回滚段的block和其它类型的block在DBWR和SERVER PROCESS的角度来看是一样的,SERVER PROCESS负责将其从回滚段读到data buffer中,如果需要还负责对其进行更改,同时产生redo entries写进redo buffer,DBWR负责将其刷回到回滚段中去。
如有错误请指正。

还想借此机会问个问题:
对数据文件的更改可以回滚,那么对回滚段内容的更改可以回滚吗,或者说需要吗? [/B]


dbwr 写的是数据文件,这点上oracle当作和其他block一样看待。 这里的理解的差异在于 我所说的回滚段 指的是在buffer中的block,而dbwr 写出,是把 block 从buffer中写到 datafile。我并没有把这个称做 dbwr写回滚段(如果这么说我们还可以说 dbwr写表段、index segment……)。 习惯上大家把 回滚段看做 数据文件中的物理段了,而我没这样看,把他和 表段一样地看待。

所以我没有说 dbwr 负责刷回 回滚段,而是把回滚段写回数据文件。




回滚段的内容本身不再产生回滚。不需要。

使用道具 举报

回复
论坛徽章:
10
授权会员
日期:2005-10-30 17:05:332010年世界杯参赛球队:科特迪瓦
日期:2010-04-15 12:20:472010年世界杯参赛球队:智利
日期:2010-04-13 17:15:21生肖徽章2007版:蛇
日期:2009-09-24 13:54:11生肖徽章2007版:龙
日期:2009-09-22 13:56:012009日食纪念
日期:2009-07-22 09:30:00生肖徽章2007版:龙
日期:2009-02-10 13:45:15生肖徽章2007版:狗
日期:2009-02-03 13:53:34会员2006贡献徽章
日期:2006-04-17 13:46:34ITPUB十周年纪念徽章
日期:2011-11-01 16:20:28
37#
发表于 2005-2-16 17:13 | 只看该作者
谢谢!

回滚段是用来保证事务的原子性和读一致性的,可以用来回滚对数据文件其它部分的修改,而它自己进行修改的保险是在日志文件中。
这里我又有一个疑问:
事务对数据文件的任何更改都有与之对应的回滚段记录,现在假设电源故障,对数据进行更改的redo entry写进了日志文件,而准备把与之相对应的更改回滚段的redo entry写进日志文件时失败,当实例恢复的时候先进行前滚把数据文件改了,然后回滚时却没有与之对应的回滚段记录,这时不是有问题了吗?
或者说是不是先写进更改回滚段的redo entry就没事了呢?

使用道具 举报

回复
论坛徽章:
86
ITPUB元老
日期:2005-02-28 12:57:002012新春纪念徽章
日期:2012-01-04 11:49:542012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:20咸鸭蛋
日期:2012-05-08 10:27:19版主8段
日期:2012-05-15 15:24:112013年新春福章
日期:2013-02-25 14:51:24
38#
发表于 2005-2-16 17:34 | 只看该作者
最初由 wyq21973 发布
[B]谢谢!

回滚段是用来保证事务的原子性和读一致性的,可以用来回滚对数据文件其它部分的修改,而它自己进行修改的保险是在日志文件中。
这里我又有一个疑问:
事务对数据文件的任何更改都有与之对应的回滚段记录,现在假设电源故障,对数据进行更改的redo entry写进了日志文件,而准备把与之相对应的更改回滚段的redo entry写进日志文件时失败,当实例恢复的时候先进行前滚把数据文件改了,然后回滚时却没有与之对应的回滚段记录,这时不是有问题了吗?
或者说是不是先写进更改回滚段的redo entry就没事了呢? [/B]


从绝对意义上来讲,数据库是先产生  undo  的日志,再产生 redo  的日志 ,对于任何变化,undo  和 redo 在 logfile 中都是成对的原子的,也就是说,一条记录的变化,logfile  block 中是同时存在 undo  and  redo.

所以不存在先写了 redo 然后丢了undo 的情况。

使用道具 举报

回复
论坛徽章:
10
授权会员
日期:2005-10-30 17:05:332010年世界杯参赛球队:科特迪瓦
日期:2010-04-15 12:20:472010年世界杯参赛球队:智利
日期:2010-04-13 17:15:21生肖徽章2007版:蛇
日期:2009-09-24 13:54:11生肖徽章2007版:龙
日期:2009-09-22 13:56:012009日食纪念
日期:2009-07-22 09:30:00生肖徽章2007版:龙
日期:2009-02-10 13:45:15生肖徽章2007版:狗
日期:2009-02-03 13:53:34会员2006贡献徽章
日期:2006-04-17 13:46:34ITPUB十周年纪念徽章
日期:2011-11-01 16:20:28
39#
发表于 2005-2-16 17:42 | 只看该作者
谢谢biti的耐心讲解。

我明白了,如果一个包含undo和redo的redo entry只写一半就坏了,那么前滚时不用就得了,这个时候数据块肯定是还没来得及更新。

使用道具 举报

回复
论坛徽章:
86
ITPUB元老
日期:2005-02-28 12:57:002012新春纪念徽章
日期:2012-01-04 11:49:542012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:20咸鸭蛋
日期:2012-05-08 10:27:19版主8段
日期:2012-05-15 15:24:112013年新春福章
日期:2013-02-25 14:51:24
40#
发表于 2005-2-16 17:54 | 只看该作者
最初由 wyq21973 发布
[B]谢谢biti的耐心讲解。

我明白了,如果一个包含undo和redo的redo entry只写一半就坏了,那么前滚时不用就得了,这个时候数据块肯定是还没来得及更新。 [/B]


因为脏数据块写入数据文件之前,必须保证相关日志已经写入日志文件,这是基本概念,在写 logfile 的几个条件中就有这一条。 而如果redo  entry (redo  block 只有512 bytes 大小,恰好是os的最小io单元)是 *坏* 的,在恢复的过程中就会出错的。

当你讨论清楚这些回过头去看 oracle concepts 就会很容易理解了。

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表