zoukankan      html  css  js  c++  java
  • 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$等字典表里面取得数据)

  • 相关阅读:
    GIT在Linux上的安装和使用简介心得
    Android开发环境使用到工具的认识心得
    Android系统移植与驱动开发心得
    嵌入式Linux的调试技术
    硬件抽象层——HAL
    Linux代码的重用与强行卸载Linux驱动
    控制发光二极管
    详细讲解Linux驱动程序
    搭建测试环境——针对S3C6410开发板
    有了源代码,当然还需要编译喽!!
  • 原文地址:https://www.cnblogs.com/taowang2016/p/2947892.html
Copyright © 2011-2022 走看看