Oracle IMU模式下REDO格式詳解

來源:互聯網
上載者:User

1. 什麼是IMU?IMU的主要作用是什麼,也就是說為瞭解決什麼問題?

IMU--->In Memory Undo,10g新特性,資料庫會在shared pool開闢獨立的記憶體地區用於儲存Undo資訊,

每個新事務都會分配一個IMU buffer(私人的),一個buffer裡有很多node,一個node相當於一個block(復原塊)。

IMU特性:

IMU顧名思義就是在記憶體中的undo,現在每次更改data block,Oracle 不用去更改這個undo block(也不會產生相應的redo了),而是把undo資訊緩衝到IMU裡去了,只有最後commit或者flush IMU時,這些undo 資訊才會批次更新到undo block,並產生redo。可以避免Undo資訊以前在Buffer Cache中的讀寫操作,從而可以進一步的減少Redo產生,同時可以大大減少以前的UNDO SEGMENT的操作。IMU中資料通過暫存、整理與收縮之後也可以寫出到復原段,這樣的寫出提供了有序、批量寫的效能提升。

IMU主要作用:

減少CR塊-->在構造CR block時,不用像以前那樣從undo block中擷取undo record了,而是用共用池私人IMU地區裡的資訊來構造cr block,減少了BUFFER CACEH中 CBC LATCH競爭。

減少REDO日誌條目數-->不再是每條DML語句一個redo records,而是每個事務一個redo records--REDO RECORD的產生會傳到 LOG BUFFER,,會申請LATCH。

減少LATCH-->首先因為減少REDO RECORD數目;其次用一個IMU latch 代替 redo allocation latch 和 redo copy latch這兩個,也減少了LATCH爭用.

查詢系統中IMU LATCH的數量--也就是Private redo strand area的個數。

IMU 私人REDO區對應的內部表:x$kcrfstrand       IMU UNDO區對應的內部表:x$ktifp

BYS@ bys3>select count(name) from v$latch_children where lower(name) like 'in mem%';

COUNT(NAME)

-----------

84

BYS@ bys3>select count(*),name from v$latch_children where lower(name) like 'in mem%' group by name;

 COUNT(*) NAME

---------- ----------------------------------------------------------------

84 In memory undo latch

下面語句可以查詢IMU LATCH的擷取情況

select name,gets from v$latch_children where lower(name) like 'in mem%';

2.在哪些情境下不會使用IMU特性?(ORACLE 10g出現了IMU,預設開啟IMU)

在RAC環境中不支援IMU。

開啟FLASHBACK DATABASE時會開啟開啟輔助日誌,此時不能用IMU。

事務過大--據說每個IMU Buffer的Private redo strand area大小大概是64KB(64位的Oracle版本是128KB),大事務不能用。比如一個事務,先有一條UPDATE,此時將REDO私人地區使用完了,此事務的其它DML語句,將自動使用非IMU模式。

共用池太小時,ORACLE會自動不使用IMU。

無法擷取IMU LATCH時,將自動使用非IMU模式。

3.如何手動關閉和開啟IMU模式?

10G和11G中預設是開啟IMU特性的,開啟關閉語句如下:--修改後最好重啟使之生效,或者至少切換一次REDO日誌。

alter system set "_in_memory_undo"=false;

alter system set "_in_memory_undo"=true;  --關閉IMU後使用此語句改回使用IMU特性。

4、談談一條UPDATE語句從第一步到第九步的整個過程?在IMU模式下對REDO日誌做DUMP分析(上圖所示:IMU模式的REDO格式)。

UPDATE語句從第一步到第九步的對應上圖是:

第一步:將更改的資料存放到PGA  

第二步:將BUFFER CACHE中舊資料拷貝到共用池的私人IMU buffer

第三步:將PGA中修改後的資料存放到private redo   private redo--在IMU中才有。

第四步:修改buffre cache中的資料

做提交操作後:

第五步:從IMU中拷貝修改前值到BUFFER CACHE中構建一個CR塊-----即使未提交時SMON每3秒也會做此工作

第六步:第四步修改修改buffre cache中的資料產生的redo日誌寫入log buffe

第七步:第五步操作構造CR塊,產生的redo日誌寫入 log buffe

第八步:由lgwr寫出log buffer到redo log file

第九步:dbwr 將髒資料寫入data file

5.UPDATE操作DUMP REDO 內容實驗記錄:

INSERT 和DELETE語句的,詳見:點擊開啟連結

REDO RECORD - Thread:1 RBA: 0x000141.00000027.0010 LEN: 0x031c VLD: 0x0d

SCN: 0x0000.00719188 SUBSCN:  1 01/07/2014 20:27:05

(LWN RBA: 0x000141.00000027.0010 LEN: 0002 NST: 0001 SCN: 0x0000.00719187)

####一個REDO RECORD: RECORD頭+CHANGE VECTOR組成(一個CV就是一個操作)

以上是日誌頭,Thread:1 線程號,RAC時會有1,2等

RBA: 0x000141.00000027.0010 將16進位轉換為十進位分別是記錄檔號、日誌塊號、在塊上第N位元組

VLD: 0x0d日誌類型--IMU模式時是這個;非IMU時是:VLD: 0x05

SCN: 0x0000.00719188 SUBSCN:  1 01/07/2014 20:27:05   ----

BYS@ bys3>select scn_to_timestamp(to_number('719188','xxxxxxxx')) from dual;

SCN_TO_TIMESTAMP(TO_NUMBER('719188','XXXXXXXX'))

---------------------------------------------------------------------------

07-JAN-14 08.27.05.000000000 PM

--是此REDO條目產生時的SCN號,轉為十進位現轉為時間戳記為:08.27.05, 插入陳述式完成是在20:27:00 BYS@ bys3>commit;--  --這個是在插入陳述式完成5秒後,此SCN與CHANGE#4提交時SCN一致。

(LWN RBA: 0x000141.00000027.0010 LEN: 0002 NST: 0001 SCN: 0x0000.00719187)

括弧中SCN: 0x0000.00719187 比上一行:SCN: 0x0000.00719187   少了1個SCN。

####

CHANGE #1 TYP:2 CLS:1 AFN:4 DBA:0x010000fd OBJ:22327 SCN:0x0000.007164a1 SEQ:1 OP:11.5 ENC:0 RBL:0

#####AFN:4,操作是在4號檔案做的-dba_data_files.file_id;OBJ:22327--操作的對象的OBJECT_ID。OP:11.5-有的版本是OP:11.19--更新操作

KTB Redo

op: 0x11  ver: 0x01

compat bit: 4 (post-11) padding: 1

op: F  xid:  0x0005.002.00000edc    uba: 0x00c041cd.02ea.01

Block cleanout record, scn:  0x0000.0071917c ver: 0x01 opt: 0x02, entries follow...

 itli: 1  flg: 2  scn: 0x0000.007164a1

KDO Op code: URP row dependencies Disabled   -- --URP=UPDATE ROW PIECE。有時會是:KDO Op code:21 row dependencies Disabled

 xtype: XA flags: 0x00000000  bdba: 0x010000fd  hdba: 0x010000fa

itli: 2  ispac: 0  maxfr: 4858

tabn: 0 slot: 8(0x8) flag: 0x2c lock: 2 ckix: 0

ncol: 3 nnew: 1 size: 2   --ncol: 3 nnew: 1  表示操作的表有3個列,操作了一列,size: 2

--列字元長度增加2:database減去chedan---根據多次update並DUMP的日誌來看,這裡的size的值應該是:當前CHANGE中的值減去另一個。。

col  1: [ 8]  64 61 74 61 62 61 73 65   --set dname='database'  --col  1: [ 8],第二列,8個字元

BYS@ bys3>select dump('database',16),dump('dataoracle',16) from dual;

DUMP('DATABASE',16)                   DUMP('DATAORACLE',16)

------------------------------------- --------------------------------------------

Typ=96 Len=8: 64,61,74,61,62,61,73,65 Typ=96 Len=10: 64,61,74,61,6f,72,61,63,6c,65

#########################

CHANGE #2 TYP:0 CLS:25 AFN:3 DBA:0x00c000c0 OBJ:4294967295 SCN:0x0000.00719153 SEQ:1 OP:5.2 ENC:0 RBL:0

ktudh redo: slt: 0x0002 sqn: 0x00000edc flg: 0x000a siz: 164 fbi: 0

uba: 0x00c041cd.02ea.01    pxid:  0x0000.000.00000000

### #####################事務資訊

TYP:0 普通塊 ,CLS:25 class大於16是UNDO塊-遞增。AFN:3 絕對檔案號dba_data_files.file_id--是UNDO的檔案號

DBA:0x00c000c0 資料區塊在記憶體中地址

OBJ:4294967295 --十進位,轉為16進位是FFFFFFFF

SCN:0x0000.00719153  轉換為16進位可與操作時對比

OP:5.2 -> operation code 向UNDO段頭的事務表寫事務資訊-事務開始

uba: 0x00c041cd.02ea.01  UNDO塊地址

#######################

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.