Oracle的文件号、相对文件号及其他

(转载自老熊)http://www.laoxiong.net/oracle_fn_rfn_other.html(下面的数据文件头的dump没有全部测试出来,即命令只查出了File Header,而没有看到Block Header,Block Header可能还需要用oradebug来查看,请注意,不过基本上全部测试通过,搞清了数据文件的绝对、相对文件号、还有段之间的联系。)

大家都知道从Oracle8开始,Oracle开始使用“相对文件号”,使原来一个数据库最多只能有1023个文件,扩展为一个表空间最多可以有1023个文件,每个库最多可以有65534个文件。

我们来作一个测试:

SQL> create tablespace test_mf datafile ‘F:\Works\oracle\product\10.2.0\oradata\
xj\many\m1.dbf’ size 100k reuse;

表空间已创建。

SQL> alter tablespace test_mf add datafile ‘F:\Works\oracle\product\10.2.0\orada
ta\xj\many\m2.dbf’ size 88k;

表空间已更改。

SQL> show parameter db_files

NAME                        TYPE        VALUE
--------------------------- ----------- ---------------
db_files                    integer     2000

SQL> begin
  2    for i in 3..1025 loop
  3       execute immediate’alter tablespace test_mf add datafile ”F:\Works\ora
cle\product\10.2.0\oradata\xj\many\m_’ || i ||”’ size 88k’;
  4   end loop;
  5  end;
  6  /
begin
*
第 1 行出现错误:
ORA-01686: 最大文件数 (1023) 对于表空间 TEST_MF 已达到
ORA-06512: 在 line 3

SQL> select count(*) from dba_data_files where tablespace_name=’TEST_MF’;

  COUNT(*)
----------
      1023

可以看到表空间TEST_MF的文件数为1023个,最多也只能为1023个。

SQL> select ts# from v$tablespace where name=’TEST_MF’;

       TS#
----------
         8

SQL> select file#,rfile#,name from v$datafile where ts#=8;

     FILE#     RFILE# NAME                                                                                             
---------- ---------- ------------------------------------------------------------                                     
         7          7 F:\WORKS\ORACLE\PRODUCT\10.2.0\ORADATA\XJ\MANY\M1.DBF                                            
         8          8 F:\WORKS\ORACLE\PRODUCT\10.2.0\ORADATA\XJ\MANY\M2.DBF                                            
         9          9 F:\WORKS\ORACLE\PRODUCT\10.2.0\ORADATA\XJ\MANY\M_1                                               
        10         10 F:\WORKS\ORACLE\PRODUCT\10.2.0\ORADATA\XJ\MANY\M_2                                               
        11         11 F:\WORKS\ORACLE\PRODUCT\10.2.0\ORADATA\XJ\MANY\M_3                                               
……………………………………………………………………….
      1019       1019 F:\WORKS\ORACLE\PRODUCT\10.2.0\ORADATA\XJ\MANY\M_1011                                            
      1020       1020 F:\WORKS\ORACLE\PRODUCT\10.2.0\ORADATA\XJ\MANY\M_1012                                            
      1021       1021 F:\WORKS\ORACLE\PRODUCT\10.2.0\ORADATA\XJ\MANY\M_1013                                            
      1022       1022 F:\WORKS\ORACLE\PRODUCT\10.2.0\ORADATA\XJ\MANY\M_1014                                            
      1023       1023 F:\WORKS\ORACLE\PRODUCT\10.2.0\ORADATA\XJ\MANY\M_1015                                            
      1024          1 F:\WORKS\ORACLE\PRODUCT\10.2.0\ORADATA\XJ\MANY\M_1016                                            
      1025          2 F:\WORKS\ORACLE\PRODUCT\10.2.0\ORADATA\XJ\MANY\M_1017                                            
      1026          3 F:\WORKS\ORACLE\PRODUCT\10.2.0\ORADATA\XJ\MANY\M_1018                                            
      1027          4 F:\WORKS\ORACLE\PRODUCT\10.2.0\ORADATA\XJ\MANY\M_1019                                            
      1028          5 F:\WORKS\ORACLE\PRODUCT\10.2.0\ORADATA\XJ\MANY\M_1020                                            
      1029          6 F:\WORKS\ORACLE\PRODUCT\10.2.0\ORADATA\XJ\MANY\M_1021
                                            

从上面的数据可以看出,当绝对文件号小于等于1023,相对文件号与绝对文件号一样。相对文件号大于1023之后,又从1开始循环。

我们DUMP最后一个文件的文件头块看看:

alter session set events 'immediate trace name FILE_HDRS level 10';(此命令只可看到File Header的信息,而下面的Block Header信息看不到,可能还需要用oradebug等命令来查看。)

Block Header:
block type=0×0b (file header)
block format=0xa2 (oracle 10)
block rdba=0×01800001 (file#=6, block#=1)
scn=0×0000.00000000, seq=1, tail=0×00000b01
block checksum value=0xe7f3=59379, flag=4
File Header:
Db Id=0xb004e979=2953111929, Db Name=XJ, Root Dba=0×0
Software vsn=0×0, Compatibility Vsn=0xa200100, File Size=0xb=11 Blocks
File Type=0×3 (data file), File Number=1029, Block Size=8192
Tablespace #8 - TEST_MF rel_fn:6

文件头里面有两部分内容,第一部分为块头,块头记录了该块的RDBA:block rdba=0×01800001 (file#=6, block#=1),因此块头记录的是相对文件号。第二部分为文件头,文件头里面有如下的记录:
    File Type=0×3 (data file), File Number=1029, Block Size=8192
   Tablespace #8 - TEST_MF rel_fn:6
因此文件头里同时记录了文件绝对号,表空间号和相对文件号。

下面我们再做另一个实验,看看段是怎么跟文件号关联的。

SQL> create tablespace test_lf datafile ‘F:\WORKS\ORACLE\PRODUCT\10.2.0\ORADATA\
XJ\MANY\TEST_LF.dbf’ size 1m;

表空间已创建。

SQL> select ts# from v$tablespace where name=’TEST_LF’;

       TS#
----------
         9

SQL> select file#,rfile#,name from v$datafile where ts#=9;

     FILE#     RFILE# NAME
---------- ---------- ------------------------------------------------------------
      1030          7 F:\WORKS\ORACLE\PRODUCT\10.2.0\ORADATA\XJ\MANY\TEST_LF.DBF

从上面的数据可以看出,一个表空间的数据文件,其相对文件号并不是从1开始的,而依然是从上一个用过的最后一个相对文件号继续。

SQL> select obj# from obj$ where owner#=0 and name=’T1′;

      OBJ#
----------
     47686

SQL> select obj#,dataobj#,ts#,file# from tab$ where obj#=47686;

      OBJ#   DATAOBJ#        TS#      FILE#
---------- ---------- ---------- ----------
     47686      47686          9          7

在数据字典里面记录了表的段头表空间号和相对文件号。

SQL> select header_file,header_block,relative_fno from dba_segments where segmen
t_name=’T1′ and wner=’SYS’;

HEADER_FILE HEADER_BLOCK RELATIVE_FNO
----------- ------------ ------------
       1030           11            7

 

在DBA_SEGMENTS视图里面,可以查到段头的相对文件号和绝对文件号。(这个视图最终是从file$、seg$等字典表里面取得数据)

原文地址:https://www.cnblogs.com/taowang2016/p/2947892.html