作者簡介
惠星星,現就職于北京海天起點,持有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) 》
原創文章,版權歸本文作者所有,如需轉載請注明出處