一、Oracle表空间概述
表空间是Oracle数据库中最大的逻辑结构。它提供了一套有效组织数据的方法,是组织数据和进行空间分配的逻辑结构,可以将表空间看做是数据库对象的容器。检点第说,表空间就是一个或多个是数据文件(物理文件)的集合(逻辑文件),所有的数据对象都被逻辑地存放在指定的表空间中。
Oracle的表空间属于Oracle中的存储结构,是一种用于存储数据库对象(如:数据文件)的逻辑空间,是Oracle中信息存储的最大逻辑单元,其下还包含有段、区、数据块等逻辑数据类型。表空间是在数据库中开辟的一个空间,用于存放数据库的对象,一个数据库可以由多个表空间组成。可以通过表空间来实现对Oracle的调优。(Oracle数据库独特的高级应用)
一个数据库通常包括SYSTEM、SYSAUX和TEMP三个默认表空间,一个或多个临时表空间,还有一个撤销表空间和几个应用程序专用的表空间。可以通过创建新的表空间来满足需求,创建时需要决定表空间的类型。
二、Oracle表空间类型
1、系统表空间(System tablespace)
系统表空间包括SYSTEM和SYSAUX表空间,系统表空间是所有数据库必须且自动创建的,一般存放Oracle的数据字典及相应数据。
2、永久表空间(Permanent tablespace)
永久表空间用于保存永久性数据,如系统数据、应用系统数据。每个用户都会被分配一个永久表空间,以便保存其相关数据。除了撤销表空间以外,相对于临时表空间而言,其他表空间就是永久表空间,如系统表空间。
3、临时表空间(Temporary tablespace)
由于Oracle工作时经常需要一些临时的磁盘空间,这些空间主要在查询带有排序(如Group by、Order by等)算法时使用,当用完后就立即释放,对记录在磁盘区的信息不再使用,因此称为临时表空间。一般安装之后只有一个TEMP临时表空间。
4、撤销表空间(Undo tablespace)
从Oracle 9i后,提供了一种全新的撤销空间管理方式,从而使得DBA能够很容易地管理撤销空间,即“自动撤销管理”。而与此相对应,通过回滚端进行撤销空间管理的方式呗称为“手工撤销管理”。自动撤销管理方式也称为SMU(System Managed Undo)方式,而回滚段管理方式称为RBU(Rollback Segments Undo)方式。在Oracle 11g数据库中,系统默认为弃用自动撤销表空间管理方式,同时也支持传统的回滚段管理方式。
在一个数据库中,只能采用一种撤销空间管理方式,而不能同时存在两种撤销空间管理方式。数据库采用哪一种撤销空间管理方式,是由参数UNDO_MANAGEMENT来确定的。如果设置该参数为“AUTO”,在启动数据库时使用SMU方式:如果设置为“MANUAL”,则在启动数据库时使用RBU方式,运行在自动撤销数据来隐式或显示的回退事务、提供数据的度已执行、帮助数据库从逻辑错误中恢复、实现闪回 查询(Flashback Query)。
注意:在SMU方式下,必须在数据库中黄建一个撤销表空间看,Oracle将利用撤销表空间来保存撤销记录。可以在创建数据库的同事建立一个默认的撤销表空间,也可以在数据库创建后再创建新的撤销表空间。
5、大文件表空间和小文件表空间
从Oracle 10g开始,Oracle引入了大文件表空间,这是一个新增的表空间类型。该类型的出现时存储能力有了显著的增强。大文件表空间不想传统的表空间那样由多个数据文件组成。
大文件表空间(bigfile tablespace)是为了超大型数据库而设计的,如果一个超大型数据库具有上千个数据文件,则更新数据文件头部信息(如check-point)的操作可能会花费很长时间。如果使用大文件表空间,可以使用哦大数据文件来减少文件的数量,从而减少更新的时间。
提示:一个大文件表空间对应一个单一的数据文件或临时文件,但是文件可以达到4G数据块大小。理论上当数据块代销为2KB时,大文件表空间可以达到8TB;当数据快大小为4KB时,大文件表空间可以达到32TB。在实际环境中,者还会受到操作系统的文件系统的限制。
小文件表空间(smallfile tablespace)是之前Oracle表空间在Oracle 11g中的新名称,是默认创建的表空间的类型。在小文件表空间中可以防止多达1022个数据文件,一个数据库最多可以防止64K个数据文件。SYSTEM和SYSAUX表空间总是被创建为小文件表空间。
三、Oracle表空间状态
出于不同的使用需求,对表空间设置了不同的状态。通过该表表空间的状态,可以控制表空间的可用性和安全性,也可以为相关的备份恢复等工作提供保障。表空间有以下几种状态:
1、读写(Read-Write)状态
这是表空间的默认状态。任何具有表空间配额并拥有相关权限的用户均可读写表空间的数据。
2、只读(Read-Only)状态
如果将表空间设置为只读状态,则任何用户(包括DBA)均无法向表空间写入数据,也无法修改表空间中的现有数据,这种限制和权限无关。
只读状态可以使表空间的数据不被修改,即仅能SELECT,而无法进行INSERT、UPDATE或是DELETE操作。只读状态一方面对数据提供了保护,另一方面对数据库中设置静态数据非常有好处。我们可以将不能被修改的静态数据保存在一个单独的表空间中,并将这个表空间设置为只读状态,这样既能够提高数据的安全性,又能够减轻DBA的管理和维护的负担。
3、脱机(Offline)状态
在有多个应用表空间的数据库中,DBA可以通过将某个应用表空间设置为脱机状态,是表空间暂时不被用户访问。如果需要访问该表空间时,必须将脱机状态设置为联机状态。这样的设置增强了表空间的可用性,并提高了数据库管理的灵活性。
注意:SYSTEM表空间不能被何止为只读状态和脱机状态,因为在数据库运行过程中始终需要SYSTEM表空间数据的支持;另外,零食表空间也不能设置为只读状态。
四、Oracle表空间作用
对Oracle数据库来说,引入表空间概念具有以下作用:
五、Oracle表空间操作
1、查看system用户的默认表空间和临时表空间:
select DEFAULT_TABLESPACE,TEMPORARY_TABLESPACE
from dba_users
where username='SYSTEM';
2、查看system用户的默认永久表空间:
SELECT PROPERTY_NAME, PROPERTY_VALUE
FROM DATABASE_PROPERTIES;
3、查看默认的TEMP表空间:
SELECT PROPERTY_NAME, PROPERTY_VALUE
FROM DATABASE_PROPERTIES
WHERE PROPERTY_NAME='DEFAULT_TEMP_TABLESPACE';
SELECT USERNAME, TEMPORARY_TABLESPACE FROM DBA_USERS
4、查看默认的表空间类型:
SELECT PROPERTY_NAME, PROPERTY_VALUE
FROM DATABASE_PROPERTIES
WHERE PROPERTY_NAME='DEFAULT_TBS_TYPE';
5、查看表空间使用情况:
SELECT A.TABLESPACE_NAME AS TABLESPACE_NAME,
ROUND(A.BYTES/(1024*1024*1024),2) AS "TOTAL(G)" ,
ROUND(B.BYTES/(1024*1024*1024),2) AS "USED(G)" ,
ROUND(C.BYTES/(1024*1024*1024),2) AS "FREE(G)" ,
ROUND((B.BYTES * 100) / A.BYTES,2) AS "% USED" ,
ROUND((C.BYTES * 100) / A.BYTES,2) AS "% FREE"
FROM SYS.SM$TS_AVAIL A, SYS.SM$TS_USED B, SYS.SM$TS_FREE C
WHERE A.TABLESPACE_NAME = B.TABLESPACE_NAME
AND A.TABLESPACE_NAME = C.TABLESPACE_NAME;
6、计算表空间使用情况(考虑了数据文件自动增长的情况):
SELECT UPPER(F.TABLESPACE_NAME) AS "表空间名称",
ROUND(D.AVAILB_BYTES ,2) AS "表空间大小(G)",
ROUND(D.MAX_BYTES,2) AS "最终表空间大小(G)",
ROUND((D.AVAILB_BYTES - F.USED_BYTES),2) AS "已使用空间(G)",
TO_CHAR(ROUND((D.AVAILB_BYTES - F.USED_BYTES) / D.AVAILB_BYTES * 100,
2), '999.99') AS "使用比",
ROUND(F.USED_BYTES, 6) AS "空闲空间(G)",
F.MAX_BYTES AS "最大块(M)"
FROM (
SELECT TABLESPACE_NAME,
ROUND(SUM(BYTES) / (1024 * 1024 * 1024), 6) USED_BYTES,
ROUND(MAX(BYTES) / (1024 * 1024 * 1024), 6) MAX_BYTES
FROM SYS.DBA_FREE_SPACE
GROUP BY TABLESPACE_NAME) F,
(SELECT DD.TABLESPACE_NAME,
ROUND(SUM(DD.BYTES) / (1024 * 1024 * 1024), 6) AVAILB_BYTES,
ROUND(SUM(DECODE(DD.MAXBYTES, 0, DD.BYTES, DD.MAXBYTES))/(1024*1024*1024),6) MAX_BYTES
FROM SYS.DBA_DATA_FILES DD
GROUP BY DD.TABLESPACE_NAME) D
WHERE D.TABLESPACE_NAME = F.TABLESPACE_NAME
ORDER BY 4 DESC
7、查看数据库拥有的表空间:
SELECT * FROM DBA_TABLESPACES;
SELECT * FROM USER_TABLESPACES;
SELECT * FROM V$TABLESPACE;
8、查看表空间中的数据文件:
SELECT * FROM DBA_DATA_FILES;
SELECT * FROM DBA_TEMP_FILES;
SELECT * FROM V$TEMPFILE;
SELECT * FROM V$DATAFILE;
SELECT * FROM V$TEMPFILE;
9、查看用户拥有的表空间:
select tablespace_name from dba_tablespaces;
select tablespace_name from user_tablespaces;
六、Oracle创建表空间
1、基本语法:
Create [TEMPORARY] TABLESPACE tablespace_name
TEMPFILE|DATAFILE 'fileName.dbf'
size xx
[autoextend on|off]
[next xx]
解释:
tablespace_name : 为表空间名称
datafile : 用于设置物理文件名称
size : 用于设置表空间的初始大小
autoextend on : 用于设置自动增长,如果存储量超过初始大小,则开始自动扩容
next : 用于设置扩容的空间大小
2、实例:
create tablespace test_tablespace
datafile 'c:\test_tablespace.dbf'
size 100m
autoextend on
next 10m
七、Oracle修改表空间的状态
1、设置表空间的联机或脱机状态:
表空间的默认状态是联机状态,如果表空间是脱机状态,那么我们就不能够使用这个表空间了
ALTER TABLESPACE tablespace_name ONLINE|OFFLINE;
alter tablespace test_tablespace offline;
2、设置表空间的只读|可读写状态:
表空间默认为可读写的状态
注意:如果表空间状态中拥有可read,那么表空间就必须是联机状态。
ALTER TABLESPACE tablespace_name [read only][read write];
alter tablespace test_tablespace read only;
八、Oracle修改表空间的数据文件
1、增加表空间中的数据文件
ALTER TABLESPACE tablespace_name ADD DATAFILE'xx.dbf' SIZE xx;
alter tablespace test_tablespace add datafile 'test1_tablespace.dbf' size 10m;
注意:如果发现某个表空间存储空间不足时,可以为表空间添加新的数据文件,扩展表空间大小
2、调整数据文件的大小
ALTER DATABASE DATAFILE 'c:\test_tablespace.dbf' RESIZE 500M;
3、删除数据文件
注意:不能够删除表空间中的第一个数据文件,如果将第一个数据文件删除的话,相当于删除了整个表空间。
ALTER TABLESPACE tablespace_name DROP DATAFILE'filename.dbf';
alter tablespace test_tablespace drop datafile 'test1_tablespace.dbf';
九、Oracle删除表空间
DROP TABLESPAC tablespace_name [INCLUDING CONTENTS];
drop tablespace test_tablespace including contents;
注意:如果你希望在删除表空间的同时将表空间中的数据文件一同删除,需要加上[INCLUDING CONTENTS]