zoukankan      html  css  js  c++  java
  • [Oracle] Redo&Undo梳理

    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记录的指针(指针是有限的)

      • 回滚

  • 相关阅读:
    Delphi从Internet下载文件
    datasnap 上传/下载大文件(本Demo以图传片文件为例)
    delphi 理解ParamStr
    delphi2010多线程编程教程
    QQ2008自动聊天精灵delphi源码
    Delphi使用Indy、ICS组件读取网页
    UniDac 使用日记(转)
    delphi xe5 安卓 配置sqlite
    Netty内存管理器ByteBufAllocator及内存分配
    初识内存分配ByteBuf
  • 原文地址:https://www.cnblogs.com/renolei/p/4505096.html
Copyright © 2011-2022 走看看