天天看點

Oracle dump datafile and IOT Secondary Index

在前一篇 IOT, Secondary Index and Mapping Table 中提到IOT的secondary index中應該包含了IOT的primary key, 但是不知道怎麼去證明一下。網上看到可以通過如下方式dump資料檔案中block的内容,

To dump single block use following command:

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

To dump multiple block use following command:

alter system dump datafile <file number> block min <first block number> block max <last block number> ;

于是想到是否可以搞搞看看。此文就對這個探索過程簡單記錄一下....

現在拿之前建立的IOT表TEST_IOT來試驗一下,

SQL > desc TEST_IOT;

Name Null ? Type

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

ID NOT NULL NUMBER

NAME VARCHAR2 ( 128 )

SQL > select * from dba_extents where segment_name = ' TEST_IOT ' ;

no rows selected

太奇怪了!!明明是存在TEST_IOT這張表的,但是居然從dba_extents中找不到,這不是有點扯dan嗎???  難倒是Oracle錯了?? 我非常底氣不足地想到這個可能性。:) 雖然知道這個可能性微乎其微i,但是問題到底出在什麼地方呢?  Think...think....think...突然意識到TEST_IOT不是普通的heap表,而其實就是個索引,而索引的segment name就是索引的名字。那麼TEST_IOT的索引是啥呢?自然應該是TEST_IOT的主鍵名, 來查檢視...

SQL > select index_name, index_type from user_indexes where table_name = ' TEST_IOT ' ;

INDEX_NAME INDEX_TYPE

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

IDX_TEST_IOT_1 NORMAL

SYS_IOT_TOP_262816 IOT - TOP

由于在建立TEST_IOT的時候沒有顯示指出primary key的名字,是以系統是自動生成,也就是SYS_IOT_TOP_262816. 

知道TEST_IOT對應的segment的名字,就可以通過查詢dba_extents來擷取TEST_IOT對應的資料檔案和起始block id了, 

SQL > select file_id , block_id from dba_extents where segment_name = ' SYS_IOT_TOP_262816 ' ;

FILE_ID BLOCK_ID

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

4 9561

因為我是想看看TEST_IOT上的secondary index的,是以現在來分析下TEST_IOT上的二級索引 -- IDX_TEST_IOT_1, 

SQL > select file_id , block_id, blocks from dba_extents where owner = ' FRANK ' and segment_name = ' IDX_TEST_IOT_1 ' ;

FILE_ID BLOCK_ID BLOCKS

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

4 9569 8

可以看到索引IDX_TEST_IOT_1位于datafile 4, 起始block id為9569, 占用了8個block. 那麼把這8個block都dump出來看看....

SQL > alter system dump datafile 4 block min 9569 block max 9576 ;

System altered.

  那麼生成的trace檔案在哪裡呢?網上普遍流行的一種方法是用下面的SQL來獲得trace檔案的名字,

SET LINESIZE 100

COLUMN trace_file FORMAT A60

SELECT s.sid,

s.serial#,

pa.value || '\' || LOWER(SYS_CONTEXT('userenv','instance_name')) ||

'_ora_' || p.spid || '.trc' AS trace_file

FROM v$session s,

v$process p,

v$parameter pa

WHERE pa.name = 'user_dump_dest'

AND s.paddr = p.addr

AND s.audsid = SYS_CONTEXT('USERENV', 'SESSIONID');

但是很奇怪的是,我用這個SQL得到的檔案名在系統中根本就沒有找到!!! 上面這個SQL顯然是從user_dump_dest裡面找生成的trace檔案,而且認為trace檔案的命名方式是<instance_name>_ora_<process_id>, 就像如下所示,

SID SERIAL# TRACE_FILE

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

107 12595 E:\ORACLE\PRODUCT\ 10.2 . 0 \ADMIN\ORCL\UDUMP / orcl_ora_2832.trc

但是我卻沒有從udump檔案夾下找到這個trace檔案,壓根就不存在!!後來我在 bdump 檔案夾下面發現了産生的trace檔案,而且檔案的名字叫  orcl_s002_2372.trc!我想這個S002應該表示SMON程序産生的trace檔案吧。 這個問題需要驗證下!

OK, 回歸到主題上來。 從trace檔案中摘取如下一段(index的leaf block)來分析IOT的secondary index的構成情況, 

Leaf block dump

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

header address 161882724 = 0x9a62264

kdxcolev 0

KDXCOLEV Flags = - - -

kdxcolok 0

kdxcoopc 0x90 : opcode = 0 : iot flags = I -- is converted=Y

kdxconco 2

kdxcosdc 0

kdxconro 32

kdxcofbo 100 = 0x64

kdxcofeo 6988 = 0x1b4c

kdxcoavs 6937

kdxlespl 0

kdxlende 1

kdxlenxt 0 = 0x0

kdxleprv 0 = 0x0

kdxledsz 0

kdxlebksz 8036

row# 0 [ 8003 ] flag: K -- ---, lock: 0, len=33

col 0 ; len 19 ; ( 19 ): 41 51 24 54 45 53 54 5f 51 55 45 55 45 5f 54 41 42 4c 45

col 1 ; len 2 ; ( 2 ): c1 1a

tl: 8 fb: -- H-FL-- lb: 0x0 cc: 1

col 0 : [ 4 ] 01 00 25 5c

row# 1 [ 7968 ] flag: K -- ---, lock: 0, len=35

col 0 ; len 21 ; ( 21 ):

41 51 24 54 45 53 54 5f 51 55 45 55 45 5f 54 41 42 4c 45 5f 52

col 1 ; len 2 ; ( 2 ): c1 1d

tl: 8 fb: -- H-FL-- lb: 0x0 cc: 1

col 0 : [ 4 ] 01 00 25 5c

row# 2 [ 7933 ] flag: K -- ---, lock: 0, len=35

col 0 ; len 21 ; ( 21 ):

41 51 24 54 45 53 54 5f 51 55 45 55 45 5f 54 41 42 4c 45 5f 53

col 1 ; len 2 ; ( 2 ): c1 0d

tl: 8 fb: -- H-FL-- lb: 0x0 cc: 1

col 0 : [ 4 ] 01 00 25 5c

row# 3 [ 7897 ] flag: K -- ---, lock: 0, len=36

col 0 ; len 22 ; ( 22 ):

41 51 24 5f 54 45 53 54 5f 51 55 45 55 45 5f 54 41 42 4c 45 5f 45

col 1 ; len 2 ; ( 2 ): c1 18

tl: 8 fb: -- H-FL-- lb: 0x0 cc: 1

col 0 : [ 4 ] 01 00 25 5c

row# 4 [ 7861 ] flag: K -- ---, lock: 0, len=36

col 0 ; len 22 ; ( 22 ):

41 51 24 5f 54 45 53 54 5f 51 55 45 55 45 5f 54 41 42 4c 45 5f 46

col 1 ; len 2 ; ( 2 ): c1 19

tl: 8 fb: -- H-FL-- lb: 0x0 cc: 1

col 0 : [ 4 ] 01 00 25 5c

row# 5 [ 7825 ] flag: K -- ---, lock: 0, len=36

col 0 ; len 22 ; ( 22 ):

41 51 24 5f 54 45 53 54 5f 51 55 45 55 45 5f 54 41 42 4c 45 5f 47

col 1 ; len 2 ; ( 2 ): c1 14

tl: 8 fb: -- H-FL-- lb: 0x0 cc: 1

col 0 : [ 4 ] 01 00 25 5c

row# 6 [ 7789 ] flag: K -- ---, lock: 0, len=36

col 0 ; len 22 ; ( 22 ):

41 51 24 5f 54 45 53 54 5f 51 55 45 55 45 5f 54 41 42 4c 45 5f 48

col 1 ; len 2 ; ( 2 ): c1 11

tl: 8 fb: -- H-FL-- lb: 0x0 cc: 1

col 0 : [ 4 ] 01 00 25 5c

row# 7 [ 7753 ] flag: K -- ---, lock: 0, len=36

col 0 ; len 22 ; ( 22 ):

41 51 24 5f 54 45 53 54 5f 51 55 45 55 45 5f 54 41 42 4c 45 5f 49

col 1 ; len 2 ; ( 2 ): c1 16

tl: 8 fb: -- H-FL-- lb: 0x0 cc: 1

col 0 : [ 4 ] 01 00 25 5c

row# 8 [ 7717 ] flag: K -- ---, lock: 0, len=36

col 0 ; len 22 ; ( 22 ):

41 51 24 5f 54 45 53 54 5f 51 55 45 55 45 5f 54 41 42 4c 45 5f 4e

col 1 ; len 2 ; ( 2 ): c1 0e

tl: 8 fb: -- H-FL-- lb: 0x0 cc: 1

col 0 : [ 4 ] 01 00 25 5c

row# 9 [ 7681 ] flag: K -- ---, lock: 0, len=36

col 0 ; len 22 ; ( 22 ):

41 51 24 5f 54 45 53 54 5f 51 55 45 55 45 5f 54 41 42 4c 45 5f 53

col 1 ; len 2 ; ( 2 ): c1 09

tl: 8 fb: -- H-FL-- lb: 0x0 cc: 1

col 0 : [ 4 ] 01 00 25 5c

row# 10 [ 7645 ] flag: K -- ---, lock: 0, len=36

col 0 ; len 22 ; ( 22 ):

41 51 24 5f 54 45 53 54 5f 51 55 45 55 45 5f 54 41 42 4c 45 5f 54

col 1 ; len 2 ; ( 2 ): c1 0c

tl: 8 fb: -- H-FL-- lb: 0x0 cc: 1

col 0 : [ 4 ] 01 00 25 5c

row# 11 [ 7609 ] flag: K -- ---, lock: 0, len=36

col 0 ; len 22 ; ( 22 ):

41 51 24 5f 54 45 53 54 5f 51 55 45 55 45 5f 54 41 42 4c 45 5f 56

col 1 ; len 2 ; ( 2 ): c1 0b

tl: 8 fb: -- H-FL-- lb: 0x0 cc: 1

col 0 : [ 4 ] 01 00 25 5c

row# 12 [ 7584 ] flag: K -- ---, lock: 0, len=25

col 0 ; len 11 ; ( 11 ): 4d 45 53 53 41 47 45 5f 41 50 49

col 1 ; len 2 ; ( 2 ): c1 04

tl: 8 fb: -- H-FL-- lb: 0x0 cc: 1

col 0 : [ 4 ] 01 00 25 5c

row# 13 [ 7559 ] flag: K -- ---, lock: 0, len=25

col 0 ; len 11 ; ( 11 ): 4d 45 53 53 41 47 45 5f 41 50 49

col 1 ; len 2 ; ( 2 ): c1 05

tl: 8 fb: -- H-FL-- lb: 0x0 cc: 1

col 0 : [ 4 ] 01 00 25 5c

row# 14 [ 7533 ] flag: K -- ---, lock: 0, len=26

col 0 ; len 12 ; ( 12 ): 53 59 53 5f 43 30 30 35 34 36 37 32

col 1 ; len 2 ; ( 2 ): c1 06

tl: 8 fb: -- H-FL-- lb: 0x0 cc: 1

col 0 : [ 4 ] 01 00 25 5c

row# 15 [ 7507 ] flag: K -- ---, lock: 0, len=26

col 0 ; len 12 ; ( 12 ): 53 59 53 5f 43 30 30 35 34 36 37 35

col 1 ; len 2 ; ( 2 ): c1 0a

tl: 8 fb: -- H-FL-- lb: 0x0 cc: 1

col 0 : [ 4 ] 01 00 25 5c

row# 16 [ 7474 ] flag: K -- ---, lock: 0, len=33

col 0 ; len 19 ; ( 19 ): 53 59 53 5f 49 4f 54 5f 4f 56 45 52 5f 32 36 32 34 37 32

col 1 ; len 2 ; ( 2 ): c1 13

tl: 8 fb: -- H-FL-- lb: 0x0 cc: 1

col 0 : [ 4 ] 01 00 25 5c

row# 17 [ 7442 ] flag: K -- ---, lock: 0, len=32

col 0 ; len 18 ; ( 18 ): 53 59 53 5f 49 4f 54 5f 54 4f 50 5f 32 36 32 34 36 38

col 1 ; len 2 ; ( 2 ): c1 0f

tl: 8 fb: -- H-FL-- lb: 0x0 cc: 1

col 0 : [ 4 ] 01 00 25 5c

row# 18 [ 7410 ] flag: K -- ---, lock: 0, len=32

col 0 ; len 18 ; ( 18 ): 53 59 53 5f 49 4f 54 5f 54 4f 50 5f 32 36 32 34 37 30

col 1 ; len 2 ; ( 2 ): c1 12

tl: 8 fb: -- H-FL-- lb: 0x0 cc: 1

col 0 : [ 4 ] 01 00 25 5c

row# 19 [ 7378 ] flag: K -- ---, lock: 0, len=32

col 0 ; len 18 ; ( 18 ): 53 59 53 5f 49 4f 54 5f 54 4f 50 5f 32 36 32 34 37 32

col 1 ; len 2 ; ( 2 ): c1 15

tl: 8 fb: -- H-FL-- lb: 0x0 cc: 1

col 0 : [ 4 ] 01 00 25 5c

row# 20 [ 7346 ] flag: K -- ---, lock: 0, len=32

col 0 ; len 18 ; ( 18 ): 53 59 53 5f 49 4f 54 5f 54 4f 50 5f 32 36 32 34 37 35

col 1 ; len 2 ; ( 2 ): c1 17

tl: 8 fb: -- H-FL-- lb: 0x0 cc: 1

col 0 : [ 4 ] 01 00 25 5c

row# 21 [ 7307 ] flag: K -- ---, lock: 0, len=39

col 0 ; len 25 ; ( 25 ):

53 59 53 5f 4c 4f 42 30 30 30 30 32 36 32 34 35 39 43 30 30 30 33 30 24 24

col 1 ; len 2 ; ( 2 ): c1 08

tl: 8 fb: -- H-FL-- lb: 0x0 cc: 1

col 0 : [ 4 ] 01 00 25 5c

row# 22 [ 7007 ] flag: K -- ---, lock: 2, len=21

col 0 ; len 8 ; ( 8 ): 54 45 53 54 5f 49 4f 54

col 1 ; len 1 ; ( 1 ): 80

tl: 8 fb: -- H-FL-- lb: 0x0 cc: 1

col 0 : [ 4 ] 01 00 25 5c

row# 23 [ 7285 ] flag: K -- D--, lock: 2, len=22

col 0 ; len 8 ; ( 8 ): 54 45 53 54 5f 49 4f 54

col 1 ; len 2 ; ( 2 ): c1 02

tl: 8 fb: -- H-FL-- lb: 0x0 cc: 1

col 0 : [ 4 ] 01 00 25 5c

row# 24 [ 7253 ] flag: K -- ---, lock: 0, len=32

col 0 ; len 18 ; ( 18 ): 54 45 53 54 5f 4d 45 53 53 41 47 45 5f 54 41 42 4c 45

col 1 ; len 2 ; ( 2 ): c1 1f

tl: 8 fb: -- H-FL-- lb: 0x0 cc: 1

col 0 : [ 4 ] 01 00 25 5c

row# 25 [ 7226 ] flag: K -- ---, lock: 0, len=27

col 0 ; len 13 ; ( 13 ): 54 45 53 54 5f 4d 53 47 5f 54 59 50 45

col 1 ; len 2 ; ( 2 ): c1 07

tl: 8 fb: -- H-FL-- lb: 0x0 cc: 1

col 0 : [ 4 ] 01 00 25 5c

row# 26 [ 7202 ] flag: K -- ---, lock: 0, len=24

col 0 ; len 10 ; ( 10 ): 54 45 53 54 5f 51 55 45 55 45

col 1 ; len 2 ; ( 2 ): c1 1e

tl: 8 fb: -- H-FL-- lb: 0x0 cc: 1

col 0 : [ 4 ] 01 00 25 5c

row# 27 [ 7159 ] flag: K -- ---, lock: 0, len=43

col 0 ; len 29 ; ( 29 ):

54 45 53 54 5f 51 55 45 55 45 5f 43 41 4c 4c 42 41 43 4b 5f 50 52 4f 43 45

44 55 52 45

col 1 ; len 2 ; ( 2 ): c1 03

tl: 8 fb: -- H-FL-- lb: 0x0 cc: 1

col 0 : [ 4 ] 01 00 25 5c

row# 28 [ 7133 ] flag: K -- ---, lock: 0, len=26

col 0 ; len 12 ; ( 12 ): 54 45 53 54 5f 51 55 45 55 45 5f 4e

col 1 ; len 2 ; ( 2 ): c1 1c

tl: 8 fb: -- H-FL-- lb: 0x0 cc: 1

col 0 : [ 4 ] 01 00 25 5c

row# 29 [ 7107 ] flag: K -- ---, lock: 0, len=26

col 0 ; len 12 ; ( 12 ): 54 45 53 54 5f 51 55 45 55 45 5f 52

col 1 ; len 2 ; ( 2 ): c1 1b

tl: 8 fb: -- H-FL-- lb: 0x0 cc: 1

col 0 : [ 4 ] 01 00 25 5c

row# 30 [ 7077 ] flag: K -- ---, lock: 0, len=30

col 0 ; len 16 ; ( 16 ): 54 45 53 54 5f 51 55 45 55 45 5f 54 41 42 4c 45

col 1 ; len 2 ; ( 2 ): c1 10

tl: 8 fb: -- H-FL-- lb: 0x0 cc: 1

col 0 : [ 4 ] 01 00 25 5c

row# 31 [ 6988 ] flag: K -- ---, lock: 2, len=19

col 0 ; len 5 ; ( 5 ): 68 65 6c 6c 6f

col 1 ; len 2 ; ( 2 ): c1 02

tl: 8 fb: -- H-FL-- lb: 0x0 cc: 1

col 0 : [ 4 ] 01 00 25 5c

-- --- end of leaf block dump -----

現在從中随便摘取第26行(row#26)來分析,片段如下,

row# 26 [ 7202 ] flag: K -- ---, lock: 0, len=24

col 0 ; len 10 ; ( 10 ): 54 45 53 54 5f 51 55 45 55 45

col 1 ; len 2 ; ( 2 ): c1 1e

tl: 8 fb: -- H-FL-- lb: 0x0 cc: 1

col 0 : [ 4 ] 01 00 25 5c

從中可以很清楚看到index條目中包含兩列 col 0, col 1。 可以先猜測下第一列應該就是index IDX_TEST_IOT_1的索引列 Name, 那麼col 1是什麼呢,之前提到過IOT的secondary index中應該是包含了主鍵的,是以這個col 1很有可能就是對應的主鍵ID這一列。 因為IDX_TEST_IOT_1是根據Name來建立的,預設是升序排列的,那麼很容易可以猜測這個索引item對應表中的哪一行資料,如下所示...

SQL > select id, name from ( select row_number() over ( order by name) rn, id, name from test_iot) where rn = 26 ;

ID NAME

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

29 TEST_QUEUE

現在用dump函數檢測下是否正确,

SQL > select dump ( ' TEST_QUEUE ' , 16 ) "col 0 ", dump ( 29 , 16 ) "col 1 " from dual;

col 0 col 1

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

Typ = 96 Len = 10 : 54 , 45 , 53 , 54 ,5f, 51 , 55 , 45 , 55 , 45 Typ = 2 Len = 2 : c1,1e

仔細瞅瞅,完全一樣,這就說明了IOT的secondary index中确實包含了primary key!

至于最後一行的 col 0: [ 4] 01 00 25 5c

不是很清楚,個人猜測應該是所謂的"physical guess", 指向IOT表的"physical rowid",  [4] 表示長度, 但是很奇怪地發現上面dump中的每一個row的最後一行都一樣!!這個待驗證!!!

轉載于:https://www.cnblogs.com/fangwenyu/archive/2010/11/13/1874608.html