資料檔案個數大於1024時ORACLE資料檔案FILE_ID及RELATIVE_FNO的變化示例
根據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的變化:
實驗環境:資料庫版本是11.2.0.4.0
需要提前修改資料庫內對資料檔案最大值的限制:
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個(下面修改引數的實驗得出是65534--官方文件上是65533-http://docs.oracle.com/cd/B19306_01/server.102/b14237/limits002.htm#i287915)。詳見:
資料檔案頭塊保留大小、ROWID、資料檔案最大大小等資料庫限制的說明
關於資料庫中資料檔案最大個數: ---實驗測出是65534,如下設定引數,啟動,根據報錯提示提示。--感謝群友提供思路。
SYS@ bys3>alter system set db_files=65536 scope=spfile;
System altered.
SYS@ bys3>startup --關庫重啟報錯如下:
ORA-01131: DB_FILES system parameter value 65536
exceeds limit of 65534
SYS@ bys3>show parameter db_files --又一次修改為65534,可以重啟,檢視引數已經修改為65534.
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_files integer 65534
否則因達到資料檔案上限無法建立資料檔案會報錯,資訊如下:
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;
相關文章
- oracle資料檔案個數限制Oracle
- Oracle資料檔案和臨時檔案的管理Oracle
- oracle 關於-資料檔案Oracle
- 資料庫引數檔案控制檔案日誌檔案資料檔案跟蹤檔案等8大檔案的字典資料庫
- 修改Oracle資料檔名及資料檔案存放路徑Oracle
- oracle資料庫移動資料檔案、日誌檔案和控制檔案Oracle資料庫
- 基於Docker部署Oracle、MySQL等資料庫的資料檔案持久化DockerOracleMySql資料庫持久化
- 關於資料庫檔案最大數資料庫
- 臨時資料檔案
- Oracle 資料檔案回收Oracle
- java 獲取資料夾大小、檔案大小、檔案個數Java
- oracle升級後資料檔案路徑變為大寫Oracle
- Oracle的ORA-00059錯誤(超出資料檔案個數)Oracle
- oracle 資料庫兩種引數檔案Oracle資料庫
- oracle資料庫的配置檔案Oracle資料庫
- 收縮ORACLE的資料檔案Oracle
- Oracle資料檔案大小的限制Oracle
- SQL Server 監視資料檔案大小變化SQLServer
- 改變資料檔案的路徑
- oracle中移動控制檔案、資料檔案、日誌檔案Oracle
- 建立資料庫檔案-日誌檔案-次要資料庫檔案資料庫
- oracle 線上rename資料檔案Oracle
- Oracle 刪除資料檔案Oracle
- oracle 資料檔案遷移Oracle
- 收縮Oracle資料檔案Oracle
- oracle刪除資料檔案Oracle
- oracle資料檔案遷移Oracle
- ORACLE移動資料檔案Oracle
- ORACLE 收縮資料檔案Oracle
- oracle資料檔案大小限制Oracle
- 引數檔案控制檔案和資料檔案丟失的恢復
- 2.5.10.2 關於資料庫時區檔案資料庫
- find 按檔案修改時間查詢檔案及find空資料夾
- 資料檔案
- LINUX下查詢大檔案及大的資料夾Linux
- 資料泵引數檔案用於執行資料泵命令
- Python求取資料夾內的檔案數量、子資料夾內的檔案數量Python
- 來改變一下Oracle資料檔案的位置Oracle