oracle内部运行机制之Redo 和 Latch

本文深入解析了并发系统中Oracle如何通过Latches保护和协调Redo Log Buffer的工作,包括Redocopylatch、redoallocationlatch等关键组件的作用。详细介绍了redo流程,包括redo的生成、复制、分配、通知LGWR执行写出,以及相关latch的使用场景和影响,特别关注了红黑树同步等待和redoallocationlatch的竞争情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

好记性,不如记 博客,多做笔记,多勤学。


在一个并发系统中,用户进程都需要向Redo Log Buffer写入重做数据,Oracle 通过Latch来保护和协调Redo Log Buffer的工作,同时还有Redo copy latch 、redo allocation latch等。Redo copy latch负责写redo内容到Redo log buffer过程的保护,redo allocation latch用户管理Log buffer内存空间的分配。

一个进程在修改数据时就会产生redo,redo首先在PGA中保存,当进程需要将Redo信息Copy进入Redo log buffer时需要获得redo copy latch的保护,获得了该latch以后才能把redo拷贝到log buffer中。redo copy latch 表明正在把redo拷贝到log buffer中,在此过程中,LGWR应该等待直到进程拷贝完成才能把目标log buffer block写入磁盘。

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               79         293346               18          0

Redo copy latch获取以后,进程紧跟着需要获取redo allocation latch,分配redo空间,空间分配完成后,redo allocation latch会立刻释放,进程把PGA里临时存放的redo信息copy到redo log buffer,copy完成后,redo copy latch也会释放。

 在完成redocopy以后,进程可能需要通知LGWR去执行写出。为了避免LGWR被不必要的通知,进程需要先获取redo writting latch 去检查LGWR是否已经激活或者被通知,如果LGWR已经被激活或者通知,redo writing latch将被释放。
SQL> 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
---------------- ---------- --------------- ---------- ---------- -------------- ----------------
000000000822B7E0        180 redo writing         40901          0              0                0

如果redo writing latch竞争过多,可能以为着提交过于频繁,会导致log file sync等待事件。在执行redo copy 的过程中,进程以log file sync 事件处于等待,当进程从log file sync中等待中唤醒以后,进程需要重新获得redo allocation latch检查是否相应的redo已经写入redo log file,如果尚未写入,进程必须继续等待 。

当进程需要向redo log buffer 写入redo信息时需要获得redo allocation latch,分配redo log buffer空间。所以,如果数据库处于比较繁忙状态,那么redo allocation latch通常也是竞争比较激烈的latch之一。
SQL> select addr,latch#,name,gets,misses,immediate_gets,immediate_misses from v$latch_children wh
 name = 'redo allocation';


ADDR                 LATCH# NAME                  GETS     MISSES IMMEDIATE_GETS IMMEDIATE_MISSES
---------------- ---------- --------------- ---------- ---------- -------------- ----------------
000007FC6DDB0F70        182 redo allocation         27          0              0                0
000007FC6DDB0ED0        182 redo allocation         27          0              0                0
000007FC6DDB0E30        182 redo allocation         27          0              0                0
000007FC6DDB0D90        182 redo allocation         27          0              0                0
000007FC6DDB0CF0        182 redo allocation         27          0              0                0
000007FC6DDB0C50        182 redo allocation         27          0              0                0
000007FC6DDB0BB0        182 redo allocation         27          0              0                0
000007FC6DDB0B10        182 redo allocation         27          0              0                0
000007FC6DDB0A70        182 redo allocation         27          0              0                0
000007FC6DDB09D0        182 redo allocation         27          0              0                0
000007FC6DDB0930        182 redo allocation         27          0              0                0


ADDR                 LATCH# NAME                  GETS     MISSES IMMEDIATE_GETS IMMEDIATE_MISSES
---------------- ---------- --------------- ---------- ---------- -------------- ----------------
000007FC6DDB0890        182 redo allocation         27          0              0                0
000007FC6DDB07F0        182 redo allocation         27          0              0                0
000007FC6DDB0750        182 redo allocation         27          0              0                0
000007FC6DDB06B0        182 redo allocation         27          0              0                0
000007FC6DDB0610        182 redo allocation         27          0              0                0
000007FC6DDB0570        182 redo allocation         27          0              0                0
000007FC6DDB04D0        182 redo allocation         27          0              0                0
000007FC6DDB0430        182 redo allocation         27          0              0                0
000007FC6DDB0390        182 redo allocation         27          0              0                0
000007FC6DDB02F0        182 redo allocation         27          0              0                0
000007FC6DDB0250        182 redo allocation         27          0              0                0

redo 的内容
Oracle通过redo来实现快速提交,一方面是因为redo log file可以连续、顺序的快速写出,另一方面也会redo记录的精简内容 有关。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/30430420/viewspace-1802196/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/30430420/viewspace-1802196/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值