• 数据文件个数大于1024时ORACLE数据文件FILE_ID及RELATIVE_FNO的变化示例


    通过ROWID计算数据块的相关信息:  --详见: 数据文件头块保留大小、ROWID、数据文件最大大小等数据库限制的说明
    根据small file tablespace的ROWID,计算出表空间、数据文件、BOOCK中行最大数如下:
    根据ROWID的构成:          ---注:2^10这种写法代表2的10次方,等于1024.
    每个表空间最大文件数:      2^10 1024 , 去掉全0和全1 通常1022个 ---本文下面的实验测试出是1023个
    每数据文件最大数据块数量:filesize=block_size*2^22   ,也就是4M个ORACLE BLOCK
    每个BLOKC中行数是:       2^16   65536,也就是每个BLOCK最多65536条记录
    每个数据库最多65536个-64K个数据文件 下面修改参数的实验得出是65534--官方文档写的是65533),最多支持64K个表空间,因为每个表空间最少需要包含一个数据文件。
    更详细的数据库限制见官方文档:http://docs.oracle.com/cd/B19306_01/server.102/b14237/limits.htm#REFRN004

    这里引出新问题:如果数据库有大于1024个数据文件,ORACLE如何通过ROWID定位数据文件呢?

    这里oracle引入了相对文件号的概念,这种方法的主要思想是改变之前rowid中数据文件编号是参考整个数据库范围的事实,将其参考的范围改为表空间,即文件编号为4的文件不再是数据库中编号为4的数据文件,而是某个表空间中编号为4的数据文件。
    这样我们便可以在不改变物理存储格式的情况下(仅仅是我们在解析rowid内容时的处理逻辑发生了变化,如将前10bit解析为表空间相对文件号rfn,而不是文件号file_id,然后通过数据字典视图将),进行数据库的扩容等等。

    SQL> select file_id,relative_fno from dba_data_files;   --可以查询FILE#和表空间内的相对FILE#

    在数据文件数量没有超过1023个时,oracle数据库尽量保持file_id和relative_fno的相同;

    在超过1023个数据文件后,oracle就会保证在整个数据库内file_id是唯一的,在单个表空间中relative_fno是唯一的。

    那么这时就会存在一个问题,不同表空间中的具有相同相对文件号数据文件oracle是怎样区分开来的那?

    为了解决这个问题,oracle在原有64byte rowid的基础上又添加了DATA_OBJECT_ID的信息,构成扩展rowid,即扩展rowid由四部分构成:data_object_id,rfn,block#,row#。

    通过data_object_id 和数据字典视图的结合,oracle可以非常快速的将rfn转换为file_id,从而也就可以准确的进行行定位。

    下面用实验来验证ORACLE对大于1024个数据文件时相对文件号relative_fno及文件号file_id的变化:

    实验环境:数据库版本是11.2.0.4.0
    需要提前修改数据库内对数据文件最大值的限制:
    BYS@ bys3>show parameter db_files              ----当前数据库最大文件限制是200.建库时默认设置的。
    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------------------------------
    db_files                             integer     200
    BYS@ bys3>alter system set db_files=5000 scope=spfile;  
    System altered.
     --数据文件最大数是65536,64K个下面修改参数的实验得出是65534--官方文档上是65533-http://docs.oracle.com/cd/B19306_01/server.102/b14237/limits002.htm#i287915)。详见: 数据文件头块保留大小、ROWID、数据文件最大大小等数据库限制的说明
    关于数据库中数据文件最大个数: ---实验测出是65534,如下设置参数,启动,根据报错提示提示。--感谢群友提供思路。
    SYS@ bys3>alter system set db_files=65536 scope=spfile;   
    System altered.
    SYS@ bys3>startup   --关库重启报错如下:
    ORA-01131: DB_FILES system parameter value 65536 exceeds limit of 65534
    SYS@ bys3>show parameter db_files    --又一次修改为65534,可以重启,查看参数已经修改为65534.
    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------------------------------
    db_files                             integer     65534
    否则因达到数据文件上限无法创建数据文件会报错,信息如下:
    ERROR at line 1:
    ORA-00059: maximum number of DB_FILES exceeded
    ORA-06512: at line 6
    提前创建好存放数据文件的目录(建议用新目录单独存放方便管理)并确保权限正确:/u01/oradata/bys3/test1/   /u01/oradata/bys3/test2/
    ##########################################

    实验思路:

    1.查询当前系统中数据文件的文件名,文件号,相对文件号信息。
    2.新建一个TEST1表空间,然后使用循环新建1020个数据文件-此时TEST1有1021个数据文件。
    3.手动输入命令,新建数据库文件,在增加到第1024个数据文件时会报错。--得出表空间最大是1023个数据文件。
    4.查看此时文件号,相对文件号信息,对比并总结。
    5.再创建一个TEST2表空间,然后使用循环新建1022个数据文件-此时TEST2有1023个数据文件。
    6.查看此时文件号,相对文件号信息,对比并总结。
    7.删除实验用表空间/数据文件,恢复测试环境。
    结论:
    通过实验,可以验证在一个表空间中,相对文件号RELATIVE_FNO是可以从1-1023。但是在表空间中实际的相对文件号并不是1-1023的顺序,可能是 5-1023,1-4这样。总之就是在一个表空间内,相对文件号是惟一的。
    比如:如果表空间只有500个数据文件,假设最后一个数据文件的相对文件号和FILE_ID都是506,此时再增加新表空间,新表空间的第一个数据文件的相对文件号和FILE_ID都是507。
    相对文件号RELATIVE_FNO变为1只在数据库全库数据文件到达第1024个时发生(1023个时正常--相对文件号和FILE_ID相同)。当然了在数据文件号达到2046个后,第2047个又是1,也就是以1023个为轮回吧哈哈.
    ##############################

    1、查询当前系统中数据文件的文件名,文件号,相对文件号信息。

    BYS@ bys3>col file_name for a35
    BYS@ bys3>select file_name,file_id,RELATIVE_FNO from dba_data_files;
    FILE_NAME                              FILE_ID RELATIVE_FNO
    ----------------------------------- ---------- ------------
    /u01/oradata/bys3/system01.dbf               1            1
    /u01/oradata/bys3/sysaux01.dbf               2            2
    /u01/oradata/bys3/undotbs01.dbf              3            3
    /u01/oradata/bys3/user01.dbf                 4            4
    BYS@ bys3>select count(file_name) from dba_data_files;
    COUNT(FILE_NAME)
    ----------------
                   4
    ###################################################################

    2.新建一个TEST1表空间,然后使用循环新建1020个数据文件-此时TEST1有1021个数据文件。

    创建表空间TEST1:  
    create tablespace test1 datafile '/u01/oradata/bys3/test1/test001.dbf' size 1m;
    使用循环1为test1表空间增加1020个大小为1M的数据文件
    declare
      v_sql varchar2(1000) ;
    begin
      for i in 1..1020 loop
        v_sql := 'alter tablespace test1 add datafile ''/u01/oradata/bys3/test1/test'||i||'.dbf'' size 1m';
          execute immediate v_sql ;
      end loop;
    end ;
    /
    #######CREATE TABLESPACE已经指定一个数据文件,此时表空间TEST1内有1021个数据文件。
    查询:
    col file_name for a38
    BYS@ bys3>select * from (select file_name,file_id,relative_fno from dba_data_files where tablespace_name='TEST1' order by file_id desc) where rownum<5;
    FILE_NAME                                 FILE_ID RELATIVE_FNO
    -------------------------------------- ---------- ------------
    /u01/oradata/bys3/test1/test1020.dbf         1025            2
    /u01/oradata/bys3/test1/test1019.dbf         1024            1
    /u01/oradata/bys3/test1/test1018.dbf         1023         1023

    /u01/oradata/bys3/test1/test1017.dbf         1022         1022
    ################

    3.手动输入命令,新建数据库文件,在增加到第1024个数据文件时会报错。  --测试得出表空间最大文件数是1023

    BYS@ bys3>alter tablespace test1 add datafile '/u01/oradata/bys3/test1/test1021.dbf' size 1m;
    Tablespace altered.
    BYS@ bys3>alter tablespace test1 add datafile '/u01/oradata/bys3/test1/test1022.dbf' size 1m;
    Tablespace altered.
    BYS@ bys3>alter tablespace test1 add datafile '/u01/oradata/bys3/test1/test1023.dbf' size 1m;
    alter tablespace test1 add datafile '/u01/oradata/bys3/test1/test1023.dbf' size 1m
    *
    ERROR at line 1:
    ORA-01686: max # files (1023) reached for the tablespace TEST1

    #####################################################################

    4.查看此时文件号,相对文件号信息,对比并总结。

    BYS@ bys3>select count(file_name) from dba_data_files where tablespace_name='TEST1';
    COUNT(FILE_NAME)
    ----------------
                1023

    BYS@ bys3>select * from (select file_name,file_id,relative_fno from dba_data_files where tablespace_name='TEST1' order by file_id desc) where rownum<10;
    FILE_NAME                                 FILE_ID RELATIVE_FNO
    -------------------------------------- ---------- ------------
    /u01/oradata/bys3/test1/test1022.dbf         1027            4        
    /u01/oradata/bys3/test1/test1021.dbf         1026            3
    /u01/oradata/bys3/test1/test1020.dbf         1025            2
    /u01/oradata/bys3/test1/test1019.dbf         1024            1    ---可以看到相对文件号大于1023时,自动变为1--TEST1表空间的1
    /u01/oradata/bys3/test1/test1018.dbf         1023         1023
    /u01/oradata/bys3/test1/test1017.dbf         1022         1022
    /u01/oradata/bys3/test1/test1016.dbf         1021         1021
    /u01/oradata/bys3/test1/test1015.dbf         1020         1020
    /u01/oradata/bys3/test1/test1014.dbf         1019         1019
    BYS@ bys3>select * from (select file_name,file_id,relative_fno from dba_data_files  order by file_id ) where rownum<10;
    FILE_NAME                                 FILE_ID RELATIVE_FNO
    -------------------------------------- ---------- ------------
    /u01/oradata/bys3/system01.dbf                  1            1
    /u01/oradata/bys3/sysaux01.dbf                  2            2
    /u01/oradata/bys3/undotbs01.dbf                 3            3
    /u01/oradata/bys3/user01.dbf                    4            4
    /u01/oradata/bys3/test1/test001.dbf             5            5       ---TEST1表空间的相对文件号从5开始的
    /u01/oradata/bys3/test1/test1.dbf               6            6
       -----
    /u01/oradata/bys3/test1/test2.dbf               7            7
    /u01/oradata/bys3/test1/test3.dbf               8            8
    /u01/oradata/bys3/test1/test4.dbf               9            9
    BYS@ bys3>select file_name,file_id,relative_fno from dba_data_files  where relative_fno=1;
    FILE_NAME                                 FILE_ID RELATIVE_FNO
    -------------------------------------- ---------- ------------
    /u01/oradata/bys3/system01.dbf                  1            1
    /u01/oradata/bys3/test1/test1019.dbf         1024            1

    ####################################################

    5.再创建一个TEST2表空间,然后使用循环新建1022个数据文件-此时TEST2有1023个数据文件。

    创建表空间TEST2:  
    create tablespace test2 datafile '/u01/oradata/bys3/test2/test001.dbf' size 1m;
    使用循环2为test1表空间增加1022个大小为1M的数据文件
    declare
      v_sql2 varchar2(1000) ;
    begin
      for i in 1..1022 loop
        v_sql2 := 'alter tablespace test2 add datafile ''/u01/oradata/bys3/test2/test'||i||'.dbf'' size 1m';
          execute immediate v_sql2 ;
      end loop;
    end ;
    /
    #########CREATE TABLESPACE已经指定一个数据文件,此时表空间TEST2内有1023个数据文件。

    6.查看此时文件号,相对文件号信息,对比并总结。

    BYS@ bys3>select count(file_name) from dba_data_files where tablespace_name='TEST2';
    COUNT(FILE_NAME)
    ----------------
                1023
    BYS@ bys3>select * from (select file_name,file_id,relative_fno from dba_data_files where tablespace_name='TEST2' order by file_id desc) where rownum<9;
    FILE_NAME                                 FILE_ID RELATIVE_FNO
    -------------------------------------- ---------- ------------
    /u01/oradata/bys3/test2/test1022.dbf         2050            4
    /u01/oradata/bys3/test2/test1021.dbf         2049            3
    /u01/oradata/bys3/test2/test1020.dbf         2048            2
    /u01/oradata/bys3/test2/test1019.dbf         2047            1           -------结合第4步的查询,TEST2表空间的相对文件号也是从5开始的,所以这里可以有1 2 3 4的相对文件号。
    /u01/oradata/bys3/test2/test1018.dbf         2046         1023
    /u01/oradata/bys3/test2/test1017.dbf         2045         1022

    /u01/oradata/bys3/test2/test1016.dbf         2044         1021
    /u01/oradata/bys3/test2/test1015.dbf         2043         1020
    8 rows selected.
    通过以下查询,可以验证在一个表空间中,相对文件号RELATIVE_FNO是可以从1-1023。

    当然如果表空间只有500个数据文件,假设最后一个数据文件的相对文件号和FILE_ID都是506,此时再增加新表空间,新表空间的第一个数据文件的相对文件号和FILE_ID都是507.。

    相对文件号RELATIVE_FNO变为1只在数据库全库数据文件到达第1024个时发生(1023个时正常--相对文件号和FILE_ID相同)。
    BYS@ bys3>select file_name,file_id,relative_fno from dba_data_files  where relative_fno in(1,1022,1023);

    FILE_NAME                                 FILE_ID RELATIVE_FNO
    -------------------------------------- ---------- ------------
    /u01/oradata/bys3/system01.dbf                  1            1       
    /u01/oradata/bys3/test1/test1017.dbf         1022         1022        ---生成数据文件序号顺序,
    /u01/oradata/bys3/test1/test1018.dbf         1023         1023        ---可以看到相对文件号大于1023时,自动变为1--TEST1表空间的1
    /u01/oradata/bys3/test1/test1019.dbf         1024            1          --FILE_ID在不断增大

    /u01/oradata/bys3/test2/test1017.dbf         2045         1022     ---生成数据文件序号顺序,
    /u01/oradata/bys3/test2/test1018.dbf         2046         1023      ---可以看到相对文件号大于1023时,自动变为1--TEST2表空间的1
    /u01/oradata/bys3/test2/test1019.dbf         2047            1      --FILE_ID在不断增大


    #########################

    7.删除实验用表空间/数据文件,恢复测试环境。

    drop tablespace test1 including contents and datafiles;
    drop tablespace test2 including contents and datafiles;

  • 相关阅读:
    FastMM、FastCode、FastMove的使用(图文并茂)
    12种JavaScript MVC框架之比较
    十款最佳Node.js MVC框架
    Couchbase 服务器
    C#程序员阅读的书籍
    ORM的实现
    Linux内核策略介绍
    ASP.NET MVC + EF 利用存储过程读取大数据
    面向.Net程序员的dump分析
    动态加载与插件化
  • 原文地址:https://www.cnblogs.com/fuhaots2009/p/3478976.html
Copyright © 2020-2023  润新知