【DBA】Oracle 中DBA地址的文件号使用的是相对文件号(RELATIVE_FNO)

近期在做测试的时候,发现了一个比较有意思的事情,或者我才知道 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
请使用浏览器的分享功能分享到微信等