Oracle的rowid和rdba庖丁解牛(二)

2014-11-24 17:52:30 · 作者: · 浏览: 4
file#: 4 minblk 29348 maxblk 29348


buffer tsn: 4 rdba: 0x010072a4 (4/29348)


scn: 0x0000.00e66a1e seq: 0x02 flg: 0x06 tail: 0x6a1e0602


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


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


结果我们推导的和dump的内容是一样的,不过这里得到的4是rfile#,相对文件号,而相对文件号是不能超过1023,所以,如果你想根据这个地址来dump数据文件块的话,最好还是核对一下v$datafile:


select file# from v$datafile where rfile# = 4 and ts# = <:dbfile_in_ts>


表空间的ts#可以通过如下sql得到:


select ta.tablespace_name, da.TS#
from dba_tablespaces ta, dba_data_files df, v$datafile da
where ta.tablespace_name = df.tablespace_name
and da.NAME = df.file_name


例如:


SQL> select file# from v$datafile where rfile# = 4 and ts# = 4;


FILE#


----------


4


SQL>



如果数据文件数大于1023个,这里file# 就不是4了,应该是个绝对文件号了,这就是file#和rfile#的区别。如果dump数据块,要用绝对文件号的,例如:


Alter system dump datafile 4 block 29348;


也可以通过dba_segments,如


SQL> select header_file,header_block from dba_segments where owner='SKATE' and segment_name='TAB2';


HEADER_FILE HEADER_BLOCK


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


4 29347


这里段头占有一个block,后面存储的就是数据,所以存储数据的块,应该是29348


-----end-----