作者簡介
惠星星,現(xiàn)就職于北京海天起點(diǎn),持有OCP 10g、OCP 11g、OCM 11g證書,并有長達(dá)8年電力行業(yè)業(yè)務(wù)維護(hù)、數(shù)據(jù)庫維護(hù)服務(wù)經(jīng)驗(yàn),擅長Oracle數(shù)據(jù)庫性能優(yōu)化、故障處理及數(shù)據(jù)可視化技術(shù)研究。
online redo log files是Oracle數(shù)據(jù)庫最重要的物理結(jié)構(gòu)之一,由于Write-Ahead-Log(即日志寫入優(yōu)先)機(jī)制,確保instance failure時(shí),實(shí)例級(jí)恢復(fù)正常完成,已提交的數(shù)據(jù)被正常恢復(fù),本文主要通過dtrace工具分析redo產(chǎn)生過程中l(wèi)atch資源的申請(qǐng)過程,分析Oracle redo生成的詳細(xì)過程。
關(guān)于Redo Log Buffer
redo log buffer 是SGA中的一個(gè)循環(huán)緩沖區(qū),主要存儲(chǔ) redo entries。redo entries包含重構(gòu)或重做DML或DDL操作對(duì)數(shù)據(jù)庫所做的更改所需的信息。數(shù)據(jù)庫恢復(fù)將redo entries 應(yīng)用于數(shù)據(jù)文件,以重構(gòu)丟失的更改。
Oracle數(shù)據(jù)庫進(jìn)程將redo entries從用戶內(nèi)存空間復(fù)制到SGA中的重做日志緩沖區(qū)。redo entries占用緩沖區(qū)中連續(xù)的、順序的空間。LGWR進(jìn)程將redo log buffer 中的redo entries寫入磁盤上online redo log files。
測(cè)試腳本
#!/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;
}
測(cè)試redo entries寫入redo log buffer
【session 1】:
查詢進(jìn)程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】:
啟動(dòng)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中產(chǎn)生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
說明
以上內(nèi)容為個(gè)人多次測(cè)試結(jié)果,由于個(gè)人原因,如有分析不足之處還請(qǐng)見諒及指正,謝謝。
參考文檔
《Oracle® Database Concepts 11g Release 2 (11.2) 》
原創(chuàng)文章,版權(quán)歸本文作者所有,如需轉(zhuǎn)載請(qǐng)注明出處