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:OracleAppAdministratororadataorcl新數據文件名稱.DBF' SIZE 32M;
②為該數據文件打開自動增長 ALTER DATABASE DATAFILE 'D:OracleappAdministratororadataorcl新數據文件名稱.DBF' AUTOEXTEND ON;
③指定每次自動增長的大小 ALTER DATABASE DATAFILE 'D:OracleappAdministratororadataorcl新數據文件名稱.DBF' AUTOEXTEND ON NEXT 200M ;
2)方法二:一步到位。為指定的表空間增加數據文件(一步到位:指定初始大小,打開自動增長,設置每次自動增長的大小) ALTER TABLESPACE 表空間名稱 ADD DATAFILE 'D:appAdministratororadataORCLDATAFILE新數據文件名稱.DBF' SIZE 10240M AUTOEXTEND ON NEXT 1024M MAXSIZE UNLIMITED;