1、 表空间的概念:
Oracle数据库在逻辑上可以划分为一系列的逻辑空间,每一个逻辑空间就可以称为一个表空间。
一个数据库由有一个或多个表空间构成,不同表空间用于存放不同应用的数据,表空间大小决定了数据库的大小。
一个表空间对应一个或多个数据文件,数据文件大小决定了表空间的大小。一个数据文件只能从属于一个表空间。
表空间是存储模式对象的容器,一个数据库对象只能存储在一个表空间中(分区表和分区索引除外),但可以存储在该表空间所对应的一个或多个数据文件中。若表空间只有一个数据文件,则该表空间中所有对象都保存在该文件中;若表空间对应多个数据文件,则表空间中的对象可以分布于不同的数据文件中。
数据库、表空间、数据文件、数据库对象之间的关系如下图 :
2、 表空间的分类:
(1)系统表空间:
包括system表空间和辅助系统表空间sysaux。都是创建数据库时自动创建,其中,system表空间是系统默认的表空间。
1)SYSTEM 表空间,主要存储:数据库的数据字典;PL/SQL程序的源代码和解释代码,包括存储过程、函数、包、触发器等; 数据库对象的定义,如表、视图、序列、同义词等。
2)SYSAUX表空间,是Oracle10g新增的辅助系统表空间,主要用于存储数据库组件等信息,以减小SYSTEM表空间的负荷。在通常情况下,不允许删除、重命名及传输SYSAUX表空间。
(2)非系统表空间:
数据库中可包含多个非系统表空间,主要有以下几种非系统表空间:
1)撤销表空间:专门进行回滚信息的自动管理,由UNDO_TABLESPACE参数设置,如创建数据库时,系统自动产生的UNDOTBS1表空间。
2)临时表空间:专门进行临时数据管理的表空间,在数据库实例运行过程中,执行排序等SQL语句时会产生大量的临时数据,这些临时数据将保存在数据库临时表空间中。
3)默认临时表空间:临时表空间由于频繁分配与释放,会产生大量的存储碎片,如创建数据库时,系统自动产生的TEMP表空间。
4)用户表空间:保存用户数据,每个应用都应创建独立的表空间,如创建数据库时,系统自动产生的USERS表空间。
3、大文件表空间与小文件表空间
所谓大文件表空间(Bigfile Tablespace,BTF)是指一个表空间只包含一个大数据文件,该文件的最大尺寸为128 TB(数据块大小为32 KB),最小尺寸为8 TB(数据块大小为2KB)。BTF要么是一个本地管理的表空间,要么是一个重做日志表空间,要么是一个临时表空间。使用BTF可以简化数据库的管理,一个表空间只需管理一个数据文件,而不是多个。它最大的好处是显著的提高了oracle的数据库的存储能力,在oracle系统中,可以处理8TB的存储空间,甚至更大的存储空间,但是如果没有足够的磁盘空间,建议不要使用BTF。
与大文件表空间相对应,系统默认创建的表空间称为小文件表空间(SmallfileTablespace),如SYSTEM表空间、SYSAUX表空间等。小文件表空间可以包含多达1024个数据文件。小文件表空间的总容量与大文件表空间的容量基本相似。
4、表空间的管理方式
(1)字典管理方式
表空间使用数据字典来管理存储空间的分配,当进行区的分配与回收时,Oracle将对数据字典中的相关基础表进行更新,同时会产生回滚信息和重做信息。字典管理方式将渐渐被淘汰。
(2)本地管理方式(默认)
在本地管理方式中,区的分配和管理信息都存储在表空间的数据文件中,而与数据字典无关。表空间在每个数据文件中维护一个“位图”结构,用于记录表空间中所有区的分配情况,因此区在分配与回收时,Oracle将对数据文件中的位图进行更新,不会产生回滚信息或重做信息。
(3)表空间本地管理方式的优势:
1)由于在区分配与回收过程中不需要对数据字典进行访问,提高了表空间存储管理操作的速度和并发性。
2)能够避免表空间存储管理操作中的递归现象,提高了存储空间管理操作性能。
3)由于本地管理的临时表空间在使用过程中不会产生任何重做信息和撤销信息,因此既使查询操作中包含排序,对数据库来说也完全是只读操作,这样能够在保留可查询性同时,将整个数据库设置为只读状态。这种数据库可以作为备用数据库使用。
4)简化了表空间的存储管理,由Oracle自动完成存储管理操作。
5)降低了用户对数据字典的依赖性。
6)不存在磁盘碎片问题,因为必要的信息都存储在数据文件的位图中,而不是保存在数据字典中
5、表空间的管理策略
系统表空间主要用于存储数据字典等Oracle自身对象和数据,并建议将所有的用户对象和数据都保存在其它表空间中。用多个表空间可以使用户操作更具灵活性,但应遵循以下原则:
1)将数据字典与用户数据分离,避免由于数据字典对象和用户对象保存在一个数据文件中而产生I/O冲突。
2)将回滚数据与用户数据分离,避免由于硬盘损坏而导致永久性的数据丢失。
3)将表空间的数据文件分散保存到不同的硬盘上,平均分布物理I/O操作。
4)为不同的应用创建独立的表空间,避免多个应用之间的相互干扰。
5)能够将表空间设置为脱机状态或联机状态,以便对数据库的一部分进行备份或恢复。
6)能够将表空间设置为只读状态,从而将数据库的一部分设置为只读状态。
7)能够为某种特殊用途专门设置一个表空间,如临时表空间,优化表空间的使用效率。
8)能够更加灵活地为用户设置表空间配额。
6、表空间的管理(本地管理方式)
(1)创建表空间
在创建本地管理方式下的表空间时,应该先确定表空间的名称、类型、对应的数据文件的名称和位置以及区的分配方式、段的管理方式。
表空间名称不能超过30个字符,必须以字母开头,可以包含字母、数字以及一些特殊字符(如#、_、$)等;
表空间的类型包括普通表空间、临时表空间和撤销表空间;
表空间中区的分配方式包括两种方式:自动扩展(AUTOALLOCATE)和定制(UNIFORM);
段的管理包括两种方式:自动管理(AUTO)和手动管理(MANUAL)。
1)创建永久表空间
创建永久表空间使用CREATETABLESPACE语句来实现,该语句包含以下几个子句:
DATAFILE:设定表空间对应的数据文件。
EXTENT MANAGEMENT:指定表空间的管理方式,取值为LOCAL(默认)或DICTIONARY。
AUTOALLOCATE(默认)或UNIFORM:设定区的分配方式。
SEGMENT SPACEMANAGEMENT:设定段的管理方式,其取值为MANUAL或AUTO (默认) 。
举例:
为ORCL数据库创建一个永久性的表空间,区自动扩展,段采用自动管理方式
SQL>CREATE TABLESPACE ORCLTBS1DATAFILE
'D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\ORCLTBS1_1.DBF'SIZE 50M;
为ORCL数据库创建一个永久性的表空间,区定制分配,段采用自动管理方式。
SQL>CREATE TABLESPACE ORCLTBS2 DATAFILE
'D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\ORCLTBS2_1.DBF'SIZE 50M
EXTENT MANAGEMENT LOCAL UNIFORMSIZE 512K;
为ORCL数据库创建一个永久性的表空间,区自动扩展,段采用手动管理方式。
SQL>CREATE TABLESPACE ORCLTBS3 DATAFILE
'D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\ORCLTBS3_1.DBF'SIZE 50M
SEGMENT SPACE MANAGEMENT MANUAL;
为ORCL数据库创建一个永久性的表空间,区定制分配,段采用手动管理方式。
SQL>CREATE TABLESPACE ORCLTBS4 DATAFILE
'D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\ORCLTBS4_1.DBF'SIZE 50M
EXTENT MANAGEMENT LOCAL UNIFORMSIZE 512K SEGMENT SPACE MANAGEMENT MANUAL;
2)创建临时表空间
使用CREATE TEMPORARY TABLESPACE 语句创建临时表空间,用TEMPFILE子句设置临时数据文件。
需要注意的是临时表空间中区的分配方式只能是UNIFORM,而不能是AUTOALLOCATE,因为这样才能保证不会在临时段中产生过多的存储碎片。
举例:
为ORCL数据库创建一个临时表空间ORCLTEMP1。
SQL>CREATE TEMPORARY TABLESPACE ORCLTEMP1
TEMPFILE'D:\ORACLE\PRODUCT\10.2.0\
ORADATA\ORCL\ORCLTEMP1_1.DBF' SIZE20M
EXTENT MANAGEMENT LOCAL UNIFORMSIZE 16M;
3)创建临时表空间组
将一个或多个临时表空间构成一个表空间组。当将临时表空间组作为数据库或用户的默认临时表空间时,用户就可以同时使用该表空间组中所有的临时表空间,避免了由于单个临时表空间的空间不足而导致数据库运行故障。同时,使用临时表空间组,可以保证在一个简单并行操作中多个并行服务的执行。
临时表空间组不需要显式创建,为临时表空间组指定第一个临时表空间时隐式创建,当临时表空间组中最后一个临时表空间删除时而隐式地删除。
通过在CREATE TEMPORARY TABLSPACE或ALTERTABLESPACE语句中使用TABLESPACE GROUP短语创建临时表空间组。
举例:
为ORCL数据库创建一个临时表空间ORCLTEMP2,并放入临时表空间组temp_group1。同时,将临时表空间ORCLTEMP1也放入该temp_group1中。
SQL>CREATE TEMPORARY TABLESPACE ORCLTEMP2TEMPFILE
'D:\ORACLE\PRODUCT\10.2.0 \ORADATA\ORCL\ORCLTEMP2_1.DBF'SIZE 20M
EXTENT MANAGEMENT LOCAL UNIFORMSIZE 16M
TABLESPACE GROUP temp_group1;
SQL>ALTER TABLESPACE ORCLTEMP1TABLESPACE GROUP temp_group1;
4)创建撤销表空间
在Oracle 10g中引入了撤销表空间的概念,专门用于回滚段的自动管理。如果数据库中没有创建撤销表空间,那么将使用SYSTEM表空间来管理回滚段。
如果数据库中包含多个撤销表空间,那么一个实例只能使用一个处于活动状态的撤销表空间,可以通过参数UNDO_TABLESPACE来指定;如果数据库中只包含一个撤销表空间,那么数据库实例启动后会自动使用该撤销表空间。
如果要使用撤销表空间对数据库回滚信息进行自动管理,则必须将初始化参数UNDO_MANAGEMENT=AUTO。
可以使用CREATE UNDO TABLESPACE语句创建撤销表空间,但是在该语句中只能指定DATAFILE和EXTENTMANAGEMENT LOCAL两个子句,而不能指定其他子句。
举例:
为ORCL数据库创建一个撤销表空间。
SQL>CREATE UNDO TABLESPACE ORCLUNDO1
DATAFILE 'D:\ORACLE\ORADATA\ORCL\ORCLUNDO1_1.DBF'SIZE 20M;
如果要在数据库使用该撤销表空间,需要设置参数
UNDO_MANAGEMENT=AUTO
UNDO_TABLESPACE= ORCLUNDO1
(2)修改表空间
需要注意的是:不能将本地管理的永久性表空间转换为本地管理的临时表空间,也不能修改本地管理表空间中段的管理方式。
1) 扩展表空间
a) 为表空间添加数据文件
通过ALTERTABLESPACE…ADD DATAFILE语句为永久表空间添加数据文件,通过ALTER TABLESPACE… ADD TEMPFILE语句为临时表空间添加临时数据文件。
举例:
为ORCL数据库的ORCLTBS1表空间添加一个大小为10 MB的新数据文件。
SQL>ALTER TABLESPACE ORCLTBS1ADD DATAFILE
'D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\ORCLTBS1_2.DBF'SIZE 10M;
为ORCL数据库的ORCLTEMP1表空间添加一个大小为10 MB的临时数据文件。
SQL>ALTER TABLESPACE ORCLTEMP1ADD TEMPFILE
'D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\ORCLTEMP1_2.DBF'SIZE 20M;
b) 改变数据文件的大小
可以通过改变表空间已有数据文件的大小,达到扩展表空间的目的。
举例:
将ORCL数据库的ORCLTBS1表空间的数据文件ORCLTBS1_2.DBF大小增加到20 MB。
SQL>ALTER DATABASE DATAFILE
'D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\ORCLTBS1_2.DBF'RESIZE 20M;
c) 改变数据文件的扩展方式
如果在创建表空间或为表空间增加数据文件时没有指定AUTOEXTENDON选项,则该文件的大小是固定的。如果为数据文件指定了AUTOEXTENDON选项,当数据文件被填满时,数据文件会自动扩展,即表空间被扩展了。
举例:
将ORCL数据库的ORCLTBS1表空间的数据文件ORCLTBS1_2.DBF设置为自动扩展,每次扩展5 MB空间,文件最大为100 MB。
SQL>ALTER DATABASE DATAFILE
'D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\ORCLTBS1_2.DBF'
AUTOEXTEND ON NEXT 5M MAXSIZE100M;
2) 修改表空间可用性
离线状态的表空间是不能进行数据访问的,所对应的所有数据文件也都处于脱机状态。
一些表空间必须是在线状态:SYSTEM表空间,存放在线回退信息的撤销表空间,临时表空间。
语法:
ALTER TABLESPACE tablespace_nameONLINE|OFFLINE
举例:
在归档模式下,将USERS表空间中所有的数据文件脱机,但USERS表空间不脱机。然后再将USERS表空间中的所有数据文件联机。
SQL>ALTER TABLESPACE USERS DATAFILEOFFLINE;
SQL>RECOVER TABLESPACE USERS;
SQL>ALTER TABLESPACE USERS DATAFILEONLINE;
3) 修改表空间的读写性
语法:
ALTER TABLESPACE tablespace_nameREAD ONLY|READ WRITE
表空间只有满足下列要求才可以转换为只读状态:
a) 表空间处于联机状态;
b) 表空间中不能包含任何活动的回退段;
c) 如果表空间正在进行联机数据库备份,不能将它设置为只读状态。因为联机备份结束时,Oracle更新表空间数据文件的头部信息。
示例:
SQL>ALTER TABLESPACE ORCLTBS1 READ ONLY;
SQL>ALTER TABLESPACE ORCLTBS1 READ WRITE
4) 设置默认表空间
在Oracle10g数据库中,默认表空间为USERS表空间,默认临时表空间为TEMP表空间。
设置数据库的默认表空间:
ALTER DATABASE DEFAULT TABLESPACE
设置数据库的默认临时表空间:
ALTER DATABASE DEFAULT TEMPORARY TABLESPACE
示例:
SQL>ALTERDATABASE DEFAULT TABLESPACE ORCLTBS1;
SQL>ALTERDATABASE DEFAULT TEMPORARY TABLESPACE TEMP;
5) 表空间重命名
语法:
ALTER TABLESPACE…RENAME TO
当重命名一个表空间时数据库会自动更新数据字典、控制文件以及数据文件头部中对该表空间的引用。在重命名表空间时,该表空间ID号并没有修改,如果该表空间是数据库默认表空间,那么重命名后仍然是数据库的默认表空间。
注意:
不能重命名SYSTEM表空间和SYSAUX表空间
不能重命名处于脱机状态或部分数据文件处于脱机状态的表空间。
(3)表空间的备份
语法:
ALTER TABLESPACE tablespace_name BEGIN|ENDBACKUP
在数据库进行热备份(联机备份)时,需要分别对表空间进行备份。
基本步骤为:
1)使用ALTERTABLESPACE…BEGIN BACKUP语句将表空间设置为备份模式。
2)在操作系统中备份表空间所对应的数据文件。
3)使用ALTERTABLESPACE…END BACKUP语句结束表空间的备份模式。
示例:备份ORCL数据库的ORCLTBS1表空间。
SQL>ALTER TABLESPACE ORCLTBS1 BEGINBACKUP;
复制ORCLTBS1表空间的数据文件ORCLTBS1_1.DBF和ORCLTBS1_2.DBF到目标位置。
SQL>ALTER TABLESPACE ORCLTBS1 END BACKUP;
(4)删除表空间
语法:
DROP TABLESPACE tablespace_name
如果表空间非空,应带有子句INCLUDING CONTENTS
若要删除操作系统下的数据文件,应带有子句AND DATAFILES
删除参照完整性约束,应带有子句CASCADE CONSTRAINTS
示例:
1)删除ORCL数据库的ORCLTBS1表空间及其所有内容。
SQL>DROP TABLESPACE ORCLTBS1 INCLUDINGCONTENTS;
2)删除ORCL数据库的ORCLUNDO1表空间及其所有内容,同时删除其所对应的数据文件。
SQL>DROP TABLESPACE ORCLUNDO1 INCLUDINGCONTENTS AND DATAFILES;
3)删除ORCL数据库的ORCLUNDO1表空间及其所有内容,同时删除其所对应的数据文件,以及其他表空间中与ORCLUNDO1表空间相关的参照完整性约束。
SQL>DROP TABLESPACE ORCLUNDO1 INCLUDINGCONTENTS AND DATAFILES CASCADE CONSTRAINTS;
(5)大文件表空间的管理
大文件表空间只包含一个数据文件,减少数据库中数据文件的数量,减少SGA中用于存放数据文件信息的内存需求,同时减小控制文件。
通过对大文件表空间的操作可以实现对数据文件的透明操作,简化了对数据文件的管理。
大文件表空间只能采用本地管理方式,其段采用自动管理方式。
如果在数据库创建时设置系统默认的表空间类型为BIGFILE,则使用CREATETABLESPACE语句默认创建的就是大文件表空间。如果要创建传统的小文件表空间,则需要使用CREATE SMALLFILE TABLESPACE语句。
1) 创建大文件表空间
语句:CREATE BIGFILE TABLESPACE
示例:创建一个大文件表空间ORCLTBS5。
SQL>CREATE BIGFILE TABLESPACEORCLTBS5 DATAFILE
'D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\ORCLTBS5_1.DBF'SIZE 20M;
2)大文件表空间的操作
将大文件表空间ORCLTBS5的数据文件D:\ORACLE\PRODUCT\10.2.0\ORADATA\ ORCL\ORCLTBS5_1.DBF 大小修改为30 MB。
SQL>ALTER TABLESPACE ORCLTBS5RESIZE 30M;
将大文件表空间ORCLTBS5的数据文件D:\ORACLE\PRODUCT\10.2.0\ORADATA\ ORCL\ORCLTBS5_1.DBF修改为可以自动扩展。
SQL>ALTER TABLESPACE ORCLTBS5AUTOEXTEND ON NEXT 10M MAXSIZE UNLIMITED;
(6)表空间信息查询
V$TABLESPACE:从控制文件中获取的表空间名称和编号信息。
DBA_TABLESPACES:数据库中所有表空间的信息。
DBA_TABLESPACE_GROUPS:表空间组及其包含的表空间信息。
DBA_SEGMENTS:所有表空间中段的信息。
DBA_EXTENTS:所有表空间中区的信息。
DBA_FREE_SPACE:所有表空间中空闲区的信息。
V$DATAFILE:所有数据文件信息,包括所属表空间的名称和编号。
V$TEMPFILE:所有临时文件信息,包括所属表空间的名称和编号。
DBA_DATA_FILES:数据文件及其所属表空间信息。
DBA_TEMP_FILES:临时文件及其所属表空间信息。
DBA_USERS:所有用户的默认表空间和临时表空间信息。
DBA_TS_QUOTAS:所有用户的表空间配额信息。
V$SORT_SEGMENT:数据库实例的每个排序段信息。
V$SORT_USER:用户使用临时排序段信息。
示例:
查询表空间基本信息
SQL>SELECT TABLESPACE_NAME,EXTENT_MANAGEMENT,ALLOCATION_TYPE,
SEGMENT_SPACE_MANAGEMENT, CONTENTS,NEXT_EXTENT FROM DBA_TABLESPACES;
查询表空间数据文件信息
SQL>SELECTFILE_NAME,BLOCKS,TABLESPACE_NAME FROM DBA_DATA_FILES;
查询表空间空闲空间大小
SQL>SELECT TABLESPACE_NAME,SUM(BYTES),FREE_SPACESFROM DBA_FREE_SPACE GROUP BY TABLESPACE_NAME;
统计表空间空闲空间信息
SQL>SELECT TABLESPACE_NAME "TABLESPACE",FILE_ID,COUNT(*) "PIECES", MAX(blocks) "MAXIMUM",MIN(blocks) "MINIMUM",
AVG(blocks) "AVERAGE",SUM(blocks) "TOTAL"
FROM DBA_FREE_SPACE
GROUP BY TABLESPACE_NAME, FILE_ID;