`
liwenshui322
  • 浏览: 520440 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Oracle redo 复杂度--oracle核心技术读书笔记三

 
阅读更多

 一. 概述

       我们知道,在oracle中,每修改一条数据都会生成一条重做数据(也就是redo,里面记录了修改后的内容)。目的就是为了将修改的数据备份,方便今后重做。现在有一个问题。oracle中只要修改数据,都会生成redo,这些redo会存放在一个叫做重做日志缓冲区里面。如果同时多个回话在修改数据,都要往重做日志缓冲区写入内容,就存在为同一片内存区域竞争的问题。存在竞争,就存在开销,这篇文章大概介绍一下,oracle如何尽量降低这种开销。

 

        二.  问题概述

       oracle中不断地修改数据,源源不断地生成重做日志。oracle先将这些日志写入到重做日志缓冲区(一片内存区域),然后调用LGWR进程将这些日志写入磁盘上的联机日志文件(一般是三个,一个50M的样子)。一个联机日志文件写满之后,切换到另一个日志文件。如果oracle开启了归档模式,在切换日志文件的时候,会将上一个写满的日志文件拷贝一份,叫做归档日志文件,保存到一个地方(或许是另外一台服务器,以防意外发生,方便做实例恢复或介质恢复)。看起来一切都很完美,问题就出在将日志写入到重做日志缓冲区,如果并发量大,并且每一个回话都修改很多数据,那么对重做日志缓冲区的竞争就会异常激烈。很有可能导致cpu会花费大量时间在latch自旋上(也就是占用了cpu的时间,但是cpu什么都没干)。

 

         三. 解决方案

         问题1: 一个会话不停地修改数据,需要不停地往redo buffer(重做日志缓冲区)写入内容,也就是要不断地获取redo allocation latch(保护重做日志缓冲区的一种锁,控制并发)。非常影响效率,特别是高并发的时候,你不一定能获取到锁。

        这里是否可以先把所有的redo生成,然后就获取一次redo allocation latch锁?答案是可以的,oracle中10g版本之后,提供了一种 private redo,也就是为每一个事物分配一个私有的redo buffer,你先在这里生成所有的重做日志。当事务提交的时候,获取一次redo allocation latch锁,将私有redo里面的内容,拷贝到公共redo buffer里面去。

       引申 问题2:如果不停地修改数据,就会不停地生成undo数据块,undo数据块的改变也会生成redo buffer。而且这些必须跟描述数据改变的redo buffer成对出现,而且必须同时写入到重做日志文件。原因如下:当将一个脏数据块,写入磁盘数据块的时候,必须要求先将对应描述这条数据改变的redo记录和记录这条数据旧数据的undo数据块对应的redo记录写入到磁盘的重做日志文件。否则就保证不了数据的一致性。oracle在没有引入private redo之前,将描述数据块改变前的undo块当做一般的数据块处理,undo块发生改变,也生成redo,同时输出到重做日志文件。以前的这种机制存在如下问题:如果另一个会话需要到undo块里面寻找旧数据,但是undo块已经被刷新输出到磁盘,那么还需要到磁盘去调取出来,存在一定的I/O开销。同时,在引入private redo之后,无法保证描述一条数据改变的redo和undo一起刷新输出到重做日志文件。

        为此,oracle引入了一个叫做IMU机制,也就是在内存区域另外为一个事务开辟一处私有的内存区域,专门用来存放描述undo数据块改变的redo记录。一个事务如果修改了10条数据,就会生成10条undo数据,从而产生10条描述undo改变的redo记录,存放在IMU里面。另外,加上描述数据本身改变的10条redo记录存放在private redo里面。总共是20条redo记录,如果事务提交的时候,就会将这20条redo记录合并成一条,从IMU和private redo拷贝到公共的redo buffer。当然,如果事务还没有提交,但是dbwn进程需要将其中3条脏数据刷新输出到磁盘,就会从imu和private redo里面分别取到这三条记录对于的redo记录,总共6条,合并成一条,然后拷贝到公共的redo buffer,进而刷新输出到磁盘。等到redo 刷新输出到磁盘成功,dbwn才能将脏数据刷新输出到磁盘。

 

        为此,如果我们一个事务修改了很多数据,oracle的大概操作如下:

        1. 获取成对的私有内存结构(也就是private redo:用来存放描述数据块的改变 和 IMU:用来存放描述对应undo数据块的改变),开启事务

        2. 修改数据,为每一个受影响的数据块打上标记(以表示“拥有私有内存结构”),但不真正改变数据。

        3. 将每一条还原改变向量(也就是描述undo数据改变)写到IMU池。

        4. 将每一条重做改变向量(也就是描述数据块改变)写到私有redo区。

        5. 将这两个内存结构的向量合并成一条重做改变记录。

        6. 将重做改变记录复制到重做日志缓冲区(也就是公共 redo buffer),并改变这个数据块。(这么看来,我上面写的,事务还没结束,dbwn进程将脏数据写入磁盘是不可能发生的,因为,最后才改变数据块)

0
0
分享到:
评论

相关推荐

    ORACLE 修改redo日志文件 大小的方法

    在Oracle数据库管理中,调整redo日志文件大小是一项重要的维护工作,这直接影响到数据库的性能与稳定性。本文将深入探讨如何在Oracle环境中修改redo日志文件的大小,以及这一操作的具体步骤和注意事项。 ### 一、...

    oracle核心技术读书笔记一附件1

    Oracle数据库是全球广泛使用的大型关系型数据库管理系统之一,其核心技术涉及数据存储、查询优化、并发控制、事务处理等多个方面。...通过阅读和理解这些读书笔记,可以提升对Oracle数据库的理解和操作能力。

    Oracle expert one-on-one

    《Oracle专家一对一》是Oracle领域的权威著作,作者Oracle Tom以其深厚的专业素养,全面解析了Oracle数据库的核心知识。这本书深入浅出地介绍了Oracle的物理结构、逻辑结构以及调优技术,对于想要深入理解Oracle...

    Oracle---文档总汇

    6. **Oracle9i_DBA手册(三)-计划和管理表空间.pdf**:表空间管理是Oracle数据库管理的重要部分,此文档可能涵盖了创建、扩展和管理表空间的策略和技术。 7. **Oracle 9i参考手册.pdf**:这是一份全面的参考资料,...

    ORACLE新体系-学习笔记.rar

    Oracle数据库系统的核心组成部分包括以下几个方面: 1. **数据库实例(Database Instance)**:Oracle数据库实例是由内存结构和后台进程组成的,它们共同协作以处理数据库的请求。主要包括数据缓冲区缓存、重做日志...

    ORACLE学习笔记-ORACLE(基本命令)

    这篇学习笔记主要涵盖了Oracle的基本命令,包括查看系统信息、管理表空间以及操作数据文件等核心知识点。 首先,了解Oracle的一些基本监控命令是非常重要的。例如,`SHOW SGA`命令用于查看系统全局区(System ...

    Oracle Redo并行机制

    Oracle Redo并行机制是Oracle数据库中用于优化日志写入性能的一种策略,尤其是在高并发和数据修改频繁的OLTP(在线事务处理)系统中。Redo日志是数据库恢复和事务持久化的关键组成部分,它记录了所有对数据库进行...

    ORACLE学习笔记-ORACLE(基本命令)

    Oracle数据库是世界上最流行的数据库管理系统之一,它提供了丰富的功能和高效的性能管理工具。本文将深入探讨Oracle的基本命令,帮助初学者理解和掌握Oracle数据库操作。 首先,查看Oracle系统信息是日常管理和故障...

    Oracle课堂笔记(很全很详细的Oracle笔记)

    根据提供的信息,我们可以总结出以下关于Oracle的相关知识点: ### Oracle基础知识与分类 #### DDL (Data Definition Language) 数据定义语言 - **DDL** 主要用于创建、修改或删除数据库对象,如表、索引等。 ###...

    ORACLE-database-backup.rar_oracle

    这可能涉及到使用Oracle的RMAN(恢复管理器)或其他第三方工具,进行数据文件的还原和控制文件、redo log文件的处理,最后可能还需要进行实例恢复和表空间的联机或离线恢复。 8. **安全性与备份加密**: 考虑到...

    Oracle备份恢复-redo文件损坏的各种场景恢复专题.docx

    Oracle数据库的恢复过程是数据库管理中的重要环节,特别是在redo文件损坏的情况下,恢复策略显得尤为重要。redo日志文件存储了数据库事务的所有更改信息,是保证数据一致性和完整性的关键组件。以下将详细介绍根据...

    oracle官方文档-Oracle Database Concepts

    《Oracle Database Concepts》是Oracle公司发布的官方文档,它详尽地介绍了Oracle数据库的核心概念、架构以及操作原理。这篇文档对于想要深入理解Oracle数据库的人来说,无疑是一份宝贵的资源。以下将根据文档内容,...

    oracle数据库管理--初级

    本课程“Oracle数据库管理--初级”旨在为初学者提供一个基础的Oracle DBA(数据库管理员)学习路径,帮助他们理解Oracle数据库的核心概念、安装配置以及基本管理操作。 Oracle数据库的基础知识包括以下几个关键点:...

    Redo Log之一:理解Oracle redo log

    Oracle重做日志(Redo Log)是Oracle数据库的一个关键组成部分,它记录了数据库的所有操作变化,保证了数据的完整性和一致性。在了解Oracle redo log之前,首先需要了解几个基础概念: 1. 数据库变化历史:Oracle ...

    oracle redo常用维护命令

    oracle redo常用维护命令

    oracle文档---dataguard概念_实操

    Oracle Data Guard是Oracle数据库系统提供的一种高可用性和灾难恢复解决方案,它通过创建并维护一个或多个备用数据库,来保护关键业务数据免受意外损失或系统故障的影响。在本压缩包中,"dataguard教材"包含了对Data...

    oracle原厂培训笔记

    ### Oracle原厂培训笔记知识点概览 #### 一、Oracle认证体系介绍 - **OCA (Oracle Certified Associate)**: 入门级别的Oracle...这些知识点不仅有助于理解Oracle的核心技术,也为后续的学习和实践提供了坚实的基础。

    涂抹Oracle 三思笔记之一步一步学Oracle

    但我可以根据标题“涂抹Oracle 三思笔记之一步一步学Oracle”和给定的相关知识点要求,构造一篇关于Oracle数据库学习的基础知识点文章,以满足您的需求。 Oracle数据库是全球范围内广泛使用的企业级关系数据库管理...

    ORACLE redo undo.docx

    Oracle redo undo 机制详解 Oracle redo undo 是 Oracle 数据库中的一种机制,用于确保事务的可恢复性和撤销性。下面是对 redo undo 机制的详细解释。 redo 机制 redo 机制是 Oracle 数据库中的一种机制,用于...

Global site tag (gtag.js) - Google Analytics