今天我在擴展一個表空間的時候遭遇了這個錯誤,想知道具體原因是什麼。
SQL> alter database datafile 5 resize 33G;
alter database datafile 5 resize 33G
*
ERROR at line 1:
ORA-01144: File size (4325376 blocks) exceeds maximum of 4194303 blocks
Linux 64位的平臺
下面是oracle err messages:
ORA-01144: File size (string blocks) exceeds maximum of string blocks
Cause: Specified file size is larger than maximum allowable size value.
Action: Specify a smaller size.
開始以爲是操作系統的限制導致的,但是查了一下,沒看到相關的限制,磁盤剩餘空間還是有的。
具體原因是什麼呢?
這要從Oracle的僞列rowid說起,話說.....
先看看關於rowid一段文章就明白了:
rowid在磁盤上需要10 個字節(byte)的存儲空間並使用18 個字符來顯示它包含下列組件:
數據對象編號:每個數據對象如表或索引在創建時都分配有此編號,並且此編號在數據庫中是唯一的;
相關文件編號:此編號對於一個表空間中的每個文件是唯一的;
塊編號:表示包含此行的塊在文件中的位置;
行編號:標識塊頭中行目錄位置的位置;
在內部數據對象編號需要32位(bit),相關文件編號需要10位(bit),塊編號需要22位(bit),位行編號需要16位,加起來總共是80位或10 個字節,ROWID 使用以64爲基數的編碼方案來顯示該方案將6個位置用於數據對象,編號3個位置用於相關文件編號,6個位置用於塊編號,3個位置用於行編號以64爲基數的編碼方案使用字符A-Z a-z 0-9 + 和/共64 個字符,如下例所示:
AAAB/R AAB AAAGmS AAA
由於block是22位(bit),
22bit就是一個22位二進制數,換算成十進制就是 2的22次方-1=4194303 也就是說,一個datafile最多容納這麼多個blocks
數據塊大小(block size)爲2K的數據文件的size最大隻能是8G
而依此類推8K數據塊的一個數據文件的最大size只能是32G
解決方法爲:
1)創建一個類似的表空間
2)直接在原來的表空間增加表數據文件,擴展表空間大小
在Oracle 10G及以上中,表空間有bigfile tablespace和smallfile tablespace的區別:
bigfile tablespace是Oracle10g的新特性。Bigfile tablespaces包含1個最大4G個blocks 的datafile(注意:只能有一個大數據文件)。因此,使用8KBdata blocks 的bigfile tablespace 最大可以達到32TB。Bigfile tablespaces 常用於非常大的DB。 如果很大的DB有成千的 read/write datafiles, 那麼checkpoints之類的操作將非常費時。如果用一個很大的datafile,減少datafiles的數量,將會提高效率。
創建時使用BIGFILE關鍵字如下:
CREATE BIGFILE TABLESPACE BIG_DEMO
DATAFILE '/ORADATA/PROD/BIG_DEMO.DBF' SIZE 25G;
Smallfile tablespace是原Oracle tablespace datafile 選項的新名字。 smallfile tablespace中,你可以包含多個datafiles。每個datafile 有最多4M(2的22次方)個data blocks。因此, 使用8KB data blocks的smallfile tablespace 中的datafiles 最大32GB。smallfile tablespace最多有1,023 個datafiles。SYSTEM和SYSAUX tablespaces總是smallfile
tablespaces。
ORA-01144即表示你的單個數據文件超出了oracle的限制:
如:ORA-01144: File size (4194304 blocks) exceeds maximum of 4194303 blocks
表示你的表空間是Smallfile tablespace,單個數據文件最大隻可以有2^22=4194303個blocks,換成KBytes時即乘上你數據庫的block_size即可,解決方法是用多個數據文件,不是把單個數據文件設得很大.
-----------------------------------------------------------------------------------------------------------------------------
metalink查到相關信息如下,以備參考:
fix:
FIX 1:
Specify a smaller file size.
The maximum file size is
db_block_size * 4194303
For example, if db_block_size is 2kB then maximum file size is limited
to 2k*4194303, 8Gb-2k.
FIX 2:
Change db_block_size. This can only be done by recreating of
database.
db_block_size Maximum data file size
------------- ----------------------
2kb 8Gb-2kb
4kb 16Gb-4kb
8kb 32Gb-8kb
16kb 64Gb-16kb
32kb 128Gb-32kb
可見db_block_size對 maximum data file size還是起決定作用的
增加數據文件:
alter tablespace trs add datafile '路徑' size 500m autoextend on maxsize unlimited;