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

2014-11-24 09:03:58 · 作者: · 浏览: 3
通过ROWID计算数据块的相关信息: --详见: 数据文件头块保留大小、ROWID、数据文件最大大小等 数据库限制的说明
根据small file tablespace的ROWID,计算出表空间、数据文件、BOOCK中行最大数如下:
根据ROWID的构成: ---注:2^10这种写法代表2的10次方,等于1024.
每个表空间最大文件数: 2^10 1024 ,去掉全0和全1 通常1022个
每数据文件最大数据块数量:filesize=block_size*2^22 ,也就是4M个ORACLE BLOCK
每个BLOKC中行数是: 2^16 65536,也就是每个BLOCK最多65536条记录
每个数据库最多65536个-64K个数据文件,最多支持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#

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

在超过1022个数据文件后,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的变化:

实验环境:
需要提前修改数据库内对数据文件最大值的限制:
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个。详见: 数据文件头块保留大小、ROWID、数据文件最大大小等数据库限制的说明
SYS@ bys3>show parameter db_files
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_files integer 5000
否则因达到数据文件上限无法创建数据文件会报错,信息如下:
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.删除实验用表空间/数据文件,恢复测试环境。
##############################

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 immedi