大家都知道从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 193..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最后一个文件的文件头块看看:
Block Header:
block type=0x0b (file header)
block format=0xa2 (oracle 10)
block rdba=0x01800001 (file#=6, block#=1)
scn=0x0000.00000000, seq=1, tail=0x00000b01
block checksum value=0xe7f3=59379, flag=4
File Header:
Db Id=0xb004e979=2953111929, Db Name=XJ, Root Dba=0x0
Software vsn=0x0, Compatibility Vsn=0xa200100, File Size=0xb=11 Blocks
File Type=0x3 (data file), File Number=1029, Block Size=8192
Tablespace #8 - TEST_MF rel_fn:6
文件头里面有两部分内容,第一部分为块头,块头记录了该块的RDBA:block rdba=0x01800001 (file#=6, block#=1),因此块头记录的是相对文件号。第二部分为文件头,文件头里面有如下的记录:
File Type=0x3 (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$等字典表里面取得数据)