Oracle的數據文件大小是有限制的,今天在創建表空間的時候就遇到了問題,限制很簡單,作為DBA必須要了解。
測試環境:
操作系統:Win7 64位專業版
數據庫版本:64位Oracle10.2.0.4
DB_NAME:hoegh
表空間名稱:hoegh
在執行創建表空間語句時報錯,具體語句如下:
create tablespace hoegh
datafile 'S:\hoegh\hoegh01.dbf' size 20g
autoextend on next 1g maxsize 100g;
提示報錯:
ORA-03206: AUTOEXTEND 子句中 (13107200) 塊的最大文件大小超出范圍
后來查資料,說單個文件大小最大是32g,修改語句如下:
create tablespace hoegh
datafile 'S:\hoegh\hoegh01.dbf' size 20g
autoextend on next 1g maxsize 32g;
仍然報錯:
ORA-03206: AUTOEXTEND 子句中 (4194304) 塊的最大文件大小超出范圍
按照Oracle文檔的描述,每個datafile的最大容量為(2^22-1)個block,即4194303個block,而當前數據庫的block大小是8k,也就是說最大的文件大小是32G,要建100G的datafile肯定不行。
也就是說,以Oracle的限制,如果要建普通的datafile,最大的大小就是 (2^22-1)*32K = 128G (注:Oracle最大支持block為32k)。存在這個限制是因為Oracle的內部ROWID使用22位2進制數來存儲不同的block號,所以22位最多代表(2^22-1)個block。
下面列表說明不同數據塊數據庫所能支持的最大物理文件大小:
數據塊的大小????????物理文件的最大值 M
===============================================
2048????????????????????????8191 M
4096????????????????????????16383 M
8192????????????????????????32767 M
16384????????????????????????65535 M
這就可以解釋,32G>32767 M(多了1M)也不能夠創建。因此,干脆修改為如下語句,執行成功。
create tablespace hoegh datafile 'S:\hoegh\hoegh01.dbf' size 10g autoextend on next 500m maxsize 20g;
下面,總結一下ORA-03206報錯的解決方案,推薦使用第一種解決方案。
一)不要創建單個文件超過32GB的表空間
如果你創建的表空間超過32GB,請把這個表空間存儲為多個數據文件,每個文件不大于32GB。這樣,就可以成功的創建表空間。
二)擴大db_block_size
根據oracle的算法,我們很容易想到這個解決方法。數目衡定,但是db_block_size可以更改(db_block_size的最大大小為32KB)。如果把db_block_size擴大到32KB(32位系統好像是16KB,我在Red Hat 企業版的操作系統創建32KB的block_size失敗。),那么我們的系統就可以支持單個數據文件最大128GB。
這個方案聽起來好像很迷人,但是實際上并不是那么回事。因為要修改db_block_size并不是很容易的事。因為這個db_block_size在創建實例的時候就要指定。而且不能通過簡單修改參數來指定db_block_size。
三)創建bigfile表空間
在oracle10g中引進了bigfile表空間,充分利用了64位CPU的尋址能力,使oracle可以管理的數據文件總量達到8EB。單個數據文件的大小達到128TB,即使默認8K的db_block_size也達到了32TB。
創建bigfile的表空間使用的sql語句也很簡單。
create bigfile tablespace...
后面的語句和普通的語句完全一樣。
需要注意OS的文件大小限制。
例如在windows下,單個文件最大限制如下:
FAT12?????????? 8M
FAT16?????????? 2G
FAT32?????????? 4G
NTFS??????????? 64GB
NTFS5.0???????? 2TB