[Oracle] Redo&Undo梳理
2015-05-15 09:23
375 查看
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的输出:
Latch | Gets | Im_Gets |
---|---|---|
redo copy | 0 | 51 |
redo allocation | 53 | 0 |
Name | Value |
---|---|
redo entries | 51 |
redo size | 12,668 |
Latch | Gets | Im_Gets |
---|---|---|
redo copy | 0 | 1 |
redo allocation | 5 | 1 |
In memory undo latch | 53 | 1 |
Name | Value |
---|---|
redo entries | 1 |
redo size | 12,048 |
测试中发现, 貌似竞争问题转移了?
待跟进:
分析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 9i & 10g编程艺术-深入数据库体系结构——第9章:redo与undo
- Oracle Undo & Redo
- oracle REDO和UNDO・
- oracle笔记整理2——redo与undo
- Oracle Core 学习笔记一 -- Redo 和 Undo 机制详解
- oracle REDO UNDO的区别
- Oracle Core 学习笔记一 -- Redo 和 Undo 机制详解
- Oracle UNDO Tablespace size & Table Size
- Learning Undo&Redo
- Oracle TEMPFILE&ONLINE REDO LOG OPERATION
- Oracle redo 日志切换时间频率
- oracle undo与redo的区别
- Oracle Core 学习笔记一 -- Redo 和 Undo 机制详解
- Oracle Undo Redo通俗理解
- oracle的redo和undo
- oracle 谁在用undo
- Oracle Redo and Undo
- Oracle redo undo commit rollback剖析
- Oracle Core 学习笔记一 -- Redo 和 Undo 机制详解
- oracle(十二)redo 与 undo