作者简介
惠星星,现就职于北京海天起点,持有OCP 10g、OCP 11g、OCM 11g证书,并有长达8年电力行业业务维护、数据库维护服务经验,擅长Oracle数据库性能优化、故障处理及数据可视化技术研究。
online redo log files是Oracle数据库最重要的物理结构之一,由于Write-Ahead-Log(即日志写入优先)机制,确保instance failure时,实例级恢复正常完成,已提交的数据被正常恢复,本文主要通过dtrace工具分析redo产生过程中latch资源的申请过程,分析Oracle redo生成的详细过程。
关于Redo Log Buffer
redo log buffer 是SGA中的一个循环缓冲区,主要存储 redo entries。redo entries包含重构或重做DML或DDL操作对数据库所做的更改所需的信息。数据库恢复将redo entries 应用于数据文件,以重构丢失的更改。
Oracle数据库进程将redo entries从用户内存空间复制到SGA中的重做日志缓冲区。redo entries占用缓冲区中连续的、顺序的空间。LGWR进程将redo log buffer 中的redo entries写入磁盘上online redo log files。
测试脚本
#!/usr/sbin/dtrace -s -n
dtrace:::BEGIN
{
i=1;
}
pid$1::kslgetl:entry,
pid$1::kslfre:entry
/pid == $1/
{
printf("i=%d pid:::==%s:%s:%s:%s %x %x %x %d %x %x",i, probeprov, probemod, probefunc, probename,arg0,arg1,arg2,arg3,arg4,arg5);
i=i+1;
}
测试redo entries写入redo log buffer
【session 1】:
查询进程id
SQL> select spid from v$process where ADDR in (select PADDR from v$session where sid=(select sid from v$mystat where rownum=1));
SPID
------------------------------------------------------------------------
1358
SQL> create table orastar.t1(c1 varchar2(10),c2 varchar2(10));
Table created.
【session 2】:
启动dtrace程序
./list_latch.d -x switchrate=10hz 1391 > list_latch.log
【session 1】:
生成redo entries:
SQL> insert into orastar.t1 values(1,1);
1 row created.
SQL> commit;
Commit complete.
分析过程
【生成latch地址】
cat list_latch.log |grep kslgetl|awk '{print "'''" "00000000" $6 "'''" ","}'|sort $1 | uniq
【查询latch查询】
set line 200
col name for a30
select lower(addr),LATCH#,NAME,HASH,GETS,WAIT_TIME from V$LATCH_CHILDREN where lower(addr) in (
'000000006000d178',
'000000006000d370',
'000000006000d7e8',
'000000006002dab8',
'000000006010df10',
'00000000bb137e80',
'00000000bb5d6868',
'00000000bb6d6a28',
'00000000bb6d8570',
'00000000bb7d8730',
'00000000bc593120',
'00000000bc6ba8f0',
'00000000bc6e7998',
'00000000bc6ea088',
'00000000bc6ea128',
'00000000bd6c4fe0',
'00000000bd6c50d8',
'00000000bd6c5338',
'00000000be263330',
'00000000be26f100',
'00000000be95ed98'
);
redo生成过程说明
server process在user memory space中产生redo entry
server process获取redo copy latch
server process 获取redo allocation latch
在log buffer中分配空间
释放redo allocation latch
server process将redo entry信息写入到log buffer中
释放redo copy latch
说明
以上内容为个人多次测试结果,由于个人原因,如有分析不足之处还请见谅及指正,谢谢。
参考文档
《Oracle® Database Concepts 11g Release 2 (11.2) 》
原创文章,版权归本文作者所有,如需转载请注明出处