Oracle報錯ORA-01653: 表xx無法通過 8192 擴展

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;


分享到:


相關文章: