Oracle redo 原理

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之间,这个参数可以提高应用的性能。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/1898170.html

(0)
上一篇 2025年2月22日 14:16:05
下一篇 2025年2月22日 14:16:19

AD推荐 黄金广告位招租... 更多推荐

相关推荐

发表回复

登录后才能评论