`

Oracle Redo 并行机制 (shared strand private strand)

 
阅读更多

Redo log 是用于恢复和一个高级特性的重要数据,一个redo条目包含了相应操作导致的数据库变化的所有信息,所有redo条目最终都要被写入redo文件中去。

 

Redo log buffer是为了避免Redo文件IO导致性能瓶颈而在sga中分配出的一块内存。一个redo条目首先在用户内存(PGA)中产生,然后由oracle服务进程拷贝到log buffer中,当满足一定条件时,再由LGWR进程写入redo文件。由于log buffer是一块“共享”内存,为了避免冲突,它是受到redo allocation latch保护的,每个服务进程需要先获取到该latch才能分配redo buffer。因此在高并发且数据修改频繁的oltp系统中,我们通常可以观察到redo allocation latch的等待。Redo写入redo buffer的整个过程如下:

 

     在PGA中生产Redo Enrey -> 服务进程获取Redo Copy latch(存在多个---CPU_COUNT*2) -> 服务进程获取redo allocation latch(仅1个) -> 分配log buffer -> 释放redo allocation latch -> 将Redo Entry写入Log Buffer -> 释放Redo Copy latch;

 

shared strand

    为了减少redo allocation latch等待,在oracle 9.2中,引入了log buffer的并行机制。其基本原理就是,将log buffer划分为多个小的buffer,这些小的buffer被成为strand(为了和之后出现的private strand区别,它们被称之为shared strand)。每一个strand受到一个单独redo allocation latch的保护。多个shared strand的出现,使原来序列化的redo buffer分配变成了并行的过程,从而减少了redo allocation latch等待。

 

    shared strand的初始数据量是由参数log_parallelism控制的;在10g中,该参数成为隐含参数,并新增参数_log_parallelism_max控制shared strand的最大数量;_log_parallelism_dynamic则控制是否允许shared strand数量在_log_parallelism和_log_parallelism_max之间动态变化。

 

每一个shared strand的大小 = log_buffer/(shared strand数量)。strand信息可以由表x$kcrfstrand查到(包含shared strand和后面介绍的private strand,10g以后存在)。

Private strand

 

   为了进一步降低redo buffer冲突,在10g中引入了新的strand机制——Private strand。Private strand不是从log buffer中划分的,而是在shared pool中分配的一块内存空间。

 

    Private strand的引入为Oracle的Redo/Undo机制带来很大的变化。每一个Private strand受到一个单独的redo allocation latch保护,每个Private strand作为“私有的”strand只会服务于一个活动事务。获取到了Private strand的用户事务不是在PGA中而是在Private strand生成Redo,当flush private strand或者commit时,Private strand被批量写入log文件中。如果新事务申请不到Private strand的redo allocation latch,则会继续遵循旧的redo buffer机制,申请写入shared strand中。

 

 对于使用Private strand的事务,无需先申请Redo Copy Latch,也无需申请Shared Strand的redo allocation latch,而是flush或commit是批量写入磁盘,因此减少了Redo Copy Latch和redo allocation latch申请/释放次数、也减少了这些latch的等待,从而降低了CPU的负荷。过程如下:

 

    事务开始 -> 申请Private strand的redo allocation latch (申请失败则申请Shared Strand的redo allocation latch) -> 在Private strand中生产Redo Enrey -> Flush/Commit -> 申请Redo Copy Latch -> 服务进程将Redo Entry批量写入Log File -> 释放Redo Copy Latch -> 释放Private strand的redo allocation latch 

 

   注意:对于未能获取到Private strand的redo allocation latch的事务,在事务结束前,即使已经有其它事务释放了Private strand,也不会再申请Private strand了。

 

  有时候,当logfile切换后(和checkpoint一样,切换之前必须要将所有Private strand的内容flush到logfile中,因此我们在alert log中可能会发现日志切换信息之前会有这样的信息:"Private strand flush not complete",这是可以被忽略的),会重新根据切换后的logfile的大小计算对Private strand的限制.

 

  如果logfile足够大,_log_private_parallelism_mul与实际活跃进程百分比基本相符的话,Private strand的引入基本可以消除redo allocation latch的争用问。

分享到:
评论

相关推荐

    Oracle Redo并行机制

    总的来说,Oracle Redo并行机制通过Shared Strand和并行分配机制,有效地降低了Redo Log Buffer访问的冲突,提升了在高并发环境下的数据库性能。通过调整`log_parallelism`等参数,数据库管理员可以根据系统的实际...

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

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

    ORACLE redo undo.docx

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

    oracle redo常用维护命令

    oracle redo常用维护命令

    Redo Log之一:理解Oracle redo log

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

    介绍Oracle redo log 恢复步骤的文档

    在Oracle数据库系统中,Redo Log机制是确保数据一致性和可靠性的关键组件之一。它记录了所有对数据库所做的更改,以便在出现故障时能够进行恢复操作。本文档将详细介绍Oracle Redo Log的工作原理以及如何利用Redo ...

    Oracle_Undo与Redo的通俗

    Oracle中的Undo和Redo是两个非常重要的概念,它们都是Oracle数据库中事务管理和恢复机制的关键组件。Undo和Redo都是为了确保数据库的一致性和可靠性。 什么是REDO? REDO记录transaction logs,分为online和...

    oracle_redo_undo

    Oracle 中的 redo 和 undo 机制是数据库的核心组件,它们一起协作以确保数据库的事务一致性和可靠性。在本文中,我们将深入探讨 redo 和 undo 机制的工作原理和协作机制。 Undo Mechanism Undo 机制是 Oracle 中的...

    oracle redo internal

    oracle redo internal

    redo 维护 oracle

    在Oracle数据库系统中,redo日志(也称为重做日志)是至关重要的组件,它记录了所有对数据库所做的事务性更改。理解并维护redo日志对于确保数据完整性和能够进行有效的故障恢复至关重要。以下是对redo日志及其维护的...

    Oracle工作总结——日志文件切换频率的调整

    Oracle数据库的日志文件切换频率是数据库管理中的一个重要参数,它直接影响到系统的性能和稳定性。当日志文件频繁切换,可能表明数据库活动剧烈,这可能导致I/O瓶颈,影响系统响应时间。相反,如果切换频率过低,...

    Oracle redo 异常暴增 日志挖掘 logminer

    Oracle Redo日志是数据库系统中的重要组成部分,用于记录事务对数据块的修改,确保数据在系统崩溃或异常情况下的可恢复性。当Redo日志异常暴增时,这通常意味着数据库活动增加,或者存在某些问题导致了不必要的日志...

    oracle的undo与redo

    在Oracle中,日志文件发挥着关键作用,其中Undo日志和Redo日志是最核心的两种日志类型。 Undo日志,也称为撤销日志,主要用于事务处理中。它的主要作用是记录事务执行之前的数据库状态,即数据块在被修改之前的所有...

    Oracle DG下修改redo log和standby redo log日志大小.txt

    Oracle DG下修改redo log和standby redo log日志大小.txt

    数据库,oracle机制,Oracle数据库机制

    ### Oracle数据库机制详解 在深入探讨Oracle数据库机制之前,我们先简单回顾一下Oracle数据库的基本概念。Oracle数据库是一款高性能的关系型数据库管理系统,广泛应用于各种企业级应用中。它提供了丰富的功能来确保...

    用Oracle并行查询发挥多CPU的威力

    Oracle并行查询(OPQ)是Oracle数据库系统中一项强大的特性,它利用现代硬件的多处理器能力,显著提升大规模数据操作的效率。随着硬件的进步,尤其是对称多处理(SMP)服务器的普及,Oracle从Oracle8i版本开始在各个...

    REDO文件block损坏的解决方法

    在Oracle数据库管理中,遇到REDO文件block损坏的情况是一种较为复杂且紧急的问题,尤其是在Oracle 8版本中。本文将详细解析此类问题的成因、影响以及解决方案,旨在为数据库管理员提供一套行之有效的应对策略。 ###...

    ORACLE的工作机制.rar

    10. **并行执行**:Oracle支持并行查询和并行DML(数据操纵语言),通过将任务分解为子任务分配给多个进程或线程,以加速处理。 总结来说,Oracle的工作机制是复杂的,涉及到数据库设计、存储、查询优化、并发控制...

    Oracle重做日志机制

    Oracle 重做日志机制是Oracle数据库中至关重要的部分,它确保了数据库的持久性和可恢复性。在Oracle中,重做日志记录了数据库的所有更改操作,以便在系统出现故障时可以恢复数据。以下是对Oracle重做日志机制的详细...

Global site tag (gtag.js) - Google Analytics