[Oracle] Redo&Undo梳理
Oracle Redo&undo
Oracle中的redo和undo是关键技术的核心, 诸如实例恢复, 介质恢复, DataGuard, 闪回机制等都是给予redo和undo的, 所以很有必要详细梳理这块的知识, 总结记录.
数据变化日志
当我们改变一个数据块时, 都记录了哪些日志, 具体是怎么样的流程呢?
当在Oracle中改变一条数据时, 不仅仅要在数据文件里(可能在buffer里直接找到)找到并修改数据, 更重要的是需要做完善的日志记录, 具体如下:
- 创建一个重做改变向量, 描述如何往undo块插入一条undo记录(即undo的redo日志)
- 创建一个重做改变向量, 描述数据块的变化(即data的redo日志)
- 合并这两个重做改变向量为一条日志记录, 并写到重做日志缓冲区
- 向undo块插入undo记录
- 改变数据块中的数据
图1: 更新操作经历的事件时序图
Redo
redo处理方式:
session -> redo日志 -> 写入redo log buffer -> 写到redo日志文件(循环利用) -> 归档到日志中
写redo log buffer会成为系统的瓶颈
session每次数据更改都会插入一条redo记录到buffer中, 一个session可能很短时间内做了很多更改, 同时可能有很多session并发操作, 却只有一个redo log buffer.
老机制, redo allocation latch: 保护redo log buffer, 控制对共享区内存的访问.
session -> 请求redo allocation latch -> 为写入到buffer的信息预留一些空间
避免了多个进程同时写入buffer相同部分的风险.
大并发系统会出现latch竞争, cpu空转
新机制, private redo和IMU(In-Memory undo)
在session的整个事务期间内, 生成所有改变向量, 写入private redo log buffer(PGA中), 当事务提交时, session会将private redo buffer中的记录copy到公共redo log buffer中.
一个session在一次事务里只需要获取一次公共的redo allocation latch.
e.g
脚步更新表记录, 观察期间latch统计信息.
9i的输出:
Gets Im_Gets opy 0 llocation 53 alue ntries ize 10g的输出:
Gets Im_Gets opy 0 llocation 5 ory undo latch 53 alue ntries ize
10g里, redo copy latch只命中了一次; redo allocation latch也get很少; 只生成了一个redo entry;
测试中发现, 貌似竞争问题转移了?
待跟进:
- 分析v$latch_children, 搞清楚为什么latch活动的变化不是新的威胁(瓶颈);
- 分析重做日志, 搞清楚那个大的日志条目(redo entry)都记录了什么;
- 分析动态性能表(x$kcrfstrand和x$ktifp), 理解各种实例活动信息是如何串联到一起的;
redo的2组内存结构:
- x$kcrfstrand, 私有redo区: 处理"前滚"改变向量(私有redo区里也包含传统的"公共"redo log buffer);
- x$ktifp, IMU区: 处理undo改变向量;
IMU区中有N多IMU池, N取决于数据库参数transactions/10, 每个池都有自己的latch.
x$ktifp中的每条记录(即IMU)在x$kcrfstrand中都有对应的一条private redo记录.
x$kcrfstrand中的每条private redo记录都由其自身的redo allocation latch保护, 每条"公共"的重做记录都由传统的redo copy latch保护.
In-Memory undo latch(IMU latch):
任何一个改变都会产生一次对IMU latch的访问, 用一个latch(IMU latch)代替两个(redo allocation latch与redo copy latch), 至少latch竞争是减半了.
IMU latch有许多子latch, 每个子latch负责一个IMU内存区域(池).
新机制的redo allocation latch:
2种latch:
- 一类保护私有redo线程(private redo thread)
- 另一类保护公共redo线程(public redo thread)
每个线程都有自己的latch
undo
读一致性
块的ITL entries里必须包含一个指向undo记录的指针(指针是有限的)
回滚
[Oracle] Redo&Undo梳理的更多相关文章
- Oracle redo undo
通常对undo有一个误解,认为undo用于数据库物理地恢复到执行语句或事务之前的样子,但实际上并非如此.数据库只是逻辑地恢复到原来的样子,所有修改都被逻辑地取消,但是数据结构以及数据库块本身在回滚后可 ...
- Oracle redo/undo 原理理解
一. 什么是redo(用于重做数据) redo也就是重做日志文件(redo log file),Oracle维护着两类重做日志文件:在线(online)重做日志文件和归档(archived)重做日志文 ...
- Oracle redo与undo
Undo and redo Oracle最重要的两部分数据,undo 与redo,redo(重做信息)是oracle在线(或归档)重做日志文件中记录的信息,可以利用redo重放事务信息,undo(撤销 ...
- 记一次ORACLE的UNDO表空间爆满分析过程
这篇文章是记录一次ORACLE数据库UNDO表空间爆满的分析过程,主要整理.梳理了同事分析的思路.具体过程如下所示: 早上收到一数据库服务器的UNDO表空间的告警邮件,最早一封是7:55发出的(监控作 ...
- Oracle Redo Log 机制 小结(转载)
Oracle 的Redo 机制DB的一个重要机制,理解这个机制对DBA来说也是非常重要,之前的Blog里也林林散散的写了一些,前些日子看老白日记里也有说明,所以结合老白日记里的内容,对oracle 的 ...
- 实验记录:Oracle redo logfile的resize过程
实验记录:Oracle redo logfile的resize过程. 实验环境:RHEL 6.4 + Oracle 11.2.0.3 单实例 文件系统 实验目的:本实验是修改redo logfile的 ...
- 如何让Oracle释放undo表空间
如何让Oracle释放undo表空间 最佳答案 在日常的数据库维护和数据库编程中经常会遇到犹豫对大数据量做DML操作后是得ORACLE的undo表空间扩展到十几个G或者几十个G 但是这些表空间 ...
- [Oracle]理解undo表空间
一.回退段介绍 在Oracle数据库中,当某个事物对数据进行修改时,Oracle首先将数据的原始值保存到一个回退段中.一个事物只能将它的回退信息保存到一个回退段中,而多个并行事物可以使用同一个回退段. ...
- Innodb 实现高并发、redo/undo MVCC原理
一.并发控制 因为并发情况下有可能出现不同线程对同一资源进行变动,所以必须要对并发进行控制以保证数据的同一与安全. 可以参考CPython解释器中的GIL全局解释器锁,所以说python中没有 ...
随机推荐
- OAuth2.0 social_django微博第三方登录
python网站第三方登录,social-auth-app-django模块, social-auth-app-django模块是专门用于Django的第三方登录OAuth2协议模块 目前流行的第三方 ...
- 动态规划:HDU1160-FatMouse's Speed(记录动态规划状态转移过程)
FatMouse's Speed Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- 扩展MarkDown表格
一直不知道表格中的:是什么意思,看了GcsSloop的这篇文章后恍然大悟,做下记录. 原文链接 第二行分割线部分可以使用 : 来控制内容状态 MarkDown : | 默认 | 靠右 | 居中 | 靠 ...
- 数据结构之B-树
作为文件系统索引的常用数据结构,B-树的查找涉及硬盘和内存两个部分,硬盘的读写将影响查找的速度.传统关系型数据库如Mysql采用B-树作为索引,新型内存数据库levledb通过改进数据组织方式通过内存 ...
- laravel5.2总结--本地化以及常量的使用
1.本地化 Laravel 的本地化功能提供方便的方法来获取多语言的字符串,让你的网站可以简单的支持多语言. 语言包存放在 resources/lang 文件夹的文件里.每一个子目录应该对应一种语言 ...
- 如何将int转换为datetime?
$timestamp = 1210003200; $datetime = date('Y-m-d H:i:s', $timestamp); echo "该时间戳代表的时间:", $ ...
- 设计模式之序章-UML类图那点事儿
设计模式之序-UML类图那点事儿 序 打14年年底就像写那么一个系列,用于讲设计模式的,代码基于JAVA语言,最早接触设计模式是大一还是大二来着,那时候网上有人给推荐书,其中就有设计模式,当时给我推荐 ...
- 【BZOJ 3620】似乎在梦中见过的样子
题目 (夢の中で逢った.ような--) 「Madoka,不要相信 QB!」伴随着 Homura 的失望地喊叫,Madoka 与 QB 签订了契约. 这是 Modoka 的一个噩梦,也同时是上个轮回中所发 ...
- RSA进阶之维纳攻击(wiener-attack )
维纳攻击: 场景:e很大 例题: 第七届山东网络安全技能大赛 链接:https://pan.baidu.com/s/1IRInw3pB7SQfp3MxRJW17A 提取码:lcn3 e很大,妥了,维纳 ...
- vlc无法播放.flv视频文件
解决方法:https://videoconverter.wondershare.com/vlc/flv-not-displaying-video-vlc-media-player.html. 在pre ...