楼主: guoyJoe

【话题讨论】深入解析Oracle IMU模式下的REDO格式

[复制链接]
求职 : SAP实施
论坛徽章:
261
土豪章
日期:2018-07-10 16:19:05ITPUB18周年纪念章
日期:2018-09-17 10:09:49ITPUB18周年纪念章
日期:2018-09-17 10:12:57妮可·罗宾
日期:2018-10-28 13:07:10ITPUB18周年纪念章
日期:2018-11-13 15:31:24ITPUB18周年纪念章
日期:2018-11-13 15:40:4519周年集字徽章-庆
日期:2019-09-06 18:30:1219周年集字徽章-19
日期:2021-02-03 16:43:4820周年集字徽章-年	
日期:2023-07-21 18:25:26
21#
发表于 2014-1-3 13:24 | 只看该作者
求中奖!!

使用道具 举报

回复
论坛徽章:
0
22#
发表于 2014-1-3 13:31 | 只看该作者
Undo会产生Redo信息,又会写UNDO SEGMENT,进而又可能产生大量读取I/O,这些都是资源密集型操作。Oracle10g开始,Oracle在数据库中引入了In Memory Undo的新技术,使用这一技术,数据库会在共享内存中(Shared Pool)开辟独立的内存区域用于存储Undo信息,这样就可以避免Undo信息以前在Buffer Cache中的读写操作,从而可以进一步的减少Redo生成,同时可以大大减少以前的UNDO SEGMENT的操作。IMU中数据通过暂存、整理与收缩之后也可以写出到回滚段,这样的写出提供了有序、批量写的性能提升

使用道具 举报

回复
论坛徽章:
0
23#
发表于 2014-1-3 14:00 | 只看该作者
本帖最后由 miniid1 于 2014-1-6 09:13 编辑

1、什么是IMU?
In Memory Undo

2、在哪些场景下不会使用IMU特性?(Oracle10g出现了IMU,默认开启IMU)
打开辅助日志
开启FLASHBACK DATABASE
事务过大
RAC
非AUM

3、如何手动关闭IMU?
set _in_memory_undo to false

4、谈谈一条UPDATE语句从第一步到第九步的整个过程?在IMU模式下对REDO日志做DUMP分析(上图所示:IMU模式的REDO格式)。
1.要更改的值存PGA
2.在imu中生成undo change vector,保存前镜像
3.在private redo中生成数据块的redo change vector
4.apply redo change vector 到 数据块
5.apply undo change vector 到 undo block(这个好像不对,commit时才应用?)
6,7 session commit时,合并private redo中的redo change rector 和IMU中的 undo record到public log buffer  
8. session 等待lgwr写出log buffer到redo,写完session 返回
9. dbwr 在适当时候写出data block & undo block到data files

REDO日志做DUMP分析: 过2天有空时再来分析吧

5、IMU的主要作用是什么,也就是说为了解决什么问题?
IMU:
缓存undo change record,避免频繁读写undo block带来的性能问题,避开了buffer cache 一套繁琐的块管理机制(latch,pin,etc)。
a.apply 同一块undo block上的多个change vector只需一次写,不用想以前那样多次写。
b.构造CR block时,只需使用IMU,不需要访问undo block.

和private redo strand相互配合:
commit时批量写出到log buffer,减少几个log buffer相关的latch竞争(redo copy & redo allocation).
合并N个change vector为一个redo record,可以省去M个redo record header,减少redo size

解决问题: 性能问题:)

使用道具 举报

回复
论坛徽章:
0
24#
发表于 2014-1-3 14:04 | 只看该作者
在哪些场景下不会使用IMU特性?
1.开启了flashback
2. 加了supplemental log

使用道具 举报

回复
论坛徽章:
0
25#
发表于 2014-1-3 14:12 | 只看该作者
先顶一个,imu是啥缩小?

使用道具 举报

回复
论坛徽章:
0
26#
发表于 2014-1-3 14:26 | 只看该作者
开启IMU必须禁用supplemental log,如果查v$database里面SUPPLEMENTAL_LOG_DATA_PL为YES怎么设置为NO?

使用道具 举报

回复
论坛徽章:
6
2013年新春福章
日期:2013-02-25 14:51:24双黄蛋
日期:2013-05-04 22:01:39双黄蛋
日期:2013-07-24 20:45:33现代
日期:2013-09-22 17:37:09青年奥林匹克运动会-现代五项
日期:2014-09-12 16:09:06马上加薪
日期:2014-11-21 11:55:20
27#
发表于 2014-1-3 14:40 | 只看该作者
imu 最关键是减少dml对undo的高并发放,提高i/o使用率

使用道具 举报

回复
论坛徽章:
1
三菱
日期:2013-10-20 23:05:05
28#
发表于 2014-1-3 14:42 | 只看该作者
miniid1 发表于 2014-1-3 14:00
1、什么是IMU?
In Memory Undo

3.在private redo中生成数据块的redo change vector
4.apply redo change vector 到 数据块
5.apply undo change vector 到 undo block(这个好像不对,commit时才应用?)
6,7 session commit时,合并private redo中的redo change rector 和IMU中的 undo record到public log buffer  
8. session 等待lgwr写出log buffer到redo,写完session 返回

我记得是先合并成redo record 在去更改块。以前的机制也是,及时加上IMUoracle 不会更改这个机制。

使用道具 举报

回复
论坛徽章:
12
奥运纪念徽章
日期:2013-05-20 09:57:09问答徽章
日期:2014-03-04 13:57:52技术图书徽章
日期:2014-09-28 09:06:52
29#
发表于 2014-1-3 15:24 | 只看该作者
又一高深贴。看到5.1,5.2这些就怕

使用道具 举报

回复
论坛徽章:
0
30#
发表于 2014-1-5 13:20 | 只看该作者
traveldba 发表于 2014-1-3 14:42
3.在private redo中生成数据块的redo change vector
4.apply redo change vector 到 数据块
5.apply un ...

加上了IMU就和以前不一样。 IMU引入的另一个目的是:
以前每次更改数据块,Oracle要立即去更新undo block,都要生成相应的redo。 IMU顾名思义就是在内存中的undo,现在每次更改data block,Oracle 不用去更改这个undo block(也不会生成相应的redo了),而是把undo信息缓存到IMU里去了,只有最后commit或者flush IMU时,这些undo 信息才会批量更新到undo block,并生成redo。
在构造CR block时,不用像以前那样从undo block中获取undo record了,而是用IMU里的信息来构造cr block。private redo strand它是被一个事务独占的,oracle 只需获取一次 latch。 而IMU还要被其他session访问, 所以该事务每次访问IMU时都要获取latch。

使用道具 举报

回复

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

本版积分规则 发表回复

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