ORA-01144: File size (string blocks) exceeds maximum of string blocks


今天我在擴展一個表空間的時候遭遇了這個錯誤,想知道具體原因是什麼。

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;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章