1 問題
向Oracle 10g資料庫中批量插入資料,當插入近2億條資料後,報出如下錯誤: ORA-01653: 表xx無法通過 8192 (在表空間 xx_data 中) 擴充套件。
查看錶空間,發現表空間大小已達到32G,但建立表空間時已設定了無限擴充套件(初始空間為20G),磁碟空間沒滿,說明表空間無法進行自動擴充套件了。
2 原因查詢資料了解到Oracle 10g 單個表空間資料檔案的最大值為: 最大資料塊 * DB_BLOCK_SIZE
檢視Oracle的 DB_BLOCK_SIZE
SQL> select value from v$parameter where name ='db_block_size';
8192
本機資料庫的資料塊大小為8K,算出本機Oracle 單個表空間資料檔案的最大值為: 4194304 * 8/1024 = 32768M (32G);
所以既使建立表空間時設定了 autoextend on maxsize unlimited,其最大空間也是不會超過32G。
注: 表空間資料檔案容量與DB_BLOCK_SIZE的設定有關,而這個引數在建立資料庫例項的時候就已經指定。DB_BLOCK_SIZE引數可以設定為4K、8K、16K、32K、64K等幾種,Oracle的物理檔案最大隻允許4194304個數據塊(這個引數具體由作業系統決定,一般應該是此數字),表空間資料檔案的最大值對應關係就可以通過4194304×DB_BLOCK_SIZE/1024M計算得出。 4k最大表空間為:16384M
8K最大表空間為:32768M
16k最大表空間為:65536M
32K最大表空間為:131072M
64k最大表空間為:262144M
而Oracle預設分配的為8K,也就是對應於32768M左右的空間大小,如果想繼續增大表空間的話,只需要通過alter tablespace name add datafile ‘path/file_name’ size 1024M;新增資料檔案的方式就可以了。
資料塊是oracle中最小的空間分配單位,各種操作的資料就的放在這裡,oracle從磁碟讀寫的也是塊。一旦create database,db_block_size就是不可更改的。因為oracle是以塊為單位儲存資料的,任何一個儲存元素最少佔用一個塊,如果你改變了db_block_size,必然導致部分塊不能正常使用。
其實在unix類作業系統中,檔案塊和oracle塊的關係非常緊密(建議相等),這樣才能保證資料庫的執行效率。在windows下可能就不這麼講究了。建議使用8k以上的塊,有人做過測試,同樣的配置,8k的塊比4k快大約40%,比2k快3倍以上。
3 解決方法處理方法兩種:①假如當前表空間只有一個數據檔案,可以擴大該資料檔案的大小(單個數據檔案最大32G);②為當前表空間新增資料檔案。
為當前表空間新增資料檔案方法如下:
在命令列下,以oracle系統管理員使用者登入oracle,再執行以下操作:
1)方法一:分步驟。為指定的表空間增加資料檔案(三步驟) ①為指定的表空間建立資料檔案,並指定初始大小 ALTER TABLESPACE 表空間名稱 ADD DATAFILE 'D:\\Oracle\\app\\Administrator\\oradata\\orcl\\新資料檔名稱.DBF' SIZE 32M;
②為該資料檔案開啟自動增長 ALTER DATABASE DATAFILE 'D:\\Oracle\\app\\Administrator\\oradata\\orcl\\新資料檔名稱.DBF' AUTOEXTEND ON;
③指定每次自動增長的大小 ALTER DATABASE DATAFILE 'D:\\Oracle\\app\\Administrator\\oradata\\orcl\\新資料檔名稱.DBF' AUTOEXTEND ON NEXT 200M ;
2)方法二:一步到位。為指定的表空間增加資料檔案(一步到位:指定初始大小,開啟自動增長,設定每次自動增長的大小) ALTER TABLESPACE 表空間名稱 ADD DATAFILE 'D:\\app\\Administrator\\oradata\\ORCL\\DATAFILE\\新資料檔名稱.DBF' SIZE 10240M AUTOEXTEND ON NEXT 1024M MAXSIZE UNLIMITED;