共計 7643 個字符,預(yù)計需要花費 20 分鐘才能閱讀完成。
Oracle 中相對文件號(RFN)和絕對文件號(AFN)的示例分析,相信很多沒有經(jīng)驗的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。
大家都知道從 Oracle8 開始,Oracle 開始使用“相對文件號”,使原來一個數(shù)據(jù)庫最多只能有 1023 個文件,擴(kuò)展為一個表空間最多可以有 1023 個文件,每個庫最多可以有 65534 個文件。
絕對文件號相對于整個數(shù)據(jù)庫是唯一的,每個庫最多可以有 65534 個文件。
相對文件號則相對于表空間是唯一的,就是說每個表空間都有自己的相對文件號,每個表空間的最大文件數(shù)為 1023,相對文件號對于整個數(shù)據(jù)庫來說是不唯一的;
查詢:
SQL select TS#,FILE#,name from v$datafile order by 1,2;
TS# FILE# NAME
———- ———- ————————————————————
0 1 /u01/app/oracle/oradata/DBdb/system01.dbf
1 2 /u01/app/oracle/oradata/DBdb/sysaux01.dbf
2 3 /u01/app/oracle/oradata/DBdb/undotbs01.dbf
4 4 /u01/app/oracle/oradata/DBdb/users01.dbf
4 7 /u01/app/oracle/oradata/DBdb/users02.dbf
4 9 /u01/app/oracle/oradata/DBdb/users03.dbf
6 5 /u01/app/oracle/oradata/DBdb/example01.dbf
7 6 /u01/app/oracle/oradata/DBdb/test.dbf
7 8 /u01/app/oracle/oradata/DBdb/test02.DBF
9 rows selected.
查詢 v$datafile 此視圖缺少 tmp 臨時表空間信息,同時包含出 tmp 臨時表空間之外的所有表空間下的所有數(shù)據(jù)文件
SQL select TS#,FILE#,NAME,BYTES/1024/1024 size_m from v$tempfile;
TS# FILE# NAME SIZE_M
———- ———- ———————————————————— ———-
3 1 /u01/app/oracle/oradata/DBdb/temp01.dbf 179
file# 絕對文件號
SQL select TS#,NAME,BIGFILE from v$tablespace order by 1;
TS# NAME BIG
———- ———————————————————— —
0 SYSTEM NO
1 SYSAUX NO
2 UNDOTBS1 NO
3 TEMP NO
4 USERS NO
6 EXAMPLE NO
7 TEST NO
7 rows selected.
SQL select TABLESPACE_NAME,FILE_ID,FILE_NAME,BYTES/1024/1024 size_m,STATUS from dba_data_files order by 2;
TABLESPACE_NAME FILE_ID FILE_NAME SIZE_M STATUS
—————————— ———- ———————————————————— ———- ———
SYSTEM 1 /u01/app/oracle/oradata/DBdb/system01.dbf 2800 AVAILABLE
SYSAUX 2 /u01/app/oracle/oradata/DBdb/sysaux01.dbf 720 AVAILABLE
UNDOTBS1 3 /u01/app/oracle/oradata/DBdb/undotbs01.dbf 2585 AVAILABLE
USERS 4 /u01/app/oracle/oradata/DBdb/users01.dbf 3058.75 AVAILABLE
EXAMPLE 5 /u01/app/oracle/oradata/DBdb/example01.dbf 338.75 AVAILABLE
TEST 6 /u01/app/oracle/oradata/DBdb/test.dbf 10 AVAILABLE
USERS 7 /u01/app/oracle/oradata/DBdb/users02.dbf 10 AVAILABLE
TEST 8 /u01/app/oracle/oradata/DBdb/test02.DBF 10 AVAILABLE
USERS 9 /u01/app/oracle/oradata/DBdb/users03.dbf 10 AVAILABLE
9 rows selected.
查詢得包含表空間下的所有數(shù)據(jù)文件
SQL select TABLESPACE_NAME,STATUS,CONTENTS,FORCE_LOGGING,EXTENT_MANAGEMENT,SEGMENT_SPACE_MANAGEMENT,ALLOCATION_TYPE,RETENTION,BIGFILE from dba_tablespaces;
TABLESPACE_NAME STATUS CONTENTS FOR EXTENT_MAN SEGMEN ALLOCATIO RETENTION BIG
—————————— ——— ——— — ———- —— ——— ———– —
SYSTEM ONLINE PERMANENT NO LOCAL MANUAL SYSTEM NOT APPLY NO
SYSAUX ONLINE PERMANENT NO LOCAL AUTO SYSTEM NOT APPLY NO
UNDOTBS1 ONLINE UNDO NO LOCAL MANUAL SYSTEM NOGUARANTEE NO
TEMP ONLINE TEMPORARY NO LOCAL MANUAL UNIFORM NOT APPLY NO
USERS ONLINE PERMANENT NO LOCAL AUTO SYSTEM NOT APPLY NO
EXAMPLE ONLINE PERMANENT NO LOCAL AUTO SYSTEM NOT APPLY NO
TEST ONLINE PERMANENT NO LOCAL AUTO SYSTEM NOT APPLY NO
7 rows selected.
實驗開始:
SQL create tablespace test_mf datafile /u01/app/oracle/oradata/DBdb/m1.dbf size 100k reuse;
Tablespace created.
SQL alter tablespace test_mf add datafile /u01/app/oracle/oradata/DBdb/m2.dbf size 88k;
Tablespace altered.
SQL show parameter db_files
NAME TYPE VALUE
———————————— ———– ——————————
db_files integer 2000
SQL
SQL begin
for i in 3..1025 loop
execute immediate alter tablespace test_mf add datafile /u01/app/oracle/oradata/DBdb/m_ || i || size 88k
end loop;
end;
/
begin
*
ERROR at line 1:
ORA-01686: max # files (1023) reached for the tablespace TEST_MF
ORA-06512: at line 3
SQL select count(*) from dba_data_files where tablespace_name= TEST_MF
COUNT(*)
———-
1023
可以看到表空間 TEST_MF 的文件數(shù)為 1023 個,最多也只能為 1023 個。
SQL select count(*) from dba_data_files where tablespace_name= TEST_MF
COUNT(*)
———-
1023
SQL select ts# from v$tablespace where name= TEST_MF
TS#
———-
9
– 查詢表空間 test_mf 的相對文件號、絕對文件號:
select file_id,relative_fno,TABLESPACE_NAME,FILE_NAME from dba_data_files where tablespace_name= TEST_MF
或者
select file#,rfile#,name from v$datafile where ts#=9;
SQL select file#,rfile#,name from v$datafile where ts#=9;
FILE# RFILE# NAME
———- ———- ————————————————————
10 10 /u01/app/oracle/oradata/DBdb/m1.dbf
11 11 /u01/app/oracle/oradata/DBdb/m2.dbf
12 12 /u01/app/oracle/oradata/DBdb/m_3
13 13 /u01/app/oracle/oradata/DBdb/m_4
14 14 /u01/app/oracle/oradata/DBdb/m_5
15 15 /u01/app/oracle/oradata/DBdb/m_6
16 16 /u01/app/oracle/oradata/DBdb/m_7
17 17 /u01/app/oracle/oradata/DBdb/m_8
18 18 /u01/app/oracle/oradata/DBdb/m_9
省略 …………………………………………………………..
FILE# RFILE# NAME
———- ———- ————————————————————
1011 1011 /u01/app/oracle/oradata/DBdb/m_1002
1012 1012 /u01/app/oracle/oradata/DBdb/m_1003
1013 1013 /u01/app/oracle/oradata/DBdb/m_1004
1014 1014 /u01/app/oracle/oradata/DBdb/m_1005
1015 1015 /u01/app/oracle/oradata/DBdb/m_1006
1016 1016 /u01/app/oracle/oradata/DBdb/m_1007
1017 1017 /u01/app/oracle/oradata/DBdb/m_1008
1018 1018 /u01/app/oracle/oradata/DBdb/m_1009
1019 1019 /u01/app/oracle/oradata/DBdb/m_1010
1020 1020 /u01/app/oracle/oradata/DBdb/m_1011
1021 1021 /u01/app/oracle/oradata/DBdb/m_1012
FILE# RFILE# NAME
———- ———- ————————————————————
1022 1022 /u01/app/oracle/oradata/DBdb/m_1013
1023 1023 /u01/app/oracle/oradata/DBdb/m_1014
1024 1 /u01/app/oracle/oradata/DBdb/m_1015
1025 2 /u01/app/oracle/oradata/DBdb/m_1016
1026 3 /u01/app/oracle/oradata/DBdb/m_1017
1027 4 /u01/app/oracle/oradata/DBdb/m_1018
1028 5 /u01/app/oracle/oradata/DBdb/m_1019
1029 6 /u01/app/oracle/oradata/DBdb/m_1020
1030 7 /u01/app/oracle/oradata/DBdb/m_1021
1031 8 /u01/app/oracle/oradata/DBdb/m_1022
1032 9 /u01/app/oracle/oradata/DBdb/m_1023
1023 rows selected.
SQL
從上面的數(shù)據(jù)可以看出,當(dāng)絕對文件號小于等于 1023,相對文件號與絕對文件號一樣。相對文件號大于 1023 之后,又從 1 開始循環(huán)。
SQL create tablespace test_lf datafile /u01/app/oracle/oradata/DBdb/TEST_LF.dbf size 1m;
Tablespace created.
SQL select ts# from v$tablespace where name= TEST_LF
TS#
———-
10
SQL select file#,rfile#,name from v$datafile where ts#=10;
FILE# RFILE# NAME
———- ———- ————————————————————
1033 10 /u01/app/oracle/oradata/DBdb/TEST_LF.dbf
從上面的數(shù)據(jù)可以看出,一個表空間的數(shù)據(jù)文件,其相對文件號并不是從 1 開始的,而依然是從上一個用過的最后一個相對文件號繼續(xù),及 file#號從上面的 1032 增加到 1033,而 RFILE# 從 9 增加到 10。
– 接著增加新表空間 ORA
SQL create tablespace ORA datafile /u01/app/oracle/oradata/DBdb/ora.dbf size 1m;
Tablespace created.
SQL
SQL alter tablespace ORA add datafile /u01/app/oracle/oradata/DBdb/ora02.dbf size 1m;
Tablespace altered.
SQL select file_id,relative_fno,TABLESPACE_NAME,FILE_NAME from dba_data_files where tablespace_name= ORA
FILE_ID RELATIVE_FNO TABLESPACE_NAME FILE_NAME
———- ———— —————————— ————————————————————
1034 11 ORA /u01/app/oracle/oradata/DBdb/ora.dbf
1035 12 ORA /u01/app/oracle/oradata/DBdb/ora02.dbf
從上查詢得,F(xiàn)ILE_ID 絕對文件號以創(chuàng)建表空間或給表空間添加數(shù)據(jù)文件的形式遞進(jìn)增加,而 RELATIVE_FNO(rfile#) 相對文件號相對于表空間而言,一個表空間的數(shù)據(jù)文件熟練小于等于 1023 個。
– 接著查詢
SQL select OBJ#,OWNER# from obj$ where name= EMP
OBJ# OWNER#
———- ———-
87108 83
SQL select object_id from dba_objects where OWNER= SCOTT and object_name= EMP and object_type= TABLE
OBJECT_ID
———-
87108
SQL select obj#,dataobj#,ts#,file# from tab$ where obj#=87108;
OBJ# DATAOBJ# TS# FILE#
———- ———- ———- ———-
87108 87108 4 4
SQL select SEGMENT_NAME,HEADER_FILE,HEADER_BLOCK,RELATIVE_FNO,TABLESPACE_NAME from dba_segments where SEGMENT_NAME= EMP and SEGMENT_TYPE= TABLE
SEGMENT_NAME HEADER_FILE HEADER_BLOCK RELATIVE_FNO TABLESPACE_NAME
————— ———– ———— ———— ——————————
EMP 4 146 4 USERS
在 DBA_SEGMENTS 視圖里面,可以查到段頭的相對文件號和絕對文件號。(這個視圖最終是從 file$、seg$ 等字典表里面取得數(shù)據(jù))
看完上述內(nèi)容,你們掌握 Oracle 中相對文件號(RFN)和絕對文件號(AFN)的示例分析的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注丸趣 TV 行業(yè)資訊頻道,感謝各位的閱讀!