之前接觸的項目表空間最大也不超過10G,所以導入數據庫時一直使用導入本地的oracle數據庫文件的方法,即根據dmp文件大小設置一個數據文件,設定表空間最大值。
--創建表空間,數據文件為'F:\app\zang\oradata\orcl\charge_zang.dbf',初始大小50M,遞增10M,最大遞增到2G create tablespace charge_zang datafile 'F:\app\zang\oradata\orcl\charge_zang.dbf' size 50M autoextend on next 10M maxsize 2048M;
生產環境考慮到數據庫可能一直增加信息,所以放開表空間大小限制,語句如下:
--改變用戶表空間容量限制,不做限制 ALTER USER ankangreli QUOTA UNLIMITED ON ankangrelir_data;
但是今天開會討論了一個問題,公司接手了一個項目,新客戶原先使用的系統,數據庫大小有2T,現在需要對他的數據庫信息進行整理和遷移,首先的步驟是把客戶的數據庫導入我們的服務器,為此公司特地買了塊8T的外接硬盤(不到2000塊!),這按我之前的方法導入,即使放開容量限制,也會到達oracle的容量限制,因此需要換種方法來導入。
導入之前了解一些概念:
表空間數據文件容量與DB_BLOCK_SIZE有關,在初始建庫時,DB_BLOCK_SIZE要根據實際需要,設置為 4K、8K、16K、32K、64K等幾種大小,ORACLE的物理文件最大只允許4194304個數據塊(由操作系統決定),表空間數據文件的最大值為 4194304×DB_BLOCK_SIZE/1024M。
sql查看DB_BLOCK_SIZE值
查看INITIAL_EXTENT值是DB_BLOCK_SIZE的整數倍
截取的更多DB_BLOCK_SIZE作用如下:【來源】
- DB_BLOCK_SIZE作為數據庫的最小操作單位,是在創建數據庫的時候指定的,在創建完數據庫之后便不可修改。要修改DB_BLOCK_SIZE,需要重建數據庫。一般可以將數據EXP出來,然后重建數據庫,指定新的DB_BLOCK_SIZE,然后再將數據IMP進數據庫。
- DB_BLOCK_SIZE一般設置為操作系統塊的倍數,即2K,4K,8K,16K或32K,但它的大小一般受數據庫用途的影響。對於聯機事務,其特點是事務量大,但每個事務處理的數據量小,所以DB_BLOCK_SIZE設置小點就足夠了,一般為4K或者8K,設置太大話一次讀出的數據有部分是沒用的,會拖慢數據庫的讀寫時間,同時增加無必要的IO操作。而對於數據倉庫和ERP方面的應用,每個事務處理的數據量很大,所以DB_BLOCK_SIZE一般設置得比較大,一般為8K,16K或者32K,此時如果DB_BLOCK_SIZE小的話,那么I/O自然就多,消耗太大。
- 大一點的DB_BLOCK_SIZE對索引的性能有一定的提高。因為DB_BLOCK_SIZE比較大的話,一個DB_BLOCK一次能夠索引的行數就比較多。
- 對於行比較大的話,比如一個DB_BLOCK放不下一行,數據庫在讀取數據的時候就需要進行行鏈接,從而影響讀取性能。此時DB_BLOCK_SIZE大一點的話就可以避免這種情況的發生。
回到該問題,通過上面的信息我們得出:在本機單個表空間文件大小超過32G時,表空間容量就達到了最大值,數據庫就不能繼續增加信息了,那么該采取什么措施呢?
1. 多個數據文件累加
將表空間存儲為多個數據文件,每個文件不大於32GB(精確的值為32768M)
語法如下:(不夠的話繼續添加數據文件)
create tablespace JC_DATA logging datafile 'F:\app\oracle\oradata\orcl\JC_DATA01.dbf' size 50m autoextend on next 50m maxsize 32767m extent management local;
--為表空間增加數據文件 alter tablespace JC_DATA add datafile 'F:\app\oracle\oradata\orcl\JC_DATA02.dbf' size 50m autoextend on next 50m maxsize 32767m;
2. 擴大db_block_size
根據oracle的算法,我們很容易想到這個解決方法。數目衡定,但是db_block_size可以更改(db_block_size的最大大小為32KB)。如果把db_block_size擴大到32KB,那么我們的系統就可以支持單個數據文件最大128GB。
這個方案聽起來好像很迷人,但是實際上並不是那么回事。因為要修改db_block_size並不是很容易的事。因為這個db_block_size在創建實例的時候就要指定。而且不能通過簡單修改參數來指定db_block_size。db_block_size的默認值為8192 bytes,是不能被用戶修改的。因為db_block_size對應於一個實例,所以意味着在數據庫創建(建庫)以后是不能修改的,如需修改,可行的方式是重新建庫並把原庫的數據export到新庫。當然最好的方式是在建數據庫之前就規划好,一般如果是OLTP系統,可以保持默認值;OLAP環境可以考慮適當調大。
3. 創建bigfile表空間
在oracle11g中引進了bigfile表空間,他充分利用了64位CPU的尋址能力,使oracle可以管理的數據文件總量達到8EB。單個數據文件的大小達到128TB,即使默認8K的db_block_size也達到了32TB。
創建bigfile的表空間使用的sql語句和創建表空間的語句使用基本相同。
create bigfile tablespace···
需要注意的是使用bigfile表空間,它只能支持一個數據文件。也就是說這個文件的最大大小就是表空間最大大小,你不可能通過增加數據文件來擴大該表空間的大小。
參考:
http://blog.sina.com.cn/s/blog_4b1c9e12010006vj.html
https://www.cnblogs.com/gavanwanggw/p/6714388.html
https://blog.csdn.net/zhangzheng0413/article/details/8271322