楼主: haitian

[精华] update的机制问题

[复制链接]
论坛徽章:
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
41#
发表于 2005-2-16 18:06 | 只看该作者
最初由 biti_rainy 发布
[B]

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

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


你讲的出错是指恢复过程可以成功完成,但有一些出错提示吧?

使用道具 举报

回复
论坛徽章:
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
42#
发表于 2005-2-16 18:11 | 只看该作者
最初由 wyq21973 发布
[B]

你讲的出错是指恢复过程可以成功完成,但有一些出错提示吧? [/B]


en  ,当应用到这个redo  block 的时候会提示错误。

使用道具 举报

回复
论坛徽章:
92
2011新春纪念徽章
日期:2011-01-25 15:42:33咸鸭蛋
日期:2012-03-19 10:46:00版主1段
日期:2012-05-15 15:24:11奥运会纪念徽章:排球
日期:2012-08-29 07:02:50奥运会纪念徽章:跳水
日期:2012-09-26 06:44:27ITPUB 11周年纪念徽章
日期:2012-09-28 17:34:42ITPUB 11周年纪念徽章
日期:2012-10-09 18:03:32奥运会纪念徽章:击剑
日期:2012-10-12 07:20:332013年新春福章
日期:2013-02-25 14:51:242012新春纪念徽章
日期:2012-02-13 15:13:20
43#
发表于 2005-2-17 06:09 | 只看该作者

Re: Re: o

最初由 wyq21973 发布
[B]

1:update的变化前数据写入日志文件,是为了恢复的时候 写入回滚段的


  [/B]


如果是这样的话,那apply redo 就不是简单的insert /update/delete了

以为恢复的时候smon 执行redo log中的普通sql 应用到数据库中,dml自动产生undo

觉得应该如此:

1修改block之前先将redo entry写入 redo buffer (lgwr写redo log file)
2将对应的undo写回滚段,写回滚段之前写回滚的redo entry到 redo buffer (lgwr写redo log file)
3修改block信息 (block写入到数据文件之前 保证对应redo entry已经写入redo log file)

如果第一步完成,数据库crash; 如果redo entry 在redo buffer  中,则恢复的时候不会处理该redo entry; 如果已经写入到redo log file,则按照没有提交的事务处理 而rolback 。

使用道具 举报

回复
论坛徽章:
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
44#
发表于 2005-2-17 09:34 | 只看该作者

Re: Re: Re: o

最初由 玉面飞龙 发布
[B]
觉得应该如此:

1修改block之前先将redo entry写入 redo buffer (lgwr写redo log file)
2将对应的undo写回滚段,写回滚段之前写回滚的redo entry到 redo buffer (lgwr写redo log file)
3修改block信息 (block写入到数据文件之前 保证对应redo entry已经写入redo log file)

如果第一步完成,数据库crash; 如果redo entry 在redo buffer  中,则恢复的时候不会处理该redo entry; 如果已经写入到redo log file,则按照没有提交的事务处理 而rolback 。 [/B]


biti说先产生undo日志,再产生redo日志,那么你讲的步骤1和2是不是应该换一下?

使用道具 举报

回复
论坛徽章:
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
45#
发表于 2005-2-17 09:38 | 只看该作者

Re: Re: Re: o

最初由 玉面飞龙 发布
[B]

如果是这样的话,那apply redo 就不是简单的insert /update/delete了

以为恢复的时候smon 执行redo log中的普通sql 应用到数据库中,dml自动产生undo

觉得应该如此:

1修改block之前先将redo entry写入 redo buffer (lgwr写redo log file)
2将对应的undo写回滚段,写回滚段之前写回滚的redo entry到 redo buffer (lgwr写redo log file)
3修改block信息 (block写入到数据文件之前 保证对应redo entry已经写入redo log file)

如果第一步完成,数据库crash; 如果redo entry 在redo buffer  中,则恢复的时候不会处理该redo entry; 如果已经写入到redo log file,则按照没有提交的事务处理 而rolback 。 [/B]



oracle在恢复的时候不是解析成sql去操作的!
恢复过程是一个物理操作,直接操作文件的block中的数据(包括回滚段和其他数据段)。你logmnr看到的不过是把 这些操作涉及到的数据 转换成了sql的形式而已。

使用道具 举报

回复
论坛徽章:
92
2011新春纪念徽章
日期:2011-01-25 15:42:33咸鸭蛋
日期:2012-03-19 10:46:00版主1段
日期:2012-05-15 15:24:11奥运会纪念徽章:排球
日期:2012-08-29 07:02:50奥运会纪念徽章:跳水
日期:2012-09-26 06:44:27ITPUB 11周年纪念徽章
日期:2012-09-28 17:34:42ITPUB 11周年纪念徽章
日期:2012-10-09 18:03:32奥运会纪念徽章:击剑
日期:2012-10-12 07:20:332013年新春福章
日期:2013-02-25 14:51:242012新春纪念徽章
日期:2012-02-13 15:13:20
46#
发表于 2005-2-19 01:05 | 只看该作者

Re: Re: Re: Re: o

最初由 biti_rainy 发布
[B]


oracle在恢复的时候不是解析成sql去操作的!
恢复过程是一个物理操作,直接操作文件的block中的数据(包括回滚段和其他数据段)。你logmnr看到的不过是把 这些操作涉及到的数据 转换成了sql的形式而已。 [/B]


仔细想想也是。如果一个transaction如下
......dml.  where. rowid= ?   恢复的时候解释为sql操作的话就可能会出错

使用道具 举报

回复
论坛徽章:
31
管理团队2006纪念徽章
日期:2006-04-16 22:44:452012新春纪念徽章
日期:2012-02-13 15:11:522012新春纪念徽章
日期:2012-02-13 15:11:522012新春纪念徽章
日期:2012-02-13 15:11:522012新春纪念徽章
日期:2012-02-13 15:11:52铁扇公主
日期:2012-02-21 15:02:402013年新春福章
日期:2013-02-25 14:51:242014年新春福章
日期:2014-02-18 16:41:11马上有车
日期:2014-02-18 16:41:11马上有车
日期:2014-02-19 11:55:14
47#
发表于 2005-2-19 06:47 | 只看该作者

Re: 噢

最初由 biti_rainy 发布
[B]1:

如果你要研究回滚段到底能占SGA多大的比例
QL> [/B]


interesting, never thought of this issue.

sys@tiger> create table t1 as select * from all_objects;

Table created.

sys@tiger> select count(*) from v$cache where name in ( select segment_name from dba_rollback_segs);

  COUNT(*)
----------
        21

sys@tiger> delete from t1;

25342 rows deleted.

sys@tiger> select count(*) from v$cache where name in ( select segment_name from dba_rollback_segs);

  COUNT(*)
----------
       328

sys@tiger> rollback;

Rollback complete.

sys@tiger> select count(*) from v$cache where name in ( select segment_name from dba_rollback_segs);

  COUNT(*)
----------
       486

sys@tiger> select count(*) from v$cache;

  COUNT(*)
----------
      1094

sys@tiger> show parameter db_cache

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_cache_advice                      string      ON
db_cache_size                        big integer 8388608
sys@tiger> show sga

使用道具 举报

回复
论坛徽章:
31
管理团队2006纪念徽章
日期:2006-04-16 22:44:452012新春纪念徽章
日期:2012-02-13 15:11:522012新春纪念徽章
日期:2012-02-13 15:11:522012新春纪念徽章
日期:2012-02-13 15:11:522012新春纪念徽章
日期:2012-02-13 15:11:52铁扇公主
日期:2012-02-21 15:02:402013年新春福章
日期:2013-02-25 14:51:242014年新春福章
日期:2014-02-18 16:41:11马上有车
日期:2014-02-18 16:41:11马上有车
日期:2014-02-19 11:55:14
48#
发表于 2005-2-19 06:49 | 只看该作者
sys@tiger> show sga

Total System Global Area   64036432 bytes
Fixed Size                   454224 bytes
Variable Size              54525952 bytes
Database Buffers            8388608 bytes
Redo Buffers                 667648 bytes
sys@tiger> alter system checkpoint;

System altered.

sys@tiger> select count(*) from v$cache where name in ( select segment_name from dba_rollback_segs);

  COUNT(*)
----------
       230

sys@tiger> select count(*) from v$cache where name in ( select segment_name from dba_rollback_segs);

  COUNT(*)
----------
       230

sys@tiger>

使用道具 举报

回复
论坛徽章:
1
授权会员
日期:2005-10-30 17:05:33
49#
发表于 2005-2-21 12:09 | 只看该作者

good

good

使用道具 举报

回复
论坛徽章:
92
2011新春纪念徽章
日期:2011-01-25 15:42:33咸鸭蛋
日期:2012-03-19 10:46:00版主1段
日期:2012-05-15 15:24:11奥运会纪念徽章:排球
日期:2012-08-29 07:02:50奥运会纪念徽章:跳水
日期:2012-09-26 06:44:27ITPUB 11周年纪念徽章
日期:2012-09-28 17:34:42ITPUB 11周年纪念徽章
日期:2012-10-09 18:03:32奥运会纪念徽章:击剑
日期:2012-10-12 07:20:332013年新春福章
日期:2013-02-25 14:51:242012新春纪念徽章
日期:2012-02-13 15:13:20
50#
发表于 2005-3-26 13:36 | 只看该作者

Re: Re: Re: o

最初由 玉面飞龙 发布
[B]

如果是这样的话,那apply redo 就不是简单的insert /update/delete了

以为恢复的时候smon 执行redo log中的普通sql 应用到数据库中,dml自动产生undo

觉得应该如此:

1修改block之前先将redo entry写入 redo buffer (lgwr写redo log file)
2将对应的undo写回滚段,写回滚段之前写回滚的redo entry到 redo buffer (lgwr写redo log file)
3修改block信息 (block写入到数据文件之前 保证对应redo entry已经写入redo log file)

如果第一步完成,数据库crash; 如果redo entry 在redo buffer  中,则恢复的时候不会处理该redo entry; 如果已经写入到redo log file,则按照没有提交的事务处理 而rolback 。 [/B]


如上部分我的理解有错误。应该是rainy说的先写undo的日志到log buffer.

1将对应的undo写回滚段,写回滚段之前写回滚的redo entry到 redo buffer (lgwr写redo log file)

2修改block之前先将data block redo entry写入 redo buffer (lgwr写redo log file)

3修改block信息 (block写入到数据文件之前 保证对应redo entry已经写入redo log file)

先写undo block redo entry表示恢复的时候就先将undo block redo 写到 undo block,如果rollback的话,也有内容可以rollback.

database recovery.ppt

326.5 KB, 下载次数: 203

使用道具 举报

回复

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

本版积分规则 发表回复

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