溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何理解dump數(shù)據(jù)塊

發(fā)布時(shí)間:2021-11-12 14:03:33 來源:億速云 閱讀:105 作者:柒染 欄目:關(guān)系型數(shù)據(jù)庫

今天就跟大家聊聊有關(guān)如何理解dump數(shù)據(jù)塊,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

一、dump數(shù)據(jù)文件

dump數(shù)據(jù)文件需要知道表的存儲信息:數(shù)據(jù)文件號(file#)和數(shù)據(jù)塊號(block#)。

以下查詢表所在的表空間、文件號、區(qū)段分布、塊分布信息

col segment_name for a20

col tablespace_name for a20

select segment_name, segment_type, tablespace_name, extent_id, file_id, block_id, blocks, bytes from dba_extents where owner = 'SCOTT' and segment_name = 'EMP';

SEGMENT_NAME         SEGMENT_TYPE       TABLESPACE_NAME       EXTENT_ID    FILE_ID   BLOCK_ID     BLOCKS      BYTES

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

EMP                  TABLE              USERS                         0          4        144          8      65536

再看表記錄的塊分布信息

select dbms_rowid.rowid_block_number(rowid) block#, count(*) block_records from scott.emp group by dbms_rowid.rowid_block_number(rowid) order by block#;

    BLOCK# BLOCK_RECORDS

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

       151            14

可見表段開始的前幾個(gè)塊是用于存儲段頭信息的,行記錄數(shù)據(jù)從后面塊開始。

使用以下命令可以dump一個(gè)或多個(gè)數(shù)據(jù)塊:

alter system dump datafile <file#> block <block#>;

alter system dump datafile <file#> block min <block#_min> block max <block#_max>;

先看一下當(dāng)前會話對應(yīng)的跟蹤文件

col trace_file_name for a80

select a.value || b.symbol || c.instance_name || '_ora_' || d.spid ||

       '.trc' trace_file_name

  from (select value from v$parameter where name = 'user_dump_dest') a,

       (select substr(value, -6, 1) symbol

          from v$parameter

         where name = 'user_dump_dest') b,

       (select instance_name from v$instance) c,

       (select spid

          from v$session s, v$process p, v$mystat m

         where s.paddr = p.addr

           and s.sid = m.sid

           and m.statistic# = 0) d;

TRACE_FILE_NAME

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

c:\oracle\diag\rdbms\mes\mes\trace\mes_ora_3912.trc

現(xiàn)在dump文件塊

alter system dump datafile 4 block 151;

查看跟蹤文件內(nèi)容

Start dump data blocks tsn: 4 file#:4 minblk 151 maxblk 151

Block dump from cache:

Dump of buffer cache at level 4 for tsn=4, rdba=16777367

Block dump from disk:

buffer tsn: 4 rdba: 0x01000097 (4/151)

scn: 0x0000.001ef9e3 seq: 0x01 flg: 0x06 tail: 0xf9e30601

frmt: 0x02 chkval: 0xd2a5 type: 0x06=trans data

Hex dump of block: st=0, typ_found=1

Dump of memory from 0x000000000D186E00 to 0x000000000D188E00

00D186E00 0000A206 01000097 001EF9E3 06010000  [................]

...

00D188DF0 0101110C 09C20201 15C102FF F9E30601  [................]

Block header dump:  0x01000097

 Object id on Block? Y

 seg/obj: 0x11dec  csc: 0x00.1ef9cc  itc: 2  flg: E  typ: 1 - DATA

     brn: 0  bdba: 0x1000090 ver: 0x01 opc: 0

     inc: 0  exflg: 0

 Itl           Xid                  Uba         Flag  Lck        Scn/Fsc

0x01   0x000a.009.0000044c  0x00c00f07.012e.20  --U-    1  fsc 0x0000.001ef9e3

0x02   0x000a.004.0000044d  0x00c00f07.012e.1c  C---    0  scn 0x0000.001ef98a

數(shù)據(jù)塊主要信息如下:

tsn:表空間編號

file#:文件編號

minblk和maxblk:導(dǎo)出塊編號的范圍

rdba:相對塊地址信息

這里rdba列出了十六進(jìn)制形式和十進(jìn)制形式,這個(gè)地址可以使用如下查詢通過文件號和塊號進(jìn)行轉(zhuǎn)換

select dbms_utility.make_data_block_address(4, 151) from dual;

DBMS_UTILITY.MAKE_DATA_BLOCK_ADDRESS(4,151)

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

                                   16777367

它的十六進(jìn)制形式

select to_char(16777367, 'xxxxxxxx') from dual;

TO_CHAR(1

---------

  1000097

反過來,也可以通過塊地址轉(zhuǎn)換得到文件號和塊號

select dbms_utility.data_block_address_file(16777367) file#, dbms_utility.data_block_address_block(16777367) block# from dual;

     FILE#     BLOCK#

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

         4        151

scn:數(shù)據(jù)塊的SCN信息

tail:由SCN的最后兩字節(jié)、塊類型type和序列號seq組成

Oracle利用數(shù)據(jù)塊的tail來判斷數(shù)據(jù)塊內(nèi)容的一致性,如果這里的tail分解后和SCN的最后兩字節(jié)、塊類型和序列號三者不匹配,Oracle可以判斷這個(gè)塊處于不一致狀態(tài),需要恢復(fù)。這里的tail信息雖然顯示在塊跟蹤文件的開始部分,而事實(shí)上它物理的存儲在數(shù)據(jù)塊的最末端,這也是tail名稱的由來。

塊類型type的有效取值有以下幾種:

0x02undo block

0x06trans data

0x0eundo segment header

0x10data segment header block

0x17bitmapped data segment header

0x20first level bitmap block

0x21second level bitmap block

0x23pagetable segment header

Object id on Block? Y:數(shù)據(jù)塊上存儲的數(shù)據(jù)庫對象是否存在于sys.obj$數(shù)據(jù)字典

seg/obj:數(shù)據(jù)庫對象的ID信息,以下查詢可以驗(yàn)證

col object_name for a30

select owner, object_name from dba_objects where object_id = to_number('11dec', 'xxxxx');

OWNER                          OBJECT_NAME

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

SCOTT                          EMP

csc:塊清理時(shí)的SCNcleanout SCN),注意觀察它是否匹配數(shù)據(jù)塊的SCN。

itc:事務(wù)槽(ITL slot)的數(shù)量,下面的兩行正是ITL的信息,對應(yīng)兩個(gè)事務(wù),用xid標(biāo)識。

flag:標(biāo)識數(shù)據(jù)塊是否存在于段的freelist,“-”表示該塊不在freelist中,“o”代表on,表示該塊存在于freelist,可用于insert記錄。

以下是數(shù)據(jù)頭部分

data_block_dump,data header at 0xd186e64

===============

tsiz: 0x1f98

hsiz: 0x2e

pbl: 0x0d186e64

     76543210

flag=--------

ntab=1

nrow=14

frre=-1

fsbo=0x2e

fseo=0x1d61

avsp=0x1d33

tosp=0x1d33

0xe:pti[0]        nrow=14        offs=0

0x12:pri[0]        offs=0x1f72

0x14:pri[1]        offs=0x1f47

0x16:pri[2]        offs=0x1f1c

0x18:pri[3]        offs=0x1ef3

0x1a:pri[4]        offs=0x1ec6

0x1c:pri[5]        offs=0x1e9d

0x1e:pri[6]        offs=0x1e74

0x20:pri[7]        offs=0x1e4c

0x22:pri[8]        offs=0x1e26

0x24:pri[9]        offs=0x1dfb

0x26:pri[10]        offs=0x1dd5

0x28:pri[11]        offs=0x1daf

0x2a:pri[12]        offs=0x1d88

0x2c:pri[13]        offs=0x1d61

這里含義如下:

tsiz:數(shù)據(jù)塊用于存儲數(shù)據(jù)部分的總空間(total data area size

hsiz:頭尺寸(header size

pbl:數(shù)據(jù)塊在緩存中的地址指針(pointer to buffer holding the block),下面一行則是其塊地址bdba。

ntabnumber of tables,如果該值大于1,說明該數(shù)據(jù)塊屬于cluster的存儲塊。

nrownumber of rows,數(shù)據(jù)塊中存儲的記錄數(shù)量。

fsbo、fseofree space begin offsetfree space end offset,兩者給出了塊中自由空間的起始位置。

avspavailable space in the block

tosptotal available space when all transactions commit

再往后就是行記錄信息,以下是第一條記錄

block_row_dump:

tab 0, row 0, @0x1f72

tl: 38 fb: --H-FL-- lb: 0x1  cc: 8

col  0: [ 3]  c2 4a 46

col  1: [ 5]  53 4d 49 54 48

col  2: [ 5]  43 4c 45 52 4b

col  3: [ 3]  c2 50 03

col  4: [ 7]  77 b4 0c 11 01 01 01

col  5: [ 2]  c2 09

col  6: *NULL*

col  7: [ 2]  c1 15

這里含義如下:

tab 0, row 0, @0x1f72:表在cluster中的標(biāo)識、行標(biāo)識和行地址。

tl:指示該行共占用的字節(jié)空間,十進(jìn)制表示,包含行的其他開銷。

fb:行標(biāo)記,H表示head of row,FL分別表示行的first piecelast piece,說明此行涉及導(dǎo)出的數(shù)據(jù)塊,不存在行鏈接,又由于塊中存在行頭,說明也存在行遷移。

lbITL事務(wù)槽編號

cc:列的數(shù)量

col  n: [ k]:第n+1列的數(shù)據(jù),占用k個(gè)字節(jié)。

以下驗(yàn)證第二列數(shù)據(jù)col  1: [ 5]  53 4d 49 54 48,數(shù)據(jù)以十六進(jìn)制ASCII碼形式給出,通過以下查詢轉(zhuǎn)換為字符

select chr(to_number('53', 'xx')) || chr(to_number('4d', 'xx')) || chr(to_number('49', 'xx')) || chr(to_number('54', 'xx')) || chr(to_number('48', 'xx')) from dual;

CHR(TO_NUM

----------

SMITH

或者使用以下程序包轉(zhuǎn)換

set serveroutput on

declare c varchar2(30);

begin

    dbms_stats.convert_raw_value('534d495448', c);

    dbms_output.put_line(c);

end;

/

SMITH

對于第一列數(shù)據(jù)col  0: [ 3]  c2 4a 46,該列是number類型,可以通過以上程序包轉(zhuǎn)換為十進(jìn)制數(shù)

set serveroutput on

declare n number;

begin

    dbms_stats.convert_raw_value('c24a46', n);

    dbms_output.put_line(n);

end;

/

7369

scott.emp表上可以查詢驗(yàn)證,編號為7369的員工正是smith

對于第五列數(shù)據(jù)col  4: [ 7]  77 b4 0c 11 01 01 01,該列是date類型,同樣可以通過以上程序包轉(zhuǎn)換為可顯示的日期

set serveroutput on

declare dt date;

begin

    dbms_stats.convert_raw_value('77b40c11010101', dt);

    dbms_output.put_line(to_char(dt, 'yyyy-mm-dd hh34:mi:ss'));

end;

/

1980-12-17 00:00:00

二、dump索引文件

索引數(shù)據(jù)塊和表數(shù)據(jù)塊的存儲明顯不同。一個(gè)b-tree索引所對應(yīng)的存儲數(shù)據(jù)塊有分支節(jié)點(diǎn)塊(branch block)和葉節(jié)點(diǎn)塊(leaf block)。要導(dǎo)出一個(gè)b-tree索引,需要提供這個(gè)索引的object_id,為此先查詢索引對象及其ID信息

col table_name for a30

col tablespace_name for a20

col index_name for a20

col index_type for a10

select table_name, index_name, index_type, status, tablespace_name from dba_indexes where owner='CMES' and table_name='C_MATERIAL_T';

TABLE_NAME                     INDEX_NAME           INDEX_TYPE STATUS   TABLESPACE_NAME

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

C_MATERIAL_T                   IDX_FK_MATERIAL_NO   NORMAL     VALID    CMES

C_MATERIAL_T                   IDX_FK_PART_NO       NORMAL     VALID    CMES

C_MATERIAL_T                   IDX_PK_MATERIAL_ID   NORMAL     VALID    CMES

select object_id from dba_objects where object_name = 'IDX_FK_PART_NO';

 OBJECT_ID

----------

     77043

啟用treedump事件跟蹤來導(dǎo)出,將索引對象的object_id代入以下命令

alter session set events 'immediate trace name treedump level 77043';

查看導(dǎo)出文件

----- begin tree dump

branch: 0x14003b3 20972467 (0: nrow: 2, level: 1)

   leaf: 0x14003b4 20972468 (-1: nrow: 322 rrow: 322)

   leaf: 0x14003b5 20972469 (0: nrow: 23 rrow: 23)

----- end tree dump

這個(gè)索引樹只有一個(gè)分支節(jié)點(diǎn)(branch)也就是索引的根節(jié)點(diǎn)(root),塊地址為0x14003b3,其十進(jìn)制數(shù)為20972467,根節(jié)點(diǎn)的level1,說明該b-tree索引的高度為2,因?yàn)樗饕龢涞?/span>level是從0開始計(jì)的。該根節(jié)點(diǎn)下面沒有再分支了,就是葉節(jié)點(diǎn)塊,葉節(jié)點(diǎn)的level總是0,因此dump文件中不需要標(biāo)出。分支和葉所在的位置標(biāo)識從最左邊為-1開始而不是0。對于葉節(jié)點(diǎn)塊,nrow表示該節(jié)點(diǎn)塊中存儲的行指針數(shù),對于分支節(jié)點(diǎn)塊,nrow表示指向下一層節(jié)點(diǎn)的塊數(shù)。在葉節(jié)點(diǎn)塊中,還有rrow,它與塊上的事務(wù)處理有關(guān)(rrow is the number of rows after all current transactions have been committed),rrownrow相等,表示該塊涉及的數(shù)據(jù)上沒有正在執(zhí)行的事務(wù)處理。

分析左邊第一個(gè)葉塊leaf: 0x14003b4 20972468 (-1: nrow: 322 rrow: 322),由數(shù)據(jù)塊地址dba轉(zhuǎn)換為對應(yīng)的文件號、塊號

select dbms_utility.data_block_address_file(to_number('14003b4','xxxxxxxx')) file#, dbms_utility.data_block_address_block(to_number('14003b4','xxxxxxxx')) block# from dual;

     FILE#     BLOCK#

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

         5        948

dump該數(shù)據(jù)塊

alter system dump datafile 5 block 948;

查看dump文件,找到葉塊的描述部分

Leaf block dump

===============

header address 532770404=0x1fc16e64

kdxcolev 0

KDXCOLEV Flags = - - -

kdxcolok 0

kdxcoopc 0x80: opcode=0: iot flags=--- is converted=Y

kdxconco 2

kdxcosdc 0

kdxconro 322

kdxcofbo 680=0x2a8

kdxcofeo 1502=0x5de

kdxcoavs 822

kdxlespl 0

kdxlende 0

kdxlenxt 20972469=0x14003b5

kdxleprv 0=0x0

kdxledsz 0

kdxlebksz 8036

row#0[8017] flag: ------, lock: 0, len=19

col 0; len 9; (9):  31 36 44 34 30 37 31 38 33

col 1; len 6; (6):  01 40 03 a5 00 0a

row#1[7997] flag: ------, lock: 0, len=20

col 0; len 10; (10):  31 38 30 35 30 30 30 34 31 45

col 1; len 6; (6):  01 40 03 9b 00 0c

kdxlenxt:下一個(gè)葉節(jié)點(diǎn)的塊地址

kdxleprv:前一個(gè)葉節(jié)點(diǎn)的塊地址

這兩個(gè)指針對于SQL優(yōu)化器執(zhí)行索引的index range scans操作非常重要。隨后就是葉塊的數(shù)據(jù)內(nèi)容,這里只顯示了兩行記錄。

看完上述內(nèi)容,你們對如何理解dump數(shù)據(jù)塊有進(jìn)一步的了解嗎?如果還想了解更多知識或者相關(guān)內(nèi)容,請關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI