ITPub博客

首页 > 数据库 > Oracle > oracle内部运行机制之Redo 和 Latch

oracle内部运行机制之Redo 和 Latch

原创 Oracle 作者:gydba 时间:2015-09-17 15:03:37 0 删除 编辑
好记性,不如记 博客,多做笔记,多勤学。


在一个并发系统中,用户进程都需要向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博客 ” ,链接:https://blog.itpub.net/30430420/viewspace-1802196/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2015-08-24

  • 博文量
    77
  • 访问量
    192107