Oracle Redo&undo

Oracle中的redo和undo是关键技术的核心, 诸如实例恢复, 介质恢复, DataGuard, 闪回机制等都是给予redo和undo的, 所以很有必要详细梳理这块的知识, 总结记录.

  1. 数据变化日志

    当我们改变一个数据块时, 都记录了哪些日志, 具体是怎么样的流程呢?

    当在Oracle中改变一条数据时, 不仅仅要在数据文件里(可能在buffer里直接找到)找到并修改数据, 更重要的是需要做完善的日志记录, 具体如下:

    • 创建一个重做改变向量, 描述如何往undo块插入一条undo记录(即undo的redo日志)
    • 创建一个重做改变向量, 描述数据块的变化(即data的redo日志)
    • 合并这两个重做改变向量为一条日志记录, 并写到重做日志缓冲区
    • 向undo块插入undo记录
    • 改变数据块中的数据

    图1: 更新操作经历的事件时序图

  2. 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

  3. undo

    • 读一致性

      块的ITL entries里必须包含一个指向undo记录的指针(指针是有限的)

    • 回滚

[Oracle] Redo&Undo梳理的更多相关文章

  1. Oracle redo undo

    通常对undo有一个误解,认为undo用于数据库物理地恢复到执行语句或事务之前的样子,但实际上并非如此.数据库只是逻辑地恢复到原来的样子,所有修改都被逻辑地取消,但是数据结构以及数据库块本身在回滚后可 ...

  2. Oracle redo/undo 原理理解

    一. 什么是redo(用于重做数据) redo也就是重做日志文件(redo log file),Oracle维护着两类重做日志文件:在线(online)重做日志文件和归档(archived)重做日志文 ...

  3. Oracle redo与undo

    Undo and redo Oracle最重要的两部分数据,undo 与redo,redo(重做信息)是oracle在线(或归档)重做日志文件中记录的信息,可以利用redo重放事务信息,undo(撤销 ...

  4. 记一次ORACLE的UNDO表空间爆满分析过程

    这篇文章是记录一次ORACLE数据库UNDO表空间爆满的分析过程,主要整理.梳理了同事分析的思路.具体过程如下所示: 早上收到一数据库服务器的UNDO表空间的告警邮件,最早一封是7:55发出的(监控作 ...

  5. Oracle Redo Log 机制 小结(转载)

    Oracle 的Redo 机制DB的一个重要机制,理解这个机制对DBA来说也是非常重要,之前的Blog里也林林散散的写了一些,前些日子看老白日记里也有说明,所以结合老白日记里的内容,对oracle 的 ...

  6. 实验记录:Oracle redo logfile的resize过程

    实验记录:Oracle redo logfile的resize过程. 实验环境:RHEL 6.4 + Oracle 11.2.0.3 单实例 文件系统 实验目的:本实验是修改redo logfile的 ...

  7. 如何让Oracle释放undo表空间

    如何让Oracle释放undo表空间   最佳答案   在日常的数据库维护和数据库编程中经常会遇到犹豫对大数据量做DML操作后是得ORACLE的undo表空间扩展到十几个G或者几十个G 但是这些表空间 ...

  8. [Oracle]理解undo表空间

    一.回退段介绍 在Oracle数据库中,当某个事物对数据进行修改时,Oracle首先将数据的原始值保存到一个回退段中.一个事物只能将它的回退信息保存到一个回退段中,而多个并行事物可以使用同一个回退段. ...

  9. Innodb 实现高并发、redo/undo MVCC原理

    一.并发控制   因为并发情况下有可能出现不同线程对同一资源进行变动,所以必须要对并发进行控制以保证数据的同一与安全.   可以参考CPython解释器中的GIL全局解释器锁,所以说python中没有 ...

随机推荐

  1. poj 3258 跳房子问题 最大化最小值

    题意:奶牛跳房子,从n块石头中移除M块,使得间距最小的最大值?思路:“转换” 从N块中选择n-m块使得两两之间的间距尽可能大 c(d) 是间距最大的满足条件,即第一块 放在 xi的位置 下一块就要放在 ...

  2. Django--源码安装

    1.安装setuptools cd /usr/src tar zxf setuptools-18.3.2.tar.gz cd setuptools-18.3.2/ python setup.py bu ...

  3. Mybatis一个参数判断

    一:List<UserVo> list(@Param("nickName") String nickName); <select id="list&qu ...

  4. java高级编程技巧

    1. boolean a= b==null;这句话很亮. public class Test { public static void main(String[] args) { String b=& ...

  5. 驱动模块 .ko

    模块: 模块机制,作用搞高LINUX操作系统的扩充性. 1. 模块概念: 1.动态可加载内核模块LKM 2.内核空间运行 3.是不是一执行文件,是一个没有经过链接,不能独立运行的一个目标文件(.c-& ...

  6. 极简Node教程-七天从小白变大神(一:你需要Express)

    如果说用一句话来概括Node那就是:它开启了JavaScript服务器端语言. Node系列的文章并不会从一开始长篇概论的讲Node的历史,安装,以及其他很琐碎的事情.只会专门介绍关于Node或者准确 ...

  7. 学习python3之路的第一个小代码-----------9*9乘法表

    这个编写的简单,用两个循环迭代就行.下面就是我写的编码以及输出的结果 1 #!/usr/bin/env python 2 # encoding: utf-8 3 4 i = 1 5 6 while i ...

  8. 菜鸟之路——机器学习之KNN算法个人理解及Python实现

    KNN(K Nearest Neighbor) 还是先记几个关键公式 距离:一般用Euclidean distance   E(x,y)√∑(xi-yi)2 .名字这么高大上,就是初中学的两点间的距离 ...

  9. 深入学习之mysql(一)数据库操作

    1.显示所有数据库: SHOW DATABASES; 2.创建数据库: CREATE DATABASE 数据库名: 3.选择你所创建的数据库: USE 数据库名; 4.删除数据库: DROP 数据库名 ...

  10. Solr linux安装

    1.下载安装(自行官网下载) 2.解压安装包 3.进入解压后的bin目录执行命令: ./solr start 出现如下警告: 根据提示修改solr.in.sh中的SOLR_ULIMIT_CHECKS属 ...