Home  >  Article  >  Database  >  Oracle redo 原理

Oracle redo 原理

WBOY
WBOYOriginal
2016-06-07 17:27:131006browse

Oracle通过Latch来保护和协调Redo Logo Buffer的工作。同Redo相关的Latch主要有Redo Copy Latch、Redo Allocation Latch等,Redo

Redo Log Buffer位于sga_max_size之中,,其保存数据库变更的相关信息。这些信息以重做条目(Redo Entries)形式存储(Redo Entries也经常被称为Redo Records)。Redo Entries包含重构、重做数据库变更的重要信息,这些变更包括INSERT、UPDATE、DELETE、CREATE、ALTER或都DROP等。


Redo Entries的内容被Oracle数据库进程从用户的内存空间(PGA)复制到sga_max_size中的Redo Logo Buffer之中。Redo Entries在内存中占用连续的顺序空间,由于Redo Log Buffer是循环使用的。


Log Switch会触发一个检查点,促使DBWR进程将写满的日志文件保护的变更数据写回到数据库。


Oracle通过Latch来保护和协调Redo Logo Buffer的工作。同Redo相关的Latch主要有Redo Copy Latch、Redo Allocation Latch等,Redo Allocation Latch用于管理Log Buffer内存空间的分配,Redo Copy Latch则用于写Redo Log Buffer过程的保护。


## _log_simultaneous_copies用来定义允许同时写的Redo的Redo Copy latch的数量。缺省为CPU的2倍。
SYS@ orcl> @GetHidPar
Enter value for par: log_simultaneous
NAME                          VALUE          PDESC
------------------------------ --------------- --------------------------------------------------
_log_simultaneous_copies      2              number of simultaneous copies into redo buffer(# o
                                              f copy latches)


从v$latch视图可以得到关于Redo Copy Latch的汇总信息:
SYS@ orcl> select name, gets, immediate_gets, immediate_misses, spin_gets from v$latch where name = 'redo copy';
NAME                                GETS IMMEDIATE_GETS IMMEDIATE_MISSES  SPIN_GETS
------------------------------ ---------- -------------- ---------------- ----------
redo copy                              10          54084                6          0

 

SYS@ orcl> select addr, latch#, child#, name, gets, immediate_gets, immediate_misses from v$latch_children where name = 'redo copy';
ADDR        LATCH#    CHILD# NAME            GETS IMMEDIATE_GETS IMMEDIATE_MISSES
-------- ---------- ---------- ---------- ---------- -------------- ----------------
506E3CFC        181          2 redo copy          5              0                0
506E3C84        181          1 redo copy          5          54628                6


Redo Copy Latch获取以后,进程紧接着需要获取Redo Allocation Latch,分配Redo空间,空间分配完成以后,Redo Allocation Latch即被释放,进程把PGA里临时存放的Redo信息COPY入Redo Logo Buffer,COPY完成以后,redo copy latch释放。


为了避免LGWR被不必要的通知,进程需要先获取Redo Writing Latch去检查LGWR是否已经激活或都已经被通知。如果LGWR已经激活或被Post,Redo Writing Latch将被释放。
SYS@ orcl> select addr, latch#, name, gets, misses, immediate_gets, immediate_misses from v$latch where name = 'redo writing';
ADDR        LATCH# NAME                      GETS    MISSES IMMEDIATE_GETS IMMEDIATE_MISSES
-------- ---------- -------------------- ---------- ---------- -------------- ----------------
20011204        180 redo writing                503          0              0                0


在执行Redo Copy的过程中,进程以Log File Sync事件处于等待。当进程从Log File Sync中等待醒来以后,进程需要重新获得Redo Allocation Latch检查是否相应的Redo已经被写入Redo Log File,如果尚未写入,进程必须继续等待。


如果对于一个繁忙的数据库系统,该Latch通常也是竞争激烈的Latch之一。


Oracle 9i Redo的增强
在9iR2中,Oracle通过LOG_PARALLELISM定义Oracle中redo allocation的并发级别。如果定义LOG_PARALLELISM大于1,那么数据库将分配多个共享的Redo Log Buffer区域,每个共享Buffer都有独立的Redo Allocation Latch进行保护,从而提高了Redo的并发性能,多个Redo Log Buffer可是被看作是Redo Log Buffer的子池,与Shared Pool的多个Subpool原理类似。多个Redo Log Buffer以被称为Public Redolog Strands。


 


SYS@ orcl> select name, gets, misses, immediate_gets, immediate_misses from v$latch where name in ('redo allocation', 'redo copy');
NAME                  GETS    MISSES IMMEDIATE_GETS IMMEDIATE_MISSES
---------------- ---------- ---------- -------------- ----------------
redo copy                14          0          96869              10
redo allocation        5400          3          96869                0


如果miss对gets比率超过1%,或都immediate_misses对(IMMEDIATE_MISSES + IMMEDIATE_GETS)比率超过1%,那么通常认为存在Latch竞争。


当主机拥有16~64个CUP时,Oracle推荐设置LOG_PARMLLELISM在2~8之间,这个参数可以提高应用的性能。

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn