(转载自老熊)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$等字典表里面取得数据)