表空间(TABLESPACE)是ORACLE数据库中最大的逻辑结构。ORACLE数据库是由一个或多个表空间组成的。它在物理上与磁盘上的数据文件相对应(一个表空间由一个或多个数据文件组成,但一个数据文件只能属于一个表空间)。从物理上说数据库的数据被存放在数据文件中,而从逻辑上说是被存放在表空间中的。
数据库的逻辑配置实际上就是指表空间的配置。
一、表空间概述
表空间是ORACLE数据库中最大的逻辑结构。数据库的所有对象和方案都被逻辑的保存在表空间中。
(一)表空间的特性与作用
数据库管理系统(DBMS)是建立在操作系统(OS)基础上的,它的数据也必须存储在各个文件中,如数据文件、重做日志文件、归档日志文件等。
表不是文件,表不是空间。
表空间是组织结构和分配空间的逻辑结构。除了数据文件之外,控制文件、重做日志文件、归档日志文件等其他文件都不属于任何表空间。
表空间的特性如下:
1.一个数据库可以有多个表空间。可以在数据库中创建、删除表空间;
2.一个表空间只属于一个数据库;
3.一个表空间必须要有一个数据文件;
4.一个表空间的大小等于其中所有数据文件的大小之和。数据库的大小等于其中所有表空间的大小之和;
5.表空间可以被联机和脱机。SYSTEM表空间不能被脱机;
6.表空间可以在读写、只读状态之间切换;
7.每个表空间由一个或多个物理存在的操作系统的数据文件组成。这种数据文件可以具有固定的大小,或允许其自动变大。可以在表空间中添加、删除数据文件;
8.方案对象、表、索引的数据都被存储在表空间的数据文件中。一个数据文件存储不下,就存储在另一个数据文件中,只要该数据文件是本表空间中的就可以;
9.一个用户默认使用一个表空间,但他的不同方案对象的数据可以被存储在不同表空间中;
10.一个用户使用的表空间的数量是有一定配额的,不能超出这个配额;
11.可以根据使用目的,创建不同类型的表空间,如永久表空间、临时表空间、撤销表空间、大表空间等。不同类型的表空间的格式、使用方式及目的是不同的。
表空间的作用:
1.控制数据库所占用的磁盘空间;
2.控制用户所占用的表空间配额,也就等于控制用户所占用的配额空间;
3.通过将不同表的数据、分区表中不同分区的数据放置到不同的表空间中,可以提高数据库的I/O性能,并有利于进行部分备份和恢复等管理工作;
4.能够将一个表的数据和这个表的索引数据分别防止到不同的表空间中,同样可以提高数据库的I/O性能;
5.可以将表空间设置成只读状态而保持大量的静态数据。
(二)表空间的类型
一个数据库通常有SYSTEM,SYSAUX,TEMP三个默认表空间,一个或多个临时表空间,而且还有一个撤销表空间和几个应用程序专用的应用表空间。
这些表空间可以划分为系统表空间和非系统表空间两类。
系统数据(数组字典表及其数据) 系统表空间
用户数据(表、索引) 大表空间、小表空间
临时数据 临时表空间
撤销数据 撤销表空间
(1)系统表空间
系统表空间包括SYSTEM表空间和SYSAUX表空间,其余的表空间就是非系统表空间。系统表空间在所有数据库中都是必须的。一般存放到ORACLE的数据字典及其数据。
(2)临时表空间
撤了撤销(UNDO)表空间、相对于临时(TEMPORARY)空间而言,其他表空间就是永久(PERMANENT)表空间。
当执行排序(ORDER BY)、分组汇总(GROUP BY)、索引(CREATE INDEX)等功能的SQL语句时,会产生大量的临时数据。服务器进程首先将临时数据存放到内存结构的PGA区的排序区中,当排序区不够用时,服务器进程就会在临时表空间中建立临时段,并将这些临时数据存放到临时段中。
如果在创建用户时没有为用户指定一个临时表空间,那么就会使用SYSTEM表空间来说创建临时段,存放临时数据。这样做的结果是:
1.占用了SYSTEM表空间的存储空间,使可用的存储空间下降;
2.频繁的分配和释放临时段,会在SYSTEM表空间中产生大量的存储碎片,使磁盘的读取效率下降。
如果在数据运行过程中,经常有大量的并发排序,那么为了避免在SYSTEM表空间中存储临时数据,数据库管理员应该在数据库中创建一个专门的用来存储临时数据的临时表空间。
临时表空间对应的是临时文件,它与数据文件是有区别的。数据文件在创建时就被完全分配和初始化,而临时文件不一定保证被分配到指定的磁盘空间。如:在UNIX操作系统中,将不实际分配临时文件的磁盘空间,而是知道某个操作需要临时表空间时才为临时文件分配磁盘空间。这种延迟式的分配方法允许临时文件被快速创建,但如果没有预留出实际运行时所需的磁盘空间,就可能在运行时发生问题。
临时表空间可以被所有用户共享使用,如TEMP表空间可以被所有用户共享使用。在ORACLE 8I中可以使用其他表空间作为临时表空间,而在ORACLE 9I中就开始引入默认临时表空间(DEFAULT TEMPORARY TABLESPACE)的设计了,使用户不能使用其他表空间作为临时表空间。
某个用户使用哪个临时表空间应该是在创建该用户时指定的。数据库的默认临时表空间是在创建(CREATE DATABASE)数据库时,由DEFAULT TEMPORARY TABLESPACE子句来指定的。
在临时表空间中,同一个例程的所有SQL语句的排序操作将共享使用一个排序段(SORT SEGMENT)。排序段在执行第一条排序操作的SQL语句时被创建,在例程关闭时被释放。可以通过动态性能视图V$SORT_SEGMENT来查询排序段的使用情况,通过动态性能视图V$SORT_USAGE来查询使用排序段的会话和用户信息。
(3)撤销表空间
在ORACLE 9I以前,对于回退段(ROLLBACK SEGMENT)的设置与管理是一项十分复杂的工作。从ORACLE 9I开始,引入了一个全新的概念,即自动撤销管理(AUTOMATIC UNDO MANAGEMENT),用撤销(UNDO)表空间取代已经使用了20年的回退段。实际上是将回退段(撤销段)放入了撤销表空间,而由例程自动处理撤销表空间中的回退段。使用自动撤销管理方式后,不仅可以减轻DBA的工作负担,而且还可以获得较好的回退性能。通过查询数据字典视图DBA_ROLLBACK_SEGS,可以得到撤销表空间中回退段的信息。
撤销表空间存储撤销段,撤销段主要用于入下目的:
1.用一条ROLLBACK语句明确的回退一个事务;
2.隐含的回退一个事务;
3.重构数据的一个读一致图像;
4.从逻辑错误中恢复。
在ORACLE中可以创建多个撤销表空间,但同一时刻值允许激活一个撤销表空间。在初始化参数文件中用UNDO_TABLESPACE指出要激活的撤销表空间。撤销表空间的组织与管理由ORACLE内部自动完成。当回退段不足时,一个事务可以使用多个回退段,不会中止事务的运行。数据库管理员只需了解撤销表空间是否有足够的空间,而不必为每个事务设置回退段。
(4)大文件表空间与小文件表空间
大文件(BIGFILE)表空间是ORACLE 10G新引进的表空间。大文件表空间只能放置一个数据文件(或临时文件)。但其数据文件可以包括4G个数据块。
大文件表空间都是为超大型数据库设计的。如果一个超大型数据库具有上千个数据文件的话,更新数据文件头部信息的操作就会花费很长时间。如果使用了 大文件表空间,就可以使用大数据文件来减少数据文件的数量,使更新数据文件头部信息的操作更快一些。
要想创建一个大文件表空间,可以使用CREATE语句中的使用的BIGFILE关键字。CREATE BIGFILE TABLESPACE mybigtbs01 DATAFILE 'e:/mybigtbs01_1.dbf' SIZE 20G SEGMENT SPACE MANAGEMENT AUTO;
小文件(SMALLFILE)表空间是以前ORACLE表空间的新命名。在小文件表空间中可以放置多个数据文件。一个数据库可以放置多达64K个数据文件。
SYSTEM和SYSAUX表空间总是被创建为小文件表空间。
想要创建一个小文件表空间,可以在CREATE语句中使用SMALLFILE关键字(或者不适用此类关键字)。CREATE SMALLFILE TEMPORARY TABLESPACE mytmptbs01 TEMPFILE 'e:/mytmptbs01_1.dbf' SIZE 4M UNIFORM SIZE 64K;
(三)表空间的区、段管理方式
ORACLE 10G的表空间是按照区和段空间进行管理的。
(1)区管理方式
针对区的分配方式不同,表空间有两种管理方式。ORACLE各个版本所支持的管理方式如下:
字典管理方式 ORACLE 7,ORACLE 8,ORACLE 8I,ORACLE 9I;
本地管理方式 ORACLE 8I,ORACLE 9I,ORACLE 10G;
字典管理方式(DICTIONARY-MANAGED TABLESPACE,DMT)
字典管理方式是传统的管理方式,是为了与早期版本兼容而保留的区管理方式。在字典管理方式下,使用数据字典来管理存储空间的分配。
当在表空间中分配新的区,或回收已分配的区时,ORACLE将对数据字典中的相关“基础表”进行查询、更新,并且在这一过程中,使用单线程搜索方法,速度较慢。另外,对表的更新操作会产生会退信息和重做信息,因此,在分配区或回收区时,会在数据库中产生会退信息和重做信息。这是字典管理方式的特点,也是它的缺点。
在创建字典管理方式的表空间时,可以在DEFAULT STORAGE子句中设置INITIAL,NEXT,MINEXTENTS,MAXENTENTS,PCTINCREASE等参数来为区设置存储管理方式,以指定表空间中区的默认分配方式。这样,如果在这种表空间中创建表、索引等方案对象时,没有使用DEFAULT STORAGE子句,他们就会自动继承表空间的存储参数设置。
如果其他表空间要采用字典管理方式,则要求SYSTEM表空间也必须采用字典管理方式,并且必须在CREATE TABLESPACE语句中显示的使用EXTENT MANAGEMENT DICTIONARY子句进行申明。字典管理方式是被淘汰的表空间管理方式,从ORACLE 9I开始不再支持这种方式。
本地管理方式(LOCAL-MANAGED TABLESPACE,LMT)
本地管理方式是一种新的、改进的管理方式。从ORACLE 9I开始,创建表空间时默认使用本地管理方式。
本地管理方式下,表空间中分配与区回收的管理信息都被存储在表空间的数据文件中,而与数据字典无关。表空间会在每个数据文件中维护一个"位图(BITMAP)"结构,用于记录表空间中所有区的分配情况。
ORACLE为每个可能的区都保留了一位。该位为1或0,表示该区正在使用或空闲。位图图像消耗64KB的表空间。当在表空间中分配的区,或回收已分配的区时,ORACLE将对数据文件中的"位图"进行更新。因此这种更新不是对表的更新操作,所以不会产生回退信息和重做信息。
与字典管理方式相比,本地管理方式具有如下的好处:
1.因为空间的分配和回收不需要对数据库进行访问,而只是简单的改变数据文件中的位图,所以能够提高空间存储管理的速度和并发性;
2.能够避免在字典管理方式中空间分配期间可能出现的递归现象,所以提高了空间存储管理的性能。
3.允许将数据库作为只读的备用数据库(STANDBY DATABASE)。由于不会产生会退信息和重做信息,所以不会向数据库中写信息,这样就可以将整个数据库设置为只读状态。这种数据库可以作为备用数据库。
4.简化了空间分配,以为当指定了AUTOALLOCATE子句时,ORACLE会自动选择合适的区大小,不再需要用户进行任何干预;
5.减少用户对数据库字典的依赖,因为必要的信息都被存储在数据文件的位图中了,而不是保存在数据字典中;
6.不存在磁盘碎片问题。使用位图的方法去查询空闲空间,相邻的空闲块被视为一个大的空闲块,从设计上保证自动合并磁盘碎片,碎片产生后由系统自动消除;
7.DBMS_SPACE_ADMIN包对本地管理的表空间提供维护过程。
在字典管理方式下,如果对某个表进行了更新,这时会产生存储管理操作,而该存储管理操作肯定会产生回退信息和重做信息,导致对回退段和重做日志文件进行读写,从而又产生存储管理操作,形成了递归现象。
在字典管理方式下,如果查询操作包含排序,则数据库需要为排序分配临时段,这会引起存储空间的分配操作,也就会对数据字典进行更新,所以数据库必须处于读写状态,而不能处于只读状态。
在本地管理方式下,可以用以下两个选项来指定表空间的区的分配方式:
1. 统一(UNIFORM):统一分配,指定表空间中所有区的大小都相同。区的大小的默认值是1MB,也可以指定这个大小。但不能在撤销表空间中使用这个选项;
2.自动(AUTOALLOCATE或SYSTEM)自动分配,指定由ORACLE系统来自动管理区的大小,这是默认的设置。
在自动去的分配方式下,区的大小随表的大小自动动态改变,他们之间的对应关系如下:
表大小 区大小
64KB(或前16个区) 64KB
1MB(接下来的63个区) 1MB
64MB(接下来的120个区) 8MB
1000MB(以后的区) 64MB
当表的大小不超过64KB时,表空每个区的大小为64K;
当表的大小不达到1MB时,表中每个区的大小为1MB;
当表的大小超过64MB且小于1000MB时,区的大小都是8MB;当表的大小达到1000MB时,区的大小为64MB。
也就是ishuo,这个算法只能使小表取小区,大表取大区,避免大表拥有过多的区。所以,自动选项最适合于由小表和大表构成的一个多用途的数据库系统。但是,对于数据超过1GB的大表,系统在分配磁盘空间时一次分配64MB,如果所插入的数据没有达到64MB,则可能造成空间的浪费。
通常,使用自动是最佳的选择。
(2)段空间管理方式
在本地管理方式的表空间中,除了可以用UNIFORM和AUTOALLOCATE来指定区的分配方式之外,还可以指定段空间的管理方式。段空间管理方式主要是指ORACLE用来管理段中已用数据块和空闲数据块的机制。
在本地管理方式下,可以用如下两个关键字来指定表空间的段空间管理方式:
1.MANUAL(手动)方式,这时ORACLE将使用空闲列表(FREE LIST)来管理段的空闲数据块。这是为了与以前的版本相兼容而保留的。
2.AUTO(自动)方式,这时ORACLE将使用位图(BITMAP)来管理段的已用数据块和空闲数据块。即,通过位图中单元的取值来判断段汇总的数据块是否可用。
空闲列表(FREELIST)是传统的段空间管理方式,段中所有的空闲数据块都被放入一个空闲列表中,在需要存储空间时据在该列表中进行搜索。与空闲列表相比,使用位图的自动方式能够提供更好的存储利用率。因为在自动方式下,用户不需要在创建方案对象时通过指定PCTFREE,PCTUSED,FREELIST,FREELIST GROUP等参数来为段设置存储管理方式,即使设置了,也将会被忽略。
当SYSTEM表空间的区管理方式是本地管理方式时则不可能创建字典管理的表空间,但可以创建本地管理的表空间。
另外,创建表空间这种修改数据库物理结构的信息会同时被记录到预警日志文件中。
(四)表空间的状态
处于不同状态的表空间,其使用方式有所不同。
SYSTEM表空间不能被设置为只读状态或脱机状态,因为在数据库进行过程中始终会使用到SYSTEM表空间中的数据。
(1)读写状态
读写(READ-WRITE)
默认情况下所有的表空间都是读写状态的。任何具有表空间配额并且具有适当权限的用户都可以读写该表空间中的数据。
只读(READ-ONLY)
如果将表空间设置为只读状态,则任何用户都无法向表空间中写入数据,也无法修改表空间中已有的数据。这种限制与用户的权限无关。将表空间设置为只读状态的主要目的是,避免对数据库进行修改。使用户只能查询其中的数据,而不能修改其中的数据。同时,由于只读表空间中的数据不会被修改,因此DBA只需将只读表空间备份一次即可,不必再次对这个表空间进行备份。如果数据库中保存大量的不允许用户修改、但又允许用户访问的数据。
(2)脱机状态
通过将某个表空间设置为脱机状态,以使该表空间暂时不让用户访问。
脱机模式有以下4种:
1.正常(NORMAL):默认的脱机模式。
2.临时(TEMPORARY):
3.立即(IMMEDIATE):
4.用于恢复(FOR RECOVER):
二、管理表空间的准则
(一)确定表空间的大小
(1)确定表的大小
(2)确定表空间的大小
(二)表空间的配置
(1)表空间的层次结构
(2)表空间的分配
(三)为用户设置表空间配额和临时表空间
三、创建表空间
创建表空间的步骤因操作系统带的不同而不同。然而,在所有的情况中,用户都应该事先通过操作系统的功能创建一个目录结构,以便将新表
空间的数据文件(一个表空间必须要有一个数据文件)分配到相应的目录中。在大多数操作系统中,当通过添加数据文件来创建一个新表空间或
修改一个表空间时,应该指出大小和完全限定的文件名(即包括目录结构和文件的扩展名)。在每一种情况中,都由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选项,则创建的是永久表空间,即永久保存其中的数据库对象的数据。
#######################################################
#######################################################
创建(永久)表空间,不自动扩展
CREATE TABLESPACE data01 DATAFILE '/oracle/oradata/db/DATA01.dbf' SIZE 500M
手动使其不自动扩展
ALTER DATABASE DATAFILE 'D:/ORACLE/ORADATA/YKYY/DRSYS01.DBF' AUTOEXTEND OFF
修改数据文件大小:
ALTER DATABASE DATAFILE 'D:/ORACLE/ORADATA/YKYY/USERS01.DBF' RESIZE 5120M
增加数据文件
ALTER TABLESPACE USERS ADD DATAFILE 'D:/ORACLE/ORADATA/YKYY/USERS11.DBF' size 5120M
######################################################
有三种创建(永久)表空间的方法:
(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视图来检查其中是否还有未提交的事务。
四、修改表空间
不论是字典管理表空间还是本地管理表空间,在表空间被创建之后都可以进行修改。可以使用ALTER TABALESPACE来修改表空间。相应的,用户
必须拥有ALTER TABLESPACE或ALTER DATABASE系统权限才能够修改表空间。
(一)扩展表空间
表空间在物理上是由保存在磁盘上的数据文件组成的。创建数据文件时会指定大小,因此表空间是有大小的。为了给用户提供更大的表空间,
以便使其可以继续增加数据,就必须能够扩展表空间,即增加更多存储空间。通常扩展表空间的方法有添加数据文件、改变数据文件的大小、
允许数据文件自动扩展这三种方式。
(1)添加数据文件
因为表空间的大小实际上就是它所包含的各个数据文件的大小和,所以为表空间增加新的数据文件是最常用的扩展表空间的办法。
注意:不能为大文件表空间增加第二个数据文件。
ALTER TABLESPACE mytbs01 ADD DATAFILE 'e:/mytbs01_2.dbf' SIZE 3M;
与普通表空间不同,如果要为临时表空间添加新的临时数据文件,就必须使用ALTER TABLESPACE...ADD TEMPFILE语句。
ALTER TABLESPACE mytmptbs01 ADD TEMPFILE 'e:/mytmptbs01_2.dbf' SIZE 3M;
(2)改变数据文件的大小
通过增加表空间中已有数据文件的大小,也可以增加表空间的存储空间。
ALTER DATABASE DATAFILE 'e:/mytbs01_2.dbf' RESIZE 4M;
与普通表空间不同,如果要改变临时表空间的临时文件的大小,就必须使用ALTER DATABASE TEMPFILE...RESIZE语句。
当数据文件中的可用空间未使用完时,允许减小它的大小,即进行压缩。
(3)允许数据文件自动扩展
如果在创建表空间或为表空间增加数据文件时,没有在数据文件子句中指定AUTOEXTEND选项,则该数据文件的大小是不会自动扩展或增加的。
为了是数据文件可以自动扩展,就必须指定AUTOEXTEND ON选项。在指定了AUTOEXTEND ON选项后,当表空间被填满时,数据文件就会自动扩展
,从而就间接的增加了表空间的存储空间。
ALTER DATABASE DATAFILE 'e:/mytbs01_2.dbf' AUTOEXTEND ON NEXT 1M MAXSIZE 20M;
(二)修改属性、状态
(1)修改表空间的可用性
新创建的表空间都处于联机(ONLINE)状态。此时该表空间是可以被访问的。但当表空间处于脱机(OFFLINE)状态时,该表空间就不能被SQL语句
访问了。因此,表空间是否联机,表明了表空间是否可用。
修改表空间可用性的语法是:
ALTER TABLESPACE ONLINE|OFFLINE [NORMAL|TEMPORARY|IMMEDIATE|FOR RECOVER];
使表空间脱机
为了提高数据文件的I/O性能,可能需要移动特定表空间的数据文件。为了确保表空间中数据文件的一致性,在移动数据文件之前,需要将该表
空间修改为脱机状态,以防止其中的数据文件被修改。
SYSTEM,SYSAUX,TEMP,UNDOTBS1表空间是不能被脱机的,因为ORACLE要随时使用这几个表空间。
当表空间修改为脱机状态后,与其相关的数据文件的SCN值和内容都不会发生任何变化。
ALTER TABLESPACE mytbs01 OFFLINE;
当表空间处于脱机状态时,就不能访问该表空间了,否则会有错误的提示。
ALTER TABLESPACE mytbs01 ONLINE;
ALTER TABLESPACE mytbs01 OFFLINE TEMPORARY;
ALTER TABLESPACE mytbs01 ONLINE;
要在ARCHIVELOG模式下执行立即脱机模式。
使表空间联机
完成其他对表空间的维护操作后,应该立即将表空间转变为ONLINE状态,以便该表空间可以被访问。
ALTER TABLESPACE mytbs01 ONLINE;
(2)修改表空间的可读写性
修改表空间的可读写包括使表空间只读和使表空间可读写。
使表空间只读
如果表空间值用于存放静态数据,或者要将表空间移动到其他数据库,就应该先将表空间修改为只读状态。
SYSTEM,SYSAUX,TEMP,UNDOTBS1这几个表空间不能被只读,因为ORACLE要随时向这几个表空间写入数据。
将表空间吸怪为只读状态后,与其相关的数据文件中的SCN值和内容都不会发生任何变化。
ALTER TABLESPACE mytbs01 READ ONLY;
当表空间处于READ ONLY状态时,就不能对该表空间操作了,否则会有错误提示。
当表空间处于只读状态时,仍然允许执行DROP 操作删除该表空间上的对象。
DROP TABLE personal CASCADE CONSTRAINTS;
表空间的可读写状态在脱机之后仍然保留,换句话说就是练级后的其可读写性仍然存在。
如果表空间处于脱机状态,就不能修改它的可读写状态,否则将会有错误提示信息。
使表空间可读写
正常情况下,表空间是可读写的,即可以在该表空间上执行正常的DDL和DML操作。
ALTER TABLESPACE mytbs01 READ WRITE;
(3)修改表空间的备份模式
如果执行非RMAN(RON-RECOVERY MANAGER)联机备份,即在ARCHIVELOG模式下的热备份,则需要修改表空间的备份模式。
首先执行ALTER TABLESPACE tablespace_name BEGIN BACKUP语句,将表空间tablespace_name设置成备份模式,类似于系统给需要备份的表空
间加锁,防止在备份过程中用户对此表空间进行操作。当表空间处于备份模式时,数据库继续写数据到数据文件(当检查点出现时),但这些检
查点的出现不被记录到数据文件的头部块中。这就告诉数据库,图过数据库例程被突然中断,就可能需要恢复。如果有必要,一些附加的信息
会被写入重做日志文件,以便有助于恢复。
然后使用一些操作系统的命令程序,将该表空间中的各个数据文件都备份到某些文件夹中或存储设备上。
最后执行ALTER TABLESPACE tablespace_name END BACKUP语句,将表空间tablespace_name设置成结束备份模式,类似于系统给正在备份的表
空间解锁,以便用户对此空间进行操作。如果忘记了将表空间设置成结束备份模式,则下一次启动数据库时,数据库将会看到控制文件中的检
查点号晚于数据文件头部块中的检查好,并提示一个需要进行介质恢复的信息。
(4)修改表空间的名称
通过使用ALTER TABLESPACE的RENAME选项,DBA就可以修改表空间的名称。在ORACLE 9I之前,移动表空间时,如果在目标数据库中存在同名表
空间,那么该表空间将不能被移动到目标数据库;而在ORACLE 10G中,如果目标数据库存在同名表空间,可以先使用ALTER TABLESPACE命令修
改源数据库或目标数据库的相应表空间名,然后再移动表空间。
SYSTEM,SYSAUX,TEMP,UNDOTBS1表空间的名称不能被移动。
ALTER TABLESPACE mytbs01 RENAME TO mytbs01_new;
当表空间或其任何数据文件爱你处于OFFLINE状态时,不能修改表空间的名称。
(5)设置、查询默认表空间
在创建数据库用户时,如果没有用DEFAULT TABLESPACE选项指定默认表空间,则使用数据库的默认表空间。如果没有用DEFAULT TEMPORARY
TABLESPACE选项指定临时表空间,则使用数据库的默认临时表空间。在ORACLE 10G中,初始的默认临时表空间是TEMP,而默认表空间随用户的
不同而不同。
设置数据库默认表空间
可以使用ALTER DATABASE DEFAULT TABLESPACE语句,修改数据库的默认表空间。
ALTER DATABASE DEFAULT TABLESPACE mytbs01;
设置数据库默认临时表空间
可以使用ALTER DATABASE DEFAULT TEMPORARY TABLESPACE语句,修改数据库的默认临时表空间按。
ALTER DATABASE DEFAULT TEMPORARY TABLESPACE mytmptbs01;
查询数据库的默认表空间
可以使用以下语句查询当前数据库的默认表空间。
SELECT username,default_tablespace,temporary_tablespae FROM DBA_UERS;
永久表空间与临时表空间是有区别的,所以如果就爱你个一个永久表空间设置为数据库的临时表空间就会有错误提示。
五、删除表空间
如果不再需要一个表空间及其内容(该表空间所包含的段,或所有的数据文件),就可以将该表空间中从数据库中删除。ORACLE数据库中的任何
表空间,除系统必须的表空间(SYSTEM,SYSAUX,TEMP)外,都可以被删除。
一旦一个表空间已经被删除,该表空间的数据就不能恢复了。因而,一定要确保一个将被删除的表空间所包含的所有数据将来都不再需要了。
另外,在从数据库删除表空间的前后,都需要对数据库做一次完全备份。这样即使错误的删除了一个表空间,如果数据库在删除表空间后遇到
问题,还能够恢复该数据库。
不能删除包含任何活动端的表空间。为了简单,应该是表空间在被删除之间脱机。
要删除一个表空间,使用DROP TABLESPACE tablespace_name语句。用户必须拥有DROP TABLESPACE系统权限才能删除一个表空间。
要删除一个非空的表空间,就要使用INCLUDING CONTENTS选项,否则会有错误提示。
以上的语句只会从数据字典、控制文件删除表空间信息,而与其相关的数据文件仍然存在于磁盘上。但是,当表空间一旦被删除,无论它所包
括的数据文件是否被删除,这些数据文件爱你都会时区作用。
从ORACLE 9I开始,在删除表空间的同时还可以联机的删除与其相关的数据文件。当然,如果在ORACLE删除表空间的同时,没有只是它删除数据
文件,就必须在以后使用合适的操作系统命令来删除他们。
要删除一个表空间的同时删除与他相关的数据文件,就必须使用INCLUDING CONTENTS AND DATAFILES子句。
ALTER TABLESPACE mytbs06 OFFLINE;
DROP TABLESPACE mytbs06 INCLUDING CONTENTS AND DATAFILES;