近期在做测试的时候,发现了一个比较有意思的事情,或者我才知道 Oracle数据文件有两个标识号,file_id 和 RELATIVE_FNO. 通过官方文档,我们可以看到两列的不同。
- file_id : Absolute file number of the database file
- RELATIVE_FNO : Relative file number
他们什么区别呢, file_id在数据库中是唯一的,绝对的。relative 文件号在数据库中是相对的,不唯一,但它在表空间中是唯一的,也就是这个编号更多用于表空间内部数据文件管理或标识。 下面我们来看一个例子(数据库版本19c,pdb中信息)
创建一个表,并检查表空间信息
FID RFID TABLESPACE_NAME FILE_NAME GB STATUS AUT CREATION_TIME
----- ----- ---------------- ---------------------------------------------- --- --------- --- -------------------
9 1 SYSTEM +DATA/TESTDB/9B8727/DATAFILE/system.272.1029073067 .33 AVAILABLE YES 2020/01/07 13:38:33
10 4 SYSAUX +DATA/TESTDB/9B8727/DATAFILE/sysaux.273.1029073069 1.05 AVAILABLE YES 2020/01/07 13:38:34
11 9 UNDOTBS1 ATA/TESTDB/9B8727/DATAFILE/undotbs1.271.1029073067 1.8 AVAILABLE YES 2020/01/07 13:38:35
12 12 USERS +DATA/TESTDB/9B8727/DATAFILE/users.275.1029073193 .42 AVAILABLE YES 2020/01/07 13:39:55
17 11 MYWORK +DATA/TESTDB/9B8727/DATAFILE/mywork_339_1061286829 .1 AVAILABLE YES 2021/01/08 13:20:57
18 8 MYWORK +DATA/TESTDB/9B8727/DATAFILE/mywork_406_1052385811 .1 AVAILABLE NO 2021/01/08 13:20:57
16 9 MYTEST +DATA/TESTDB/9B8727/DATAFILE/mytest_270_1025380271 1.66 AVAILABLE YES 2021/01/08 13:20:58
15 10 MYTEST +DATA/TESTDB/9B8727/DATAFILE/mytest_342_1033661031 5 AVAILABLE NO 2021/01/08 13:20:58
13 13 MY2021 +DATA/TESTDB/9B8727/DATAFILE/my2021_337_1061295575 .05 AVAILABLE NO 2021/01/08 13:20:58
14 12 MY2021 +DATA/TESTDB/9B8727/DATAFILE/my2021_338_1061286849 .1 AVAILABLE NO 2021/01/08 13:20:58
32 32 EXAMPLE +DATA/TESTDB/9B8727/DATAFILE/example.293.1085838709 .49 AVAILABLE YES 2021/10/13 13:51:57
33 33 T2022 +DATA/TESTDB/9B8727/DATAFILE/t2022.294.1094463911 .49 AVAILABLE NO 2022/01/20 09:45:20
36 36 T2022 +DATA/TESTDB/9B8727/DATAFILE/t2022.282.1094464527 .49 AVAILABLE NO 2022/01/20 09:55:33
37 37 MY2021 +DATA/TESTDB/9B8727/DATAFILE/my2021.292.1094464581 .1 AVAILABLE NO 2022/01/20 09:56:22
例如上边,绝对文件号 和相对文件号不同。
我们看下 表的相关信息
SQL> select owner,segment_name,BLOCKS,EXTENTS,HEADER_BLOCK,HEADER_FILE,RELATIVE_FNO from dba_segments where segment_name='T1' and owner='MYTEST';
OWNER SEGMENT_NAME BLOCKS EXTENTS HEADER_BLOCK HEADER_FILE RELATIVE_FNO
-------------------- -------------------- ---------- ---------- ------------ ----------- ------------
MYTEST T1 8 1 60418 16 9
SQL> SQL> select owner,segment_name,EXTENT_ID,BLOCK_ID,BLOCKS,FILE_ID,RELATIVE_FNO from dba_extents where segment_name='T1' and owner='MYTEST';
OWNER SEGMENT_NAME EXTENT_ID BLOCK_ID BLOCKS FILE_ID RELATIVE_FNO
-------------------- -------------------- ---------- ---------- ---------- ---------- ------------
MYTEST T1 0 60416 8 16 9
现在通过dump文件,查看下段头信息
alter system dump datafile 16 block 60416;
检查段头信息,
#开始有个 buffer header 信息,其实这里比较明显,告诉file_id 是16, dba 是9/60418
BH (0xdcea5898) file#: 16 rdba: 0x0240ec02 (9/60418) class: 4 ba: 0xdc1aa000
我们通过地址转换发现,这个dba地址确实是 9,60418。 因为我们dump的file号是16,16是绝对地址,9 其实就是相对地址。也就是说,dba中记录了文件号和块号,其中文件号是相对地址。
后边段头信息,可供参考,所有dba地址中文件号指向的都是9
Extent Control Header
-----------------------------------------------------------------
Extent Header:: spare1: 0 spare2: 0 #extents: 1 #blocks: 8
last map 0x00000000 #maps: 0 offset: 2716
Highwater:: 0x0240ec08 ext#: 0 blk#: 8 ext size: 8
#blocks in seg. hdr's freelists: 0
#blocks below: 5
mapblk 0x00000000 offset: 0
Unlocked
--------------------------------------------------------
Low HighWater Mark :
Highwater:: 0x0240ec08 ext#: 0 blk#: 8 ext size: 8
#blocks in seg. hdr's freelists: 0
#blocks below: 5
mapblk 0x00000000 offset: 0
Level 1 BMB for High HWM block: 0x0240ec00
Level 1 BMB for Low HWM block: 0x0240ec00
--------------------------------------------------------
Segment Type: 1 nl2: 1 blksz: 8192 fbsz: 0
L2 Array start offset: 0x00001434
First Level 3 BMB: 0x00000000
L2 Hint for inserts: 0x0240ec01
Last Level 1 BMB: 0x0240ec00
Last Level II BMB: 0x0240ec01
Last Level III BMB: 0x00000000
Map Header:: next 0x00000000 #extents: 1 obj#: 180188 flag: 0x10000000
Inc # 0
Extent Map
-----------------------------------------------------------------
0x0240ec00 length: 8
Auxillary Map
--------------------------------------------------------
Extent 0 : L1 dba: 0x0240ec00 Data dba: 0x0240ec03
--------------------------------------------------------
Second Level Bitmap block DBAs
--------------------------------------------------------
DBA 1: 0x0240ec01