通过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的变化:

实验环境:
否则因达到数据文件上限无法创建数据文件会报错,信息如下:
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;

数据文件个数大于1024时ORACLE数据文件FILE_ID及RELATIVE_FNO的变化示例的更多相关文章

  1. 彻底删除&quot;提示删除文件和目录&quot;时出错的文件或目录

    当删除文件是出现上图时  能够用以下的方法删除文件 策略一:系统大法 第一招  进程帮你搞定 很多时候乱码文件名称里的文件是explorer.exe进程联系在一起的. 假设要删除的话能够这样:首先命令 ...

  2. 7. Oracle数据加载和卸载

    在日常工作中:经常会遇到这样的需求: Oracle 数据表跟文本或者文件格式进行交互:即将指定文件内容导入对应的 Oracle 数据表中:或者从 Oracle 数据表导出. 其他数据库中的表跟Orac ...

  3. sql server迁移数据(文件组之间的互相迁移与 文件组内文件的互相迁移)

    转自:https://www.cnblogs.com/lyhabc/p/3504380.html?utm_source=tuicool SQLSERVER将数据移到另一个文件组之后清空文件组并删除文件 ...

  4. 使用bbed编辑研究oracle数据块结构

    bbed是随oracle软件公布的一款数据块查看和编辑工具,作为一款内部工具.bbed的功能很强大,可是假设使用不当可能给数据库造成无法挽回的损失.因此.我们建议在使用bbed改动数据块前备份被改动的 ...

  5. zip & tar 压缩文件时排除某个文件夹

    确实是用参数 -x aaa bbb 两个文件夹要写全路径. 如 zip -r test.zip test -x /test/aaa/* -x /test/bbb/* 既包含了文件夹,也可以 zip - ...

  6. shell 文件个数 vs 文件夹个数

    文件个数 ls -l |grep "^-"|wc -l 文件夹个数 ls -l |grep "^d"|wc -l

  7. linux 目录大小 文件个数 基于文件大小排列显示

    显示硬盘占用空间du -hlsblk 查看指定目录大小du -sh /opt查看各个目录大小du -h --max-depth=1 当前目录的全部文件个数(包含子文件夹的文件)ls -lR | gre ...

  8. Oracle数据文件和临时文件的管理

    一.数据文件概述在Oracle数据库中,SYSTEM和SYSAUX表空间至少需要包含一个数据文件,此外还将包含多个其他表空间及与其相关的数据文件和临时文件.Oracle的数据文件和临时文件是操作系统文 ...

  9. Oracle 数据泵文件

    数据泵文件 expdp介绍 EXPDP命令行选项1. ATTACH该选项用于在客户会话与已存在导出作用之间建立关联.语法如下ATTACH=[schema_name.]job_nameSchema_na ...

随机推荐

  1. Android:控件布局(单帧布局)FrameLayout

    FrameLayout:所有控件位于左上角,并且直接覆盖前面的子元素. 在最上方显示的层加上: android:clickable="true" 可以避免点击上层触发底层. 实例: ...

  2. 208. Implement Trie (Prefix Tree)

    题目: Implement a trie with insert, search, and startsWith methods. 链接: http://leetcode.com/problems/i ...

  3. python脚本工具 - 3 目录遍历

    遍历系统中某一目录下的所有文件名 #! /usr/bin/python # coding:utf-8 import os def dirList(path): filelist = os.listdi ...

  4. VMWare-NAT模式实现局域网其他主机对虚拟机访问

    WIN 2012在桥接模式下可以实现主机及主机所在局域网内其他主机对虚拟机的访问,但是在NAT模式下主机可以对虚拟机访问,但是主机所在的局域网内其他主机却无法对虚拟机访问,必须进行主机转发,从而实现局 ...

  5. JSOI2015 R3 退队滚粗了

    JSTSC最终落下帷幕,最终还是没能翻盘成功——退队了,遗憾啊,中原得鹿不由人 day0 没啥好说的,我一开始把省常中和常州一中搞混了……,不过常州一中的伙食还是相当良心的,比省常中好 考前感觉状态不 ...

  6. 20款最优秀的JavaScript编辑器

    毫无疑问SublimeText,Notepad++,webstorm等,是市面上最主导的编辑器,但当然也有一些更多的JavaScript编辑器提供众多的特性和功能,方便和轻松自由的编码.本文整理了20 ...

  7. 【原】android通过adb wireless的使用

    开发android程序,总是需要插拔插拔的,usb口都给弄坏掉了,现在adb可以通过无线网,链接处在同一个局域网下面的android设备 1.将电脑和移动设备链接到同一个无线网下 2.在android ...

  8. 从linux启动到rootfs的挂载分析

    简单的来说,根文件系统包括虚拟根文件系统和真实根文件系统.在Kernel启动的初始阶段,首先去创建虚拟的根文件系统,接下来再去调用do_mount来加载真正的文件系统,并将根文件系统切换到真正的文件系 ...

  9. java中的快捷键

    Ctrl+1 快速修复(最经典的快捷键,就不用多说了)Ctrl+D: 删除当前行 Ctrl+Alt+↓ 复制当前行到下一行(复制增加)Ctrl+Alt+↑ 复制当前行到上一行(复制增加)Alt+↓ 当 ...

  10. 【JMeter】JMeter使用plugins插件进行服务器性能监控

    性能测试时,我们的关注点有两部分 1 服务本身:并发 响应时间 QPS 2 服务器的资源使用情况:cpu memory I/O disk等 JMeter的plugins插件可以实现对"二&q ...