三、創(chuàng)建表空間

創(chuàng)建表空間的步驟因操作系統(tǒng)帶的不同而不同。然而,在所有的情況中,用戶都應(yīng)該事先通過操作系統(tǒng)的功能創(chuàng)建一個目錄結(jié)構(gòu),以便將新表

空間的數(shù)據(jù)文件(一個表空間必須要有一個數(shù)據(jù)文件)分配到相應(yīng)的目錄中。在大多數(shù)操作系統(tǒng)中,當(dāng)通過添加數(shù)據(jù)文件來創(chuàng)建一個新表空間或

修改一個表空間時,應(yīng)該指出大小和完全限定的文件名(即包括目錄結(jié)構(gòu)和文件的擴(kuò)展名)。在每一種情況中,都由ORACLE按所指定的信息來自

動創(chuàng)建和格式化數(shù)據(jù)文件。
與表空間對應(yīng)的物理結(jié)構(gòu)是數(shù)據(jù)文件。在創(chuàng)建表空間的過程中要指定它所使用的數(shù)據(jù)文件的位置和文件名。實際上,在表空間的創(chuàng)建中,

ORACLE會完成以下幾個工作:
1.在數(shù)據(jù)字典和控制文件中記錄該新創(chuàng)建的表空間;
2.在操作系統(tǒng)中按指定的位置和文件名創(chuàng)建指定大小的操作系統(tǒng)文件,作為該表空間對應(yīng)的數(shù)據(jù)文件;
3.在預(yù)警文件中記錄創(chuàng)建表空間的信息。

CREATE TABLESPACE 創(chuàng)建(永久)表空間
CREATE BIGFILE TABLESPACE 創(chuàng)建大文件表空間
CREATE TEMPORARY TABLESPACE 創(chuàng)建臨時表空間
CREATE UNDO TABLESPACE 創(chuàng)建撤銷表空間

用戶必須擁有CREATE TABLESPACE系統(tǒng)權(quán)限才能創(chuàng)建表空間。臨時表空間和撤銷表空間都是特殊表空間,他們與一般表空間不同的是,用戶并不

能在其中創(chuàng)建方案對象,因此,需要在CREATE語句中添加TEMPORARY和UNDO關(guān)鍵詞。
在ORACLE 8I以前,所有的表空間都創(chuàng)建為字典管理。從ORACLE 8I開始,用戶能夠創(chuàng)建本地管理的表空間,他們使用位圖代替了數(shù)據(jù)字典表開

跟蹤已用的和空閑的空間。因為本地管理的表空間有更好的性能,而且更加容易管理,所以,從ORACLE 9I開始,創(chuàng)建(永久)表空間都是本地管

理的。

創(chuàng)建表空間的語法是:
CREATE [SMALLFILE|BIGFILE] [PERMANENT|TEMPORARY|UNDO] TABLESPACE
DATAFILE|TEMPFILE datafile_clause[,datafile_clause]
[EXTENT MANAGEMENT LOCAL]
[AUTOALLOCATE|UNIFORM SIZE integer [K|M]]
[SEGMENT SPACE MANAGEMENT AUTO|MANUAL]
[BLOCKSIZE integer[K|M]]
[MININUM EXTENT integer [K|M]]
[LOGGING|NOLOGGING]
[ONLINE|OFFLINE [NORMAL|TEMPORARY|IMMEDIATE]];

其中,datafile_clause子句(數(shù)據(jù)文件子句)的語法是:
'path_filename_suffix' SIZE integer [K|M]
[REUSE]
[AUTOEXTEND OFF|ON]
[NEXT integer [K|M]]
[MAXSIZE UNLIMITED | integer [K|M]]
在datafile_clause子句中指定數(shù)據(jù)文件時,不能使用相對路徑,只能使用絕對路徑。并且,如果沒有提供文件名的后綴,則無后綴。

(一)創(chuàng)建(永久)表空間
如果不指定PERMANENT,TEMPORARY,UNDO選項,或指定了PERMANENT選項,則創(chuàng)建的是永久表空間,即永久保存其中的數(shù)據(jù)庫對象 的數(shù)據(jù)。
有三種創(chuàng)建(永久)表空間的方法:
(1)使用AUTOALLOCATE區(qū)分配方式
如果DBA能夠預(yù)測到表空間中存放的度喜愛那個所需要的區(qū)大小會有很大不同,則使用AUTOALLOCATE區(qū)分配方式是比較好的選擇。在這種方式下

,ORACLE將自動按表空間中不同對象的大小分配相應(yīng)大小的區(qū)(有一個表大小與區(qū)大小的對應(yīng)關(guān)系,最小的區(qū)為64KB)。 AUTOALLOCATE區(qū)分配方

式的缺點(diǎn)是在表空間中可能會造成一些磁盤空間的浪費(fèi),但是這一點(diǎn)代價相對DBA工作量的減少來說是值得的。
CREATE TABLESPACE mytbs01 DATAFILE 'e:\mytbs01.dbf' SIZE 2M AUTOALLOCATE;

(2)使用UNIFORM區(qū)分配方式
如果DBA能夠預(yù)測到表空間中存放的大部分對象都要求使用相同大小的區(qū),那么,使用UNIFORM區(qū)分配方式是比較好的選擇。在這種情況下,

ORACLE將為表空間中所有對象都分配指定的相同 大小的區(qū)(默認(rèn)大小是1MB)。UNIFORM區(qū)分配方式的優(yōu)點(diǎn)是在表空間中不會產(chǎn)生磁盤碎片,節(jié)約

磁盤空間。
CREATE TABLESPACE mytbs02 DATAFILE 'e:\mytbs02_1.dbf' SIZE 1M, 'e:\mytbs02_2' SIZE 2M UNIFORM SIZE 128K;

(3)在數(shù)據(jù)字典子句中指定數(shù)據(jù)文件的擴(kuò)展方式
可以在數(shù)據(jù)文件子句中指定數(shù)據(jù)文件的擴(kuò)展方式。
CREATE TABLESPACE mytbs03 DATAFILE 'e:\mytbs03_1.dbf' SIZE 1M AUTOEXTEND ON NEXT 2M MAXSIZE 11M;
但是此時就不能再指定表空間的區(qū)分配方式了,否則會有錯誤提示。

(4)使用AUTO段管理方式
可以使用SEGMENT SPACE MANAGEMENT子句來指定表空間的段管理方式,即管理段中已用數(shù)據(jù)塊和空閑數(shù)據(jù)塊的方式。雖然ORACLE極力推薦為本

地管理的永久表空間使用AUTO段管理方式,但在ORACLE 10G中如果不使用SEGMENT SPACE MANAGEMENT子句指定AUTO,則使用MANUAL段管理方式。
CREATE TABLESPACE mytbs04 DATAFILE 'e:\mytbs04_1.dbf' SIZE 3M REUSE UNIFORM SEGMENT SPACE MANAGEMENT AUTO;

(5)使用BLOCKSIZE選項和創(chuàng)建非標(biāo)準(zhǔn)塊表空間
有時候要求數(shù)據(jù)庫支持多個塊大小的表空間(大表的數(shù)據(jù)存放在大塊的表空間上更有效),即必須創(chuàng)建有不同于初始化參數(shù)DB_BLOCK_SIZE指定的

標(biāo)準(zhǔn)的ORACLE塊大小的表空間,此時就可以使用這個選項。這個選項只適用于永久表空間。
例如現(xiàn)在DB_BLOCK_SIZE參數(shù)的值是8K,則可以創(chuàng)建BLOCKSIZE選項是8K的表空間(如果不用BLOCKSIZE選項指定塊的大小,就 采用DB_BLOCK_SIZE

參數(shù)指定的大小)。
CREATE TABLESPACE mytbs05 DATAFILE 'e:\mytbs05_1.dbf' SIZE 3M REUSE BLOCKSIZE 8K SEGMENT SPACE MANAGEMENT AUTO;
但可能不能創(chuàng)建BLOCKSIZE參數(shù)值為16K的表空間,否則會有錯誤提示:
CRAETE TABLESPACE mytbs06 DATAFILE 'e:\mytbs06_1.dbf' SIZE 3M REUSE BLOCKSIZE 16K SEGMENT SPACE MANAGEMENT AUTO;
如果要為不同的表空間指定不同的塊大小,就需要先修改初始化參數(shù)文件中的數(shù)據(jù)高速緩存區(qū)參數(shù)

(DB_2K_CACHE_SIZE,DB_4K_CACHE_SIZE,DB_8K_CACHE_SIZE,
DB_16K_CACHE_SIZE,DB_32K_CACHE_SIZE)才行

(二)創(chuàng)建大文件表空間
大文件表空間是ORACLE 10G數(shù)據(jù)庫的新特性,而且僅在本地管理的表空間中才支持大文件表空間。這種表空間只能包括一個數(shù)據(jù)文件,該數(shù)據(jù)

文件可以包含4G個塊。能顯著提高ORACLE數(shù)據(jù)庫的存儲能力并減少數(shù)據(jù)文件的個數(shù)。
CREATE BIGFILE TABLESPACE mybigtbs01 DATAFILE 'e:\mybigtbs01_1.dbf' SIZE 2M SEGMENT SPACE MANAGEMENT AUTO;
在創(chuàng)建大文件表空間時可以指定區(qū)分配方式,但不能將段管理方式指定為MANUAL方式。
CREATE BIGFILE TABLESPACE mybigtbs02 DATAFILE 'e:\mybigtbs02_1.dbf' SIZE 2M UNIFORM SIZE 128K;
但是
CREATE BIGFILE TABLESPACE mybigtbs03 DATAFILE 'e:\mybigtbs03_1.dbf' SIZE 2M SEGMENT SPACE MANAGEMENT MANUAL;就會出現(xiàn)錯誤提示

(三)創(chuàng)建臨時表空間
如果指定了TEMPORARY選項,則創(chuàng)建的就是臨時表空間,即ORACLE會用這種表空間來創(chuàng)建臨時段,以便排序操作時使用。這個臨時段是全體用戶

共享的,即使排序操作結(jié)束了,ORACLE也不會釋放這個臨時段。這可以提高排序操作較多的應(yīng)用系統(tǒng)的執(zhí)行性能,因為ORACLE不必每次遇到一

個排序操作就分配一個臨時段,可以采用以下方法創(chuàng)建臨時表空間:
(1)創(chuàng)建臨時表空間
如果在數(shù)據(jù)庫運(yùn)行過程中經(jīng)常有大量排序工作要做,為了提高排序性能就應(yīng)該建立多個鏈?zhǔn)奖砜臻g。
CREATE SMALLFILE TEMPORARY TABLESPACE mytmptbs01 TEMPFILE 'e:\mytmptbs01_1.dbf' SIZE 4M UNIFORM SIZE 64K;
必須用關(guān)鍵字TEMPFILE代替DATAFILE。另外,臨時表空間使用臨時文件而不是數(shù)據(jù)文件來創(chuàng)建。臨時文件只能與臨時表空間一起使用,不需要

備份,也不會把數(shù)據(jù)修改記錄到重做日志中。
在創(chuàng)建臨時表空間時,區(qū)分配方式不能指定為AUTOALLOCATE方式,否則會出現(xiàn)錯誤提示。

(2)創(chuàng)建大文件臨時表空間
從ORACLE 10G開始,允許使用CREATE BIGFILE TEMPORARY TABLESPACE命令來創(chuàng)建只包含一個臨時文件的大文件臨時表空間。
CREATE BIGFILE TEMPORARY TABLESPACE mybigtmptbs02 TEMPFILE 'e:\mybigtmptbs02_1.dbf' SIZE 4M UNIFORM SIZE 64K;
在創(chuàng)建臨時表空間時,段管理方式不能指定為AUTO方式,否則會出現(xiàn)錯誤提示。

(四)創(chuàng)建撤銷表空間
撤銷表空間(UNDO TABLESPACE)用戶存儲撤銷段,該表空間只能使用本地管理方式。
當(dāng)執(zhí)行CREATE DATABASE語句創(chuàng)建數(shù)據(jù)庫時,可以創(chuàng)建UNDO表空間,并且DBA可以使用該UNDO表空間來管理UNDO數(shù)據(jù)。創(chuàng)建數(shù)據(jù)庫后,可以使用

CREATE UNDO TABLESPACE命令來創(chuàng)建UNDO表空間。
CREATE UNDO TABLESPACE myundotbs01 DATAFILE 'e:\myundotbs01_1.dbf' SIZE 4M; AUTOALLOCATE;
CREATE UNDO TABLESPACE myundotbs02 DATAFILE 'e:\myundotbs02_1.dbf' SIZE 4M AUTOEXTEND ON NEXT 1M MAXSIZE UNLIMITED;
創(chuàng)建UNDO表空間時不能指定統(tǒng)一區(qū)大小的選項,否則會有錯誤提示。

如果想使用UNDO表空間的管理功能,就需要在初始化參數(shù)文件中設(shè)置如下參數(shù):
*.undo_management='AUTO'
*.undo_tablespace='UNDOTBS1'
其中,undo_management參數(shù)必須設(shè)置成AUTO,否則將使用回退表空間(ROLLBACK TABLESPACE);undo_tablespace參數(shù)用于指定要使用哪個UNDO

表空間。
很顯然可以創(chuàng)建多個UNDO表空間,但一次只能使用一個UNDO表空間。

可以用以下的語句修改初始化參數(shù)文件,就愛你個當(dāng)前使用的UNDO表空間切換到另一個UNDO表空間。
ALTER SYSTEM SET undo_tablespace='new_undo_tablespace' SCOPE=SPFILE;

當(dāng)一個UNDO表空間切換到另一個UNDO表空間之后,就可以在前一個UNDO表空間中的活躍事務(wù)全部完成后刪除就的表空間。
可以修改UNDO表空間,如同增加一個數(shù)據(jù)文件、重新命名表空間、聯(lián)機(jī)/脫機(jī)數(shù)據(jù)文件、備份表空間等。與其他表空間一樣,正在使用的UNDO表

空間是不允許被刪除的,即只有在其中已經(jīng)沒有未提交的事務(wù)時才能將其刪除。
可以用V$TRANSACTION視圖來檢查其中是否還有未提交的事務(wù)。