三、创建表空间

创建表空间的步骤因操作系统带的不同而不同。然而,在所有的情况中,用户都应该事先通过操作系统的功能创建一个目录结构,以便将新表

空间的数据文件(一个表空间必须要有一个数据文件)分配到相应的目录中。在大多数操作系统中,当通过添加数据文件来创建一个新表空间或

修改一个表空间时,应该指出大小和完全限定的文件名(即包括目录结构和文件的扩展名)。在每一种情况中,都由ORACLE按所指定的信息来自

动创建和格式化数据文件。
与表空间对应的物理结构是数据文件。在创建表空间的过程中要指定它所使用的数据文件的位置和文件名。实际上,在表空间的创建中,

ORACLE会完成以下几个工作:
1.在数据字典和控制文件中记录该新创建的表空间;
2.在操作系统中按指定的位置和文件名创建指定大小的操作系统文件,作为该表空间对应的数据文件;
3.在预警文件中记录创建表空间的信息。

CREATE TABLESPACE 创建(永久)表空间
CREATE BIGFILE TABLESPACE 创建大文件表空间
CREATE TEMPORARY TABLESPACE 创建临时表空间
CREATE UNDO TABLESPACE 创建撤销表空间

用户必须拥有CREATE TABLESPACE系统权限才能创建表空间。临时表空间和撤销表空间都是特殊表空间,他们与一般表空间不同的是,用户并不

能在其中创建方案对象,因此,需要在CREATE语句中添加TEMPORARY和UNDO关键词。
在ORACLE 8I以前,所有的表空间都创建为字典管理。从ORACLE 8I开始,用户能够创建本地管理的表空间,他们使用位图代替了数据字典表开

跟踪已用的和空闲的空间。因为本地管理的表空间有更好的性能,而且更加容易管理,所以,从ORACLE 9I开始,创建(永久)表空间都是本地管

理的。

创建表空间的语法是:
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子句(数据文件子句)的语法是:
'path_filename_suffix' SIZE integer [K|M]
[REUSE]
[AUTOEXTEND OFF|ON]
[NEXT integer [K|M]]
[MAXSIZE UNLIMITED | integer [K|M]]
在datafile_clause子句中指定数据文件时,不能使用相对路径,只能使用绝对路径。并且,如果没有提供文件名的后缀,则无后缀。

(一)创建(永久)表空间
如果不指定PERMANENT,TEMPORARY,UNDO选项,或指定了PERMANENT选项,则创建的是永久表空间,即永久保存其中的数据库对象的数据。
有三种创建(永久)表空间的方法:
(1)使用AUTOALLOCATE区分配方式
如果DBA能够预测到表空间中存放的度喜爱那个所需要的区大小会有很大不同,则使用AUTOALLOCATE区分配方式是比较好的选择。在这种方式下

,ORACLE将自动按表空间中不同对象的大小分配相应大小的区(有一个表大小与区大小的对应关系,最小的区为64KB)。 AUTOALLOCATE区分配方

式的缺点是在表空间中可能会造成一些磁盘空间的浪费,但是这一点代价相对DBA工作量的减少来说是值得的。
CREATE TABLESPACE mytbs01 DATAFILE 'e:\mytbs01.dbf' SIZE 2M AUTOALLOCATE;

(2)使用UNIFORM区分配方式
如果DBA能够预测到表空间中存放的大部分对象都要求使用相同大小的区,那么,使用UNIFORM区分配方式是比较好的选择。在这种情况下,

ORACLE将为表空间中所有对象都分配指定的相同大小的区(默认大小是1MB)。UNIFORM区分配方式的优点是在表空间中不会产生磁盘碎片,节约

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

(3)在数据字典子句中指定数据文件的扩展方式
可以在数据文件子句中指定数据文件的扩展方式。
CREATE TABLESPACE mytbs03 DATAFILE 'e:\mytbs03_1.dbf' SIZE 1M AUTOEXTEND ON NEXT 2M MAXSIZE 11M;
但是此时就不能再指定表空间的区分配方式了,否则会有错误提示。

(4)使用AUTO段管理方式
可以使用SEGMENT SPACE MANAGEMENT子句来指定表空间的段管理方式,即管理段中已用数据块和空闲数据块的方式。虽然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选项和创建非标准块表空间
有时候要求数据库支持多个块大小的表空间(大表的数据存放在大块的表空间上更有效),即必须创建有不同于初始化参数DB_BLOCK_SIZE指定的

标准的ORACLE块大小的表空间,此时就可以使用这个选项。这个选项只适用于永久表空间。
例如现在DB_BLOCK_SIZE参数的值是8K,则可以创建BLOCKSIZE选项是8K的表空间(如果不用BLOCKSIZE选项指定块的大小,就采用DB_BLOCK_SIZE

参数指定的大小)。
CREATE TABLESPACE mytbs05 DATAFILE 'e:\mytbs05_1.dbf' SIZE 3M REUSE BLOCKSIZE 8K SEGMENT SPACE MANAGEMENT AUTO;
但可能不能创建BLOCKSIZE参数值为16K的表空间,否则会有错误提示:
CRAETE TABLESPACE mytbs06 DATAFILE 'e:\mytbs06_1.dbf' SIZE 3M REUSE BLOCKSIZE 16K SEGMENT SPACE MANAGEMENT AUTO;
如果要为不同的表空间指定不同的块大小,就需要先修改初始化参数文件中的数据高速缓存区参数

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

(二)创建大文件表空间
大文件表空间是ORACLE 10G数据库的新特性,而且仅在本地管理的表空间中才支持大文件表空间。这种表空间只能包括一个数据文件,该数据

文件可以包含4G个块。能显著提高ORACLE数据库的存储能力并减少数据文件的个数。
CREATE BIGFILE TABLESPACE mybigtbs01 DATAFILE 'e:\mybigtbs01_1.dbf' SIZE 2M SEGMENT SPACE MANAGEMENT AUTO;
在创建大文件表空间时可以指定区分配方式,但不能将段管理方式指定为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;就会出现错误提示

(三)创建临时表空间
如果指定了TEMPORARY选项,则创建的就是临时表空间,即ORACLE会用这种表空间来创建临时段,以便排序操作时使用。这个临时段是全体用户

共享的,即使排序操作结束了,ORACLE也不会释放这个临时段。这可以提高排序操作较多的应用系统的执行性能,因为ORACLE不必每次遇到一

个排序操作就分配一个临时段,可以采用以下方法创建临时表空间:
(1)创建临时表空间
如果在数据库运行过程中经常有大量排序工作要做,为了提高排序性能就应该建立多个链式表空间。
CREATE SMALLFILE TEMPORARY TABLESPACE mytmptbs01 TEMPFILE 'e:\mytmptbs01_1.dbf' SIZE 4M UNIFORM SIZE 64K;
必须用关键字TEMPFILE代替DATAFILE。另外,临时表空间使用临时文件而不是数据文件来创建。临时文件只能与临时表空间一起使用,不需要

备份,也不会把数据修改记录到重做日志中。
在创建临时表空间时,区分配方式不能指定为AUTOALLOCATE方式,否则会出现错误提示。

(2)创建大文件临时表空间
从ORACLE 10G开始,允许使用CREATE BIGFILE TEMPORARY TABLESPACE命令来创建只包含一个临时文件的大文件临时表空间。
CREATE BIGFILE TEMPORARY TABLESPACE mybigtmptbs02 TEMPFILE 'e:\mybigtmptbs02_1.dbf' SIZE 4M UNIFORM SIZE 64K;
在创建临时表空间时,段管理方式不能指定为AUTO方式,否则会出现错误提示。

(四)创建撤销表空间
撤销表空间(UNDO TABLESPACE)用户存储撤销段,该表空间只能使用本地管理方式。
当执行CREATE DATABASE语句创建数据库时,可以创建UNDO表空间,并且DBA可以使用该UNDO表空间来管理UNDO数据。创建数据库后,可以使用

CREATE UNDO TABLESPACE命令来创建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;
创建UNDO表空间时不能指定统一区大小的选项,否则会有错误提示。

如果想使用UNDO表空间的管理功能,就需要在初始化参数文件中设置如下参数:
*.undo_management='AUTO'
*.undo_tablespace='UNDOTBS1'
其中,undo_management参数必须设置成AUTO,否则将使用回退表空间(ROLLBACK TABLESPACE);undo_tablespace参数用于指定要使用哪个UNDO

表空间。
很显然可以创建多个UNDO表空间,但一次只能使用一个UNDO表空间。

可以用以下的语句修改初始化参数文件,就爱你个当前使用的UNDO表空间切换到另一个UNDO表空间。
ALTER SYSTEM SET undo_tablespace='new_undo_tablespace' SCOPE=SPFILE;

当一个UNDO表空间切换到另一个UNDO表空间之后,就可以在前一个UNDO表空间中的活跃事务全部完成后删除就的表空间。
可以修改UNDO表空间,如同增加一个数据文件、重新命名表空间、联机/脱机数据文件、备份表空间等。与其他表空间一样,正在使用的UNDO表

空间是不允许被删除的,即只有在其中已经没有未提交的事务时才能将其删除。
可以用V$TRANSACTION视图来检查其中是否还有未提交的事务。