目录
表空间是使用Oracle数据库必须具备的知识,在Oracle中创建数据库的同时就需要指定数据库建立的表空间。本章将介绍如何管理表空间以及如何管理数据文件等内容。本章包括以下知识点:
❑与表空间有关的概念以及表空间的分类
❑如何管理表空间
❑如何管理临时表空间
❑如何管理数据文件
一、表空间的相关概念
定义:
表空间是Oracle数据库的逻辑存储单元,用于组织数据文件。在Oracle中表空间和数据文件的概念经常是成对出现的,**每一个数据文件只对应一个表空间,一个表空间可以存放多个数据文件。**在创建表空间的同时必须创建数据文件,同理,如果要创建数据文件必须要指定表空间。
物理与逻辑关系:
数据库 -> 表空间(逻辑)-> 数据文件(物理)-> 操作系统块
类比理解:
表空间像"文件夹",数据文件像"文件"。
一个Oracle数据库是由一个或多个表空间组成的,在表空间中可以存储数据文件 。这些数据文件也不是任意格式的,也要按照Oracle运行的操作系统的物理结构**(表->段->区->块)**。数据文件中存放的就是要存放在数据库中的数据。在表空间中的逻辑存储单位是段(segment)。例如,我们为表创建一个索引,那么就会在这个段中又创建一个区,这个区就叫做区段(extent),也叫数据扩展,每一个区段只能存在于一个数据文件中。区段再进一步划分还有区块(block)。但是,一个文件在磁盘上存储一般都是不连续的,所以,在表空间中的段要由不同数据文件中的区段组成。块是Oracle数据库中最小的空间分配单位。Oracle中常见的块大小是2、4、8、16KB,Oracle默认的块大小为8KB。
-- 查看数据库块大小
select block_size,tablespace_name from dba_tablespaces where tablespace_name in ('SYSTEM','SYSAUX','USERS');

-- 通常Oracle默认块大小是8KB(8192字节)
-- 那么:
-- INCREMENT_BY = 6400 → 6400 × 8KB = 50MB
-- INCREMENT_BY = 1280 → 1280 × 8KB = 10MB
-- INCREMENT_BY = 1 → 1 × 8KB = 8KB
二、默认表空间
在Oracle 数据库存在6个默认表空间。查看默认表空间的方法主要有两种方式,一种是通过企业管理器直接查看;另一种是在数据字典中查看。下面分别用这两种方式查看默认表空间。
2.1.使用企业管理器查看默认表空间
2.1.1.查看所有的默认表空间

在Oracle 11g中默认的表空间有6个,分别是EXAMPLE、SYSAUX、SYSTEM、TEMP、UNDOTBS1、USERS。而在后续的版本中,Oracle官方已将EXAMPLE该表空间进行删减优化,故目前默认的表空间包括以下:
|----------|---------------------------------------|---------|
| 表空间名 | 用途 | 重要性 |
| SYSTEM | 存储数据字典、PL/SQL代码 | 核心,不可脱机 |
| SYSAUX | 作为EXAMPLE的辅助表空间,存储辅助系统数据 | 重要,但可脱机 |
| TEMP | 用来存储SYS用户的表、视图以及存储过程等数据库对象,临时表空间、排序操作 | 性能相关 |
| UNDOTBS1 | 用于存储撤销信息、撤销表空间,事务回滚 | 事务一致性 |
| USERS | 用户默认表空间 | 用户数据存储 |
| EXAMPLE | 用于安装Oracle 11g数据库使用示例数据库。 | 一般 |
2.1.2.查看指定用户的默认表空间
如果要查询当前登录的用户所使用的表空间,在页面上直接输入对象名即可以查看到。下面以sys开头的用户(除了sys还包括system、sysaux)为例查看该用户的默认表空间,如下图所示。

2.2.在SQL*Plus下查看登录用户的默认表空间
2.2.1.查看所有的默认表空间
使用SQL*Plus登录Oracle 19c数据库,在数据字典DBA_TABLESPACES中查看所有默认的表空间。查询结果如下图所示。
select tablespace_name,status,contents from dba_tablespaces; 
从上图所示的结果中可以看出,这和使用企业管理器查看默认表空间的结果是一致的。
2.2.2查看指定用户的默认表空间
如果要查看某一个用户的默认表空间,可以通过DBA_USERS数据字典进行查询。下面分别从DBA_USERS数据字典中查看SYS、SYSTEM、SYSAUX三个用户的默认表空间。查看结果
如图所示。
SQL> SET TIMING ON
SQL> COLUMN USERNAME format A30
SQL> select username,default_tablespace,temporary_tablespace from dba_users where username like 'SYS%';

可以看出,SYSTEM和SYS用户的默认表空间是SYSTEM。
说明:如果要在SQL*Plus中查看表空间的使用情况,可以使用数据字典dba_free_space查询;还可以从dba_data_files数据字典中查看表空间中数据文件的信息。
bash
SQL> select file_name from dba_data_files;
FILE_NAME
----------------------------------------------------------------------------------------------------------------------------------
/u01/app/oracle/oradata/orcl/system01.dbf
/u01/app/oracle/oradata/orcl/sysaux01.dbf
FILE_NAME
----------------------------------------------------------------------------------------------------------------------------------
/u01/app/oracle/oradata/orcl/undotbs01.dbf
/u01/app/oracle/oradata/orcl/users01.dbf
SQL> set pagesize 50
SQL> select file_name from dba_data_files;
FILE_NAME
----------------------------------------------------------------------------------------------------------------------------------
/u01/app/oracle/oradata/orcl/system01.dbf
/u01/app/oracle/oradata/orcl/sysaux01.dbf
/u01/app/oracle/oradata/orcl/undotbs01.dbf
/u01/app/oracle/oradata/orcl/users01.dbf
SQL> desc dba_free_space
Name Null? Type
----------------------------------------------------------------------- -------- ------------------------------------------------
TABLESPACE_NAME VARCHAR2(30)
FILE_ID NUMBER
BLOCK_ID NUMBER
BYTES NUMBER
BLOCKS NUMBER
RELATIVE_FNO NUMBER
SQL> set linesize 130
SQL> select * from dba_free_space;
TABLESPACE_NAME FILE_ID BLOCK_ID BYTES BLOCKS RELATIVE_FNO
------------------------------ ---------- ---------- ---------- ---------- ------------
SYSTEM 1 54128 65536 8 1
SYSTEM 1 54272 629145600 76800 1
SYSAUX 2 28088 589824 72 2
SYSAUX 2 28416 840957952 102656 2
UNDOTBS1 3 288 1048576 128 3
UNDOTBS1 3 424 393216 48 3
UNDOTBS1 3 480 327680 40 3
UNDOTBS1 3 528 917504 112 3
UNDOTBS1 3 1280 786432 96 3
UNDOTBS1 3 1688 131072 16 3
UNDOTBS1 3 1712 655360 80 3
UNDOTBS1 3 4096 3145728 384 3
UNDOTBS1 3 4736 2097152 256 3
UNDOTBS1 3 5248 1048576 128 3
UNDOTBS1 3 7168 2097152 256 3
UNDOTBS1 3 8448 2097152 256 3
UNDOTBS1 3 8832 1048576 128 3
UNDOTBS1 3 9088 1048576 128 3
UNDOTBS1 3 9984 1048576 128 3
UNDOTBS1 3 10240 2097152 256 3
UNDOTBS1 3 11008 1048576 128 3
UNDOTBS1 3 11392 2097152 256 3
UNDOTBS1 3 12032 1048576 128 3
UNDOTBS1 3 13184 1048576 128 3
UNDOTBS1 3 13696 1048576 128 3
UNDOTBS1 3 14592 1048576 128 3
UNDOTBS1 3 14976 1048576 128 3
UNDOTBS1 3 15232 3145728 384 3
UNDOTBS1 3 15872 1048576 128 3
UNDOTBS1 3 16384 1048576 128 3
UNDOTBS1 3 16768 2097152 256 3
UNDOTBS1 3 17280 2097152 256 3
UNDOTBS1 3 17792 2097152 256 3
UNDOTBS1 3 18176 1048576 128 3
UNDOTBS1 3 18560 1048576 128 3
UNDOTBS1 3 18816 3145728 384 3
UNDOTBS1 3 20096 1048576 128 3
UNDOTBS1 3 30720 285212672 34816 3
USERS 4 128 535822336 65408 4
39 rows selected.
SQL>
三、表空间的管理
表空间的管理无非就是对表空间进行创建、修改、删除等操作,通过下边的学习将学会如何创建表空间、建立大文件表空间、修改表空间的状态以及删除表空间的操作。
3.1.创建表空间
3.1.1.在SQL*Plus中创建表空间
虽然在企业管理器中创建表空间很简单,但是在实际工作中数据库管理员还是使用语句创建表空间的比较普遍。下面就讲解如何在SQL*Plus中使用语句创建表空间。
创建表空间的一般语法如下:
CREATE TABLESPACE tablespace_name
DATAFILE filename SIZE size
AUTOEXTEND\[ON/OFF\]\]NEXT size \[MAXSIZE size
PERMANENT\|TEMPORARY
EXTENT MANAGEMENT \[DICTIONARY\|LOCAL \[AUTOALLOCATE\|UNIFORM.\[SIZE integer\[K\|M\]\]\]\]
【语法说明】
1)TABLESPACE:指定要创建的表空间的名称。
2)DATAFILE:指定在表空间中存放数据文件的文件名,这里还要指出文件存放的路径。
3)SIZE:指定数据文件的大小。
4)AUTOEXTEND:指定数据文件的扩展方式,ON代表自动扩展,OFF代表非自动扩展。另外,如果要把数据文件指定为自动扩展,应该在NEXT后面指定具体的大小。
5)MAXSIZE:指定数据文件为自动扩展方式时的最大值。
6)PERMANENT|TEMPORARY:指定表空间的类型,PERMANENT是指永久表间;TEMPORARY是指临时表空间。在创建表空间时默认都是永久表空间。
7)SEGMENT SPACE MANAGEMENT AUTO / MANUAL:用于指定段空间管理方式为自动或手动管理。
8)EXTENT MANAGEMENT DICTIONARY / LOCAL:指定表空间的管理方式,DICTIONARY是指字典管理方式;LOCAL是指本地的管理方式。在创建表空间时默认的管理方式是本地的管理方式。
说明:使用本地表空间管理的方式可以减少数据字典表的争用现象,并且也不需要对空间进行回收。因此,Oracle推荐使用本地表空间管理的方式创建表空间。
【示例】使用语句创建表空间
-- 基本创建
CREATE TABLESPACE ts_app_data
DATAFILE '/u01/app/oracle/oradata/orcl/ts_app_data01.dbf'
SIZE 100M
AUTOEXTEND ON NEXT 10M MAXSIZE 2G
EXTENT MANAGEMENT LOCAL
SEGMENT SPACE MANAGEMENT AUTO;
-- 创建大文件表空间(单个大数据文件)
CREATE BIGFILE TABLESPACE ts_big_data
DATAFILE '/u01/oradata/ORCL/ts_big_data.dbf'
SIZE 32G;
-- 创建临时表空间
CREATE TEMPORARY TABLESPACE temp2
TEMPFILE '/u01/oradata/ORCL/temp2.dbf'
SIZE 500M;
说明:
ts_app_data:表示表空间的名称
datafile:表示表空间中的数据文件是ts_app_data01.dbf;
size:表示大小是100MB;
autoextend on next 10M maxsize 2G:表示表空间ts_app_data01是自动扩展的,并且设置扩展的最大值是2G;
extent management local:表示表空间的管理方式本地管理方式(Oracle推荐的方式);
segment space management auto:指定段空间管理方式为自动管理。
生产环境通常用这个:autoextend on next 500m maxsize unlimited;无限制
根据上面给出的创建表空间的语法,首先使用最简单的方式在SQL*Plus中创建一个表空间ts_app_data。


可以看到我们新创的表空间已经建立在表空间列表中。
3.2.重命名表空间
如果在创建好表空间后,需要重命名表空间也是非常容易的。
3.2.1.使用SQL*Plus重命名表空间
重命名表空间也可以使用语句在SQL*Plus中完成。具体语法如下:ALTER TABLESPACE oldname rename to newname;
但是,能够完成重命名的前提是要重命名的表空间已经存在,所以要在重命名之前查看数据字典中是否存在该表空间。
select tablespace_name,status,contents from dba_tablespaces;

示例:在SQL*Plus中重命名表空间
下面就把之前定义的TS_APP_DATA表空间重命名为TS_NEWS_DATA,如下图所示。
alter tablespace TS_APP_DATA rename to TS_NEWS_DATA;

**注意:**不是所有的表空间都可以重命名,SYSTEM和SYSAUX表空间就不能重命名;除此之外,当表空间处于OFFLINE状态时也不可以重命名。
3.3.查看表空间的使用率
直接可使用,无需进行修改
col tablespace_name for a20;
SELECT
tablespace_name as tablespace_name,
round((sum_alloc - nvl(sum_free,0))/1024/1024,1) as used_M,
round(sum_max/1024/1024,1) as total_M,
round((sum_max-(sum_alloc - nvl(sum_free,0)))/1024/1024,1) as free_M,
round(100*(sum_alloc - nvl(sum_free,0))/sum_max,1) As persent
FROM ( SELECT tablespace_name, sum(bytes) AS sum_alloc, sum(decode(maxbytes,0,bytes,maxbytes)) AS sum_max
FROM dba_data_files
GROUP BY tablespace_name),( SELECT tablespace_name AS fs_ts_name, sum(bytes) AS sum_free
FROM dba_free_space
GROUP BY tablespace_name )
WHERE tablespace_name = fs_ts_name(+)
order by persent desc;
3.3.扩容表空间(四种方法)
方法1:调整现有数据文件大小(最常用)
bash
-- 1.1 直接调整文件大小
ALTER DATABASE DATAFILE '/u01/app/oracle/oradata/orcl/users01.dbf'
RESIZE 2048M; -- 调整到2GB
-- 1.2 查看调整前后的对比
SELECT file_name, bytes/1024/1024 as size_mb_before
FROM dba_data_files
WHERE tablespace_name = 'USERS';
-- 执行调整
ALTER DATABASE DATAFILE '/u01/app/oracle/oradata/orcl/users01.dbf' RESIZE 4096M;
-- 查看调整后
SELECT file_name, bytes/1024/1024 as size_mb_after
FROM dba_data_files
WHERE tablespace_name = 'USERS';

方法2:启用/修改自动扩展(推荐)
bash
-- 2.1 启用自动扩展
ALTER DATABASE DATAFILE '/u01/app/oracle/oradata/orcl/users01.dbf'
AUTOEXTEND ON
NEXT 100M -- 每次自动扩展100MB
MAXSIZE 5G; -- 最大扩展到10GB
-- 2.2 修改已有自动扩展设置
ALTER DATABASE DATAFILE '/u01/app/oracle/oradata/orcl/users01.dbf'
AUTOEXTEND ON
NEXT 100M -- 增大每次扩展量
MAXSIZE 5G; -- 提高最大限制
-- 2.3-1 查看自动扩展状态
SELECT d.file_name,d.tablespace_name,d.autoextensible,d.increment_by,t.block_size,ROUND(d.increment_by * t.block_size / 1024, 2) as extend_size_kb,ROUND(d.increment_by * t.block_size / 1024 / 1024, 2) as extend_size_mb,ROUND(d.bytes / 1024 / 1024, 2) as current_size_mb,CASE WHEN d.maxbytes = 0 THEN 'UNLIMITED' ELSE TO_CHAR(ROUND(d.maxbytes / 1024 / 1024, 2)) || ' MB' END as max_size,d.status FROM dba_data_files d JOIN dba_tablespaces t ON d.tablespace_name = t.tablespace_name ORDER BY d.tablespace_name;

方法3:扩展表空间(添加数据文件)
基础语法
ALTER TABLESPACE tablespace 表空间名
ADD DATAFILE '文件路径/文件名.dbf'
SIZE 初始大小
AUTOEXTEND NEXT 扩展量 MAXSIZE 最大大小\];
完整参数说明
ALTER TABLESPACE tablespace_name
ADD DATAFILE 'file_path/filename.dbf'
SIZE integer [K | M | G] -- 初始大小
AUTOEXTEND {OFF \| ON}\] -- 是否自动扩展 \[NEXT integer \[K \| M \| G\]\] -- 每次扩展量 \[MAXSIZE {UNLIMITED \| integer \[K \| M \| G\]\] -- 最大限制 \[REUSE\]; -- 重用现有文件(慎用!)
示例1:添加固定大小的数据文件
bash
-- 添加一个1GB的数据文件
ALTER TABLESPACE TS_NEWS_DATA
ADD DATAFILE '/u01/app/oracle/oradata/orcl/ts_news_data02.dbf'
SIZE 1G;
-- 验证添加结果
SELECT
file_name,
tablespace_name,
ROUND(bytes/1024/1024, 2) as size_mb,
status
FROM dba_data_files
WHERE tablespace_name = 'TS_NEWS_DATA'
ORDER BY file_id;

示例2:添加带自动扩展的数据文件
bash
-- 添加一个初始500MB,可自动扩展到10GB的数据文件
ALTER TABLESPACE USERS
ADD DATAFILE '/u01/app/oracle/oradata/orcl/users03.dbf'
SIZE 500M
AUTOEXTEND ON
NEXT 100M -- 每次扩展100MB
MAXSIZE 10G; -- 最大10GB
-- 查看自动扩展配置
SELECT
file_name,
autoextensible,
increment_by,
ROUND(bytes/1024/1024, 2) as current_mb,
ROUND(maxbytes/1024/1024, 2) as max_mb
FROM dba_data_files
WHERE tablespace_name = 'USERS';
示例3:批量添加多个数据文件
bash
-- 一次添加多个数据文件(Oracle 10g+)
ALTER TABLESPACE USERS
ADD DATAFILE
'/u01/app/oracle/oradata/orcl/users04.dbf' SIZE 1G,
'/u02/app/oracle/oradata/orcl/users05.dbf' SIZE 1G,
'/u03/app/oracle/oradata/orcl/users06.dbf' SIZE 1G;
-- 或者逐个添加
ALTER TABLESPACE USERS ADD DATAFILE '/path/users07.dbf' SIZE 500M;
ALTER TABLESPACE USERS ADD DATAFILE '/path/users08.dbf' SIZE 500M;
ALTER TABLESPACE USERS ADD DATAFILE '/path/users09.dbf' SIZE 500M;
方法4:添加新的数据文件(分布式存储)
bash
-- 3.1 添加新数据文件到已有表空间
ALTER TABLESPACE users
ADD DATAFILE '/u01/app/oracle/oradata/orcl/users02.dbf'
SIZE 2G -- 初始大小2GB
AUTOEXTEND ON
NEXT 100M
MAXSIZE 10G;
-- 3.2 指定不同磁盘路径(I/O负载均衡)
ALTER TABLESPACE users
ADD DATAFILE '/u02/app/oracle/oradata/orcl/users03.dbf' SIZE 1G;
ALTER TABLESPACE users
ADD DATAFILE '/u03/app/oracle/oradata/orcl/users04.dbf' SIZE 1G;
-- 3.3 添加大文件表空间的数据文件
-- 如果是BIGFILE表空间,只能有一个数据文件,但可以很大
ALTER TABLESPACE big_ts
RESIZE 32T; -- 直接调整大文件表空间
方法5:临时表空间扩容
bash
-- 4.1 查看临时表空间使用情况
SELECT
tablespace_name,
total_blocks * block_size/1024/1024 as total_mb,
used_blocks * block_size/1024/1024 as used_mb,
free_blocks * block_size/1024/1024 as free_mb
FROM v$temp_space_header;
-- 4.2 扩容临时表空间
-- 方法A:调整临时文件大小
ALTER DATABASE TEMPFILE '/app/oracle/oradata/orcl/temp01.dbf'
RESIZE 4096M;
-- 方法B:添加临时文件
ALTER TABLESPACE temp
ADD TEMPFILE '/app/oracle/oradata/orcl/temp02.dbf'
SIZE 2G
AUTOEXTEND ON
NEXT 100M
MAXSIZE 10G;
-- 4.3 创建新的临时表空间并切换
CREATE TEMPORARY TABLESPACE temp2
TEMPFILE '/app/oracle/oradata/orcl/temp2.dbf' SIZE 4G;
-- 将用户切换到新临时表空间
ALTER USER hr TEMPORARY TABLESPACE temp2;
3.4.设置表空间的可用状态
表空间的可用状态是指表空间的联机和脱机状态,如果把表空间设置成联机状态,那么表示表空间就可以被用户操作,反之设置成脱机状态,表空间就是不可用的。
语法:
ALTER TABLESPACE tablespace{ONLINE|OFFLINE[NORMAL|TEMPORARY|IMMEDIATE]}
说明:
1)ONLINE:设置表空间为联机状态,即可用状态。
2)OFFLINE:设置表空间为脱机状态,即不可用状态。这里还包括3种方式,NORMAL指的是正常状态;TEMPORARY指的是临时状态;IMMEDIATE指的是立即状态。
示例:
-- 将表空间设为非在线
ALTER TABLESPACE 表空间名称 OFFLINE;
-- 重新上线
ALTER TABLESPACE 表空间名称 ONLINE;
在线和非在线表空间的区别:
|------------|------------------------------------------------------------------------------------------------------------------|
| 表空间的类型 | 说明 |
| 在线表空间 | * 数据库用户可以正常访问和操作该表空间中的数据,所有SQL语句(如SELECT、INSERT、UPDATE等)均可执行。 * 表空间处于活跃状态,数据文件保持打开,确保事务的实时读写。 * 适用于生产环境,保证业务连续性。 |
| 非在线表空间 | * 数据库用户无法访问表空间中的数据,尝试操作时会返回错误。 * 数据文件被关闭,仅允许管理员执行维护操作(如备份、恢复或移动文件)。 * 通常用于维护场景,例如数据归档、灾难恢复或性能优化。 |

注意:这里没有不能直接直观的看出到底是ONLINE还是OFFLINE,这个还需通过直接操作数据库来判断,就很奇怪。
3.5.设置表空间的读写状态
表空间在创建时如果不指定状态,默认是读写状态,除了读写状态之外,还有只读状态。通过SQL*Plus设置表空间的读写状态。
设置表空间的读写状态的语法比较简单。具体语法如下:
ALTER TABLESPACE tablespace READ{ONLY|WRITE};
其中,READ ONLY是把表空间设置为只读状态;READ WRITE是把表空间设置为读写状态。
查看表空间当前的读写状态:
SELECT tablespace_name, status FROM dba_tablespaces;

在SQL*Plus中设置表空间状态为只读:
下面把表空间TS_NEWS_DATA状态更改为只读状态,如下图所示:
alter tablespace TS_NEWS_DATA READ ONLY;


至此,TS_NEWS_DATA表空间的状态就更改成了只读状态。注意,此时表空间处于离线状态,如需要使用,需要先将其联机。也就是前面3.4章节提到的内容。
如果要把表空间TS_NEWS_DATA的状态更改成读写状态,则语句如下:
alter tablespace TS_NEWS_DATA READ WRITE;

3.6.建立大文件表空间
建立大文件的表空间与前面提到过的创建表空间有些类似,大文件表空间是在正常表空间不够用的情况下才需要创建的。
3.6.1.使用SQL*Plus创建大文件表空间
在SQL*Plus中创建大文件表空间与创建普通表空间的语法非常相似。定义大文件表空间的,语法如下:
CREATE BIGFILE TABLESPACE tablespace DATAFILE filename SIZE size
示例:
create bigfile tablespace ts_bigfile_data datafile 'bigfiledata.dbf' size 2G;
使用上面的语法创建一个名字为TS_BIGFILE_DATA的大文件表空间,如下图所示:

这里,创建的表空间中的数据文件"bigfiletest.dbf"的大小是2GB,其实创建的大文件的表空间不仅限于2GB的大小,它最大可以是128TB。因此,可以说大文件表空间是存储大数据文件同时也是扩展表空间存储的好方式。
3.7.删除表空间
表空间的管理可以使用本地管理的方式,也可以使用数据字典的方式,在删除表空间时由于管理的方式不同,那么删除的速度也会受到影响。据研究,经大量的试验可以发现,使用本地方式管理的表空间在删除时速度更快一些。因此,要删除表空间时可以考虑把表空间的管理方式修改成本地方式管理后再删除
3.7.1.在SQL*Plus中使用语句删除表空间
使用语句删除表空间,也可以选择把表空间中的数据文件一并删除。删除表空间的语法如下:
DROP TABLESPACE tablespace_name [INCLUDING CONTENTS][CASCADE CONSTRAINTS]
说明:
1)[INCLUDING CONTENTS]:如果在删除表空间时要把表空间中的数据文件也删除,可以在删除的表空间语句后面加上该语句。
2)[CASCADE CONSTRAINTS]:如果在删除表空间时要把表空间中的完整性也删除,可以在删除的表空间语句后面加上该语句。
示例:在SQL*Plus中删除表空间
下面就以删除表空间TS_BIGFILE_DATA,并且删除表空间中的数据文件为例说明,在SQL*Plus中执行结果如下图所示。
drop tablespace TS_BIGFILE_DATA including contents;


四、临时表空间的管理
在Oracle 数据库中除了上面讲述的表空间外,还有临时表空间,临时表空间主要是用来保存临时的数据信息的。
4.1.建立临时表空间
临时表空间一般是指在数据库中存储数据,当内存不够时写入的空间,这个空间并不像一般的表空间,当执行完对数据库的操作后,该空间的内容自动清空。临时表空间经常会在使用一些操作时使用,如连接没有索引的两个表,查询数据时都会用到。
4.1.1.使用SQL*Plus创建临时表空间
只要掌握了前面的创建一般表空间的语法,学习创建临时表空间的语法还是比较容易的。创建临时表空间的语法如下:
CREATE TEMPORARY TABLESPACE temp_tablespace_name
TEMPFILE 'path_to_tempfile.dbf'
SIZE size_in_MB
AUTOEXTEND ON NEXT next_size_in_MB MAXSIZE max_size_in_MB
EXTENT MANAGEMENT LOCAL UNIFORM SIZE uniform_size_in_MB;
参数说明:
1)temp_tablespace_name:临时表空间的名称,需符合Oracle命名规则。
2)path_to_tempfile.dbf:临时文件的物理路径和文件名。
3)size_in_MB:临时文件的初始大小,单位为MB。
4)AUTOEXTEND ON:启用自动扩展功能。
5)next_size_in_MB:每次自动扩展的大小,单位为MB。
6)max_size_in_MB:临时文件的最大大小,单位为MB。
7)EXTENT MANAGEMENT LOCAL:指定使用本地管理方式。
8)UNIFORM SIZE uniform_size_in_MB:指定统一的区大小,单位为MB。
示例:在SQL*Plus中创建临时表空间temptable,下面使用上面的语句创建一个名为temptable的临时表空间。
CREATE TEMPORARY TABLESPCE news_temp_tablespace TEMPFILE '/u01/app/oracle/oradata/orcl/news_temp_tablespace.dbf' SIZE 10M;

下面把上面创建的临时表空间temptable设置成默认的临时表空间。具体操作如图16.26所
示。
设置临时表空间为默认表空间的语法如下:
ALTER DATABASE DEFAULT TEMPORARY TABLESPACE news_temp_tablespace;
bash
SQL> create temporary tablespace news_temp_tablespace tempfile '/u01/app/oracle/oradata/orcl/news_temp_tablespace.dbf' size 10M;
SQL>
SQL> select tablespace_name from dba_temp_files;
TABLESPACE_NAME
--------------------
NEWS_TEMP_TABLESPACE
TEMP
SQL> SELECT USERNAME,DEFAULT_TABLESPACE,TEMPORARY_TABLESPACE FROM DBA_USERS;
USERNAME DEFAULT_TABLESPACE TEMPORARY_TABLESPACE
------------------------------ ---------------------------------------- ----------------------------------------
SYS SYSTEM TEMP
SYSTEM SYSTEM TEMP
XS$NULL SYSTEM TEMP
SYSBACKUP SYSTEM TEMP
SYSRAC SYSTEM TEMP
SYSKM SYSTEM TEMP
OUTLN SYSTEM TEMP
SYS$UMF SYSTEM TEMP
SYSDG SYSTEM TEMP
DBSNMP SYSAUX TEMP
APPQOSSYS SYSAUX TEMP
USERNAME DEFAULT_TABLESPACE TEMPORARY_TABLESPACE
------------------------------ ---------------------------------------- ----------------------------------------
DBSFWUSER SYSAUX TEMP
GGSYS SYSAUX TEMP
ANONYMOUS SYSAUX TEMP
GSMADMIN_INTERNAL SYSAUX TEMP
XDB SYSAUX TEMP
GSMCATUSER USERS TEMP
REMOTE_SCHEDULER_AGENT USERS TEMP
AUDSYS USERS TEMP
DIP USERS TEMP
ORACLE_OCM USERS TEMP
GSMUSER USERS TEMP
SQL>
SQL> ALTER DATABASE DEFAULT TEMPORARY TABLESPACE news_temp_tablespace;
SQL> SELECT USERNAME,DEFAULT_TABLESPACE,TEMPORARY_TABLESPACE FROM DBA_USERS;
USERNAME DEFAULT_TABLESPACE TEMPORARY_TABLESPACE
------------------------------ ---------------------------------------- ----------------------------------------
SYS SYSTEM NEWS_TEMP_TABLESPACE
SYSTEM SYSTEM NEWS_TEMP_TABLESPACE
XS$NULL SYSTEM NEWS_TEMP_TABLESPACE
SYSBACKUP SYSTEM NEWS_TEMP_TABLESPACE
SYSRAC SYSTEM NEWS_TEMP_TABLESPACE
SYSKM SYSTEM NEWS_TEMP_TABLESPACE
OUTLN SYSTEM NEWS_TEMP_TABLESPACE
SYS$UMF SYSTEM NEWS_TEMP_TABLESPACE
SYSDG SYSTEM NEWS_TEMP_TABLESPACE
DBSNMP SYSAUX NEWS_TEMP_TABLESPACE
APPQOSSYS SYSAUX NEWS_TEMP_TABLESPACE
USERNAME DEFAULT_TABLESPACE TEMPORARY_TABLESPACE
------------------------------ ---------------------------------------- ----------------------------------------
DBSFWUSER SYSAUX NEWS_TEMP_TABLESPACE
GGSYS SYSAUX NEWS_TEMP_TABLESPACE
ANONYMOUS SYSAUX NEWS_TEMP_TABLESPACE
GSMADMIN_INTERNAL SYSAUX NEWS_TEMP_TABLESPACE
XDB SYSAUX NEWS_TEMP_TABLESPACE
GSMCATUSER USERS NEWS_TEMP_TABLESPACE
REMOTE_SCHEDULER_AGENT USERS NEWS_TEMP_TABLESPACE
AUDSYS USERS NEWS_TEMP_TABLESPACE
DIP USERS NEWS_TEMP_TABLESPACE
ORACLE_OCM USERS NEWS_TEMP_TABLESPACE
GSMUSER USERS NEWS_TEMP_TABLESPACE
SQL> ALTER DATABASE DEFAULT TEMPORARY TABLESPACE TEMP;
SQL> SELECT USERNAME,DEFAULT_TABLESPACE,TEMPORARY_TABLESPACE FROM DBA_USERS;
USERNAME DEFAULT_TABLESPACE TEMPORARY_TABLESPACE
------------------------------ ---------------------------------------- ----------------------------------------
SYS SYSTEM TEMP
SYSTEM SYSTEM TEMP
XS$NULL SYSTEM TEMP
SYSBACKUP SYSTEM TEMP
SYSRAC SYSTEM TEMP
SYSKM SYSTEM TEMP
OUTLN SYSTEM TEMP
SYS$UMF SYSTEM TEMP
SYSDG SYSTEM TEMP
DBSNMP SYSAUX TEMP
APPQOSSYS SYSAUX TEMP
USERNAME DEFAULT_TABLESPACE TEMPORARY_TABLESPACE
------------------------------ ---------------------------------------- ----------------------------------------
DBSFWUSER SYSAUX TEMP
GGSYS SYSAUX TEMP
ANONYMOUS SYSAUX TEMP
GSMADMIN_INTERNAL SYSAUX TEMP
XDB SYSAUX TEMP
GSMCATUSER USERS TEMP
REMOTE_SCHEDULER_AGENT USERS TEMP
AUDSYS USERS TEMP
DIP USERS TEMP
ORACLE_OCM USERS TEMP
GSMUSER USERS TEMP
SQL>
4.2.查询临时表空间
如何查看Oracle 数据库中都存在哪些临时表空间。其实上边的示例中已经进行体现了。
语法:select tablespace_name from dba_temp_files;
说明:如果要查询临时表空间中用户的信息也可以在数据字典DBA_USERS中查看。查看
DBA_USERS数据字典时可以先使用DESC DBA_USERS语句得到字典中存在的字段信息,然后
再使用SELECT语句把需要的信息查询出来。
4.3.创建临时表空间组
临时表空间组是由多个临时表空间组成的,每一个临时表空间组至少要有一个临时表空间存在,并且临时表空间组的名称也不能和其他表空间重名。
4.3.1.在SQL*Plus中创建临时表空间组
临时表空间组的创建实际上就是为表空间设置一个组,所以创建临时表空间组的语法和创建临时表空间的语法类似。在创建临时表空间时可以有两种方法,一种是在创建临时表空间组的同时也创建临时表空间;另一种是在创建临时表空间组时把已经存在的临时表空间移动到该临时表空间。
(1)创建新的临时表空间存入临时表空间组中
创建新的临时表空间存入临时表空间组中,这种创建方式与创建临时表空间的语法非常类似。具体语法如下:
CREATE TEMPORARY TABLESPACE tablespace_name
TEMPFILE filename SIZE size TABLESPACE GROUP group_name;
示例:在SQL*Plus中新建临时表空间添加到临时表空间组
CREATE TEMPORARY TABLESPACE test_temporaty_tablespace TEMPFILE '/u01/app/oracle/oradata/orcl/test_temporaty_tablespace.dbf' SIZE 10M TABLESPACE GROUP group_test;
注意:名称不能过长,否则会报错
ERROR at line 1:
ORA-12899: value too large for column "SYS"."TS$"."NAME" (actual: 31, maximum: 30)

(2)把原来的临时表空间移到新创建的临时表空间组中
使用把原来的临时表空间移到新创建的临时表空间组中这种方式创建临时表空间组的前提是,已经存在要移动的临时表空间。具体语法如下:
ALTER TABLESPACE tablespace_name TABLESPACE GROUP group_name;
示例:在SQL*Plus中创建表空间组并加入临时表空间group_test
下面把前面创建的临时表空间news_temp_tablespace转移到group_test中。具体操作如下图所示。
alter tablespace news_temp_tablespace tablespace group group_test;

4.4.查询临时表空间组
临时表空间组创建完成后,如果想要查看临时表空间组中存放的表空间信息或者在当前数据库中存在的所有临时表空间组信息。
4.4.1.使用SQL*Plus查询临时表空间组的信息
临时表空间组的信息存放在数据字典DBA_TABLESPACE_GROUPS中。
示例:查询临时表空间组信息
查询DBA_TABLESPACE_GROUPS即可查看到临时表空间组的信息,具体操作如下图所示。

查询数据字典后,就列出了数据库中的临时表空间组的名称以及临时表空间组存在的临时表空间名称。
4.5.删除临时表空间组
如果删除数据库中多余的临时表空间组,不需要先把临时表空间组中的临时表空间移除,只要删除临时表空间组中的所有临时表空间同时就会把临时表空间组删除掉。
语法如下:
DROP TABLESPACE tablespace_name INCLUDING CONTENTS AND DATAFILES
示例:将前面创建的group_test临时表空间组中的成员进行删除
bash
SQL> select tablespace_name from dba_temp_files;
TABLESPACE_NAME
--------------------
NEWS_TEMP_TABLESPACE
TEMP
TEST_TEMPORARY_TABLE
SPACE
SQL> set linesize 130
SQL> select tablespace_name from dba_temp_files;
TABLESPACE_NAME
--------------------
NEWS_TEMP_TABLESPACE
TEMP
TEST_TEMPORARY_TABLE
SPACE
SQL> select * from dba_tablespace_groups;
GROUP_NAME TABLESPACE_NAME
------------------------------ --------------------
GROUP_TEST NEWS_TEMP_TABLESPACE
GROUP_TEST_TEMPORARY TEST_TEMPORARY_TABLE
SPACE
SQL> SELECT tablespace_name, contents, logging FROM dba_tablespaces WHERE tablespace_name = 'GROUP_TEST_TEMPORARY';
SQL> select * from dba_tablespace_groups;
GROUP_NAME TABLESPACE_NAME
------------------------------ ------------------------------
GROUP_TEST NEWS_TEMP_TABLESPACE
GROUP_TEST_TEMPORARY TEST_TEMPORARY_TABLESPACE
SQL> select tablespace_name from dba_temp_files;
TABLESPACE_NAME
------------------------------
NEWS_TEMP_TABLESPACE
TEMP
TEST_TEMPORARY_TABLESPACE
SQL> select tablespace_name,contents,logging from dba_tablespaces;
TABLESPACE_NAME CONTENTS LOGGING
------------------------------ --------------------- ---------
SYSTEM PERMANENT LOGGING
SYSAUX PERMANENT LOGGING
UNDOTBS1 UNDO LOGGING
TEMP TEMPORARY NOLOGGING
USERS PERMANENT LOGGING
TS_NEWS_DATA PERMANENT LOGGING
NEWS_TEMP_TABLESPACE TEMPORARY NOLOGGING
TEST_TEMPORARY_TABLESPACE TEMPORARY NOLOGGING
SQL> drop tablespace NEWS_TEMP_TABLESPACE including contents and datafiles;
SQL> drop tablespace TEST_TEMPORARY_TABLESPACE including contents and datafiles;
SQL> select tablespace_name,contents,logging from dba_tablespaces;
TABLESPACE_NAME CONTENTS LOGGING
------------------------------ --------------------- ---------
SYSTEM PERMANENT LOGGING
SYSAUX PERMANENT LOGGING
UNDOTBS1 UNDO LOGGING
TEMP TEMPORARY NOLOGGING
USERS PERMANENT LOGGING
TS_NEWS_DATA PERMANENT LOGGING
SQL> select tablespace_name from dba_temp_files;
TABLESPACE_NAME
------------------------------
TEMP
SQL> select * from dba_tablespace_groups;
SQL>

五、数据文件管理
前面已经学习了如何创建和管理表空间,在创建和管理表空间时都会用到数据文件。
5.1.重命名数据文件
在创建表空间时数据文件就已经创建好了,如果想把当前表空间中的数据文件进行重命名,可以通过SQL*Plus中通过写语句来完成。基本步骤如下:
-- 步骤1:将表空间设为只读(防止新数据写入)
ALTER TABLESPACE USERS READ ONLY;
-- 步骤2:等待当前事务完成,然后脱机
ALTER TABLESPACE USERS OFFLINE NORMAL;
-- 如果NORMAL方式等待太久,可以使用IMMEDIATE(强制)
-- ALTER TABLESPACE USERS OFFLINE IMMEDIATE;
-- 步骤3:在操作系统层面重命名文件
-- 打开另一个终端(Linux/Unix):
-- mv /u01/app/oracle/oradata/orcl/ts_app_data02.dbf /u01/app/oracle/oradata/orcl/users_data02.dbf.dbf
-- 步骤4:在数据库中更新文件路径
ALTER TABLESPACE USERS RENAME DATAFILE
'/u01/app/oracle/oradata/orcl/ts_app_data02.dbf' TO '/u01/app/oracle/oradata/orcl/users_data02.dbf';
-- 步骤5:将表空间联机
ALTER TABLESPACE USERS ONLINE;
-- 步骤6:恢复读写模式
ALTER TABLESPACE USERS READ WRITE;
示例:将表空间users里边的数据文件ts_app_data02重命名为users_data02.dbf

bash
SQL> ALTER TABLESPACE USERS READ ONLY;
SQL> ALTER TABLESPACE USERS OFFLINE NORMAL;
SQL> SELECT file_id, file_name, tablespace_name, status FROM dba_data_files WHERE file_id = 6;
FILE_ID
----------
FILE_NAME
----------------------------------------------------------------------------------------------------------------------------------
TABLESPACE_NAME STATUS
------------------------------ ---------
6
/u01/app/oracle/oradata/orcl/ts_app_data02.dbf
USERS AVAILABLE
SQL> ALTER TABLESPACE USERS OFFLINE IMMEDIATE;
SQL> select tablespace_name,status from dba_tablespaces;
TABLESPACE_NAME STATUS
------------------------------ ---------
SYSTEM ONLINE
SYSAUX ONLINE
UNDOTBS1 ONLINE
TEMP ONLINE
USERS READ ONLY
TS_NEWS_DATA OFFLINE
SQL> ALTER TABLESPACE USERS RENAME DATAFILE '/u01/app/oracle/oradata/orcl/ts_app_data02.dbf' TO '/u01/app/oracle/oradata/orcl/users_data02.dbf';
SQL> ALTER TABLESPACE USERS ONLINE;
SQL> ALTER TABLESPACE USERS READ WRITE;
SQL> select tablespace_name,status from dba_tablespaces;
TABLESPACE_NAME STATUS
------------------------------ ---------
SYSTEM ONLINE
SYSAUX ONLINE
UNDOTBS1 ONLINE
TEMP ONLINE
USERS ONLINE
TS_NEWS_DATA OFFLINE
SQL>

5.2.删除数据文件
在使用数据文件时经常会去除一些没有用的数据文件,但是删除数据文件也有前提条件。当数据文件处于以下3种情况时它是不能够被删除的:
1)数据文件中存在数据;
2)数据文件是表空间中唯一或第一个的数据文件;
3)数据文件或数据文件所在的表空间处于只读状态。
5.2.1.使用SQL*Plus删除数据文件
在SQL*Plus中删除数据文件的基本语法如下:
ALTER TABLESPACE tablespace_name DROP DATAFILE 'filename';
示例:删除表空间TS_NEWS_DATA其中的ts_news_data02.dbf文件

ALTER TABLESPACE TS_NEWS_DATA DROP DATAFILE '/u01/app/oracle/oradata/orcl/ts_news_data02.dbf';
bash
SQL> select file_name,tablespace_name,online_status from dba_data_files where tablespace_name = 'USERS';
FILE_NAME
----------------------------------------------------------------------------------------------------------------------------------
TABLESPACE_NAME ONLINE_
------------------------------ -------
/u01/app/oracle/oradata/orcl/users01.dbf
USERS ONLINE
/u01/app/oracle/oradata/orcl/users_data02.dbf
USERS ONLINE
SQL> select file_name,tablespace_name,online_status from dba_data_files where tablespace_name = 'TS_NEWS_DATA';
FILE_NAME
----------------------------------------------------------------------------------------------------------------------------------
TABLESPACE_NAME ONLINE_
------------------------------ -------
/u01/app/oracle/oradata/orcl/ts_app_data01.dbf
TS_NEWS_DATA ONLINE
/u01/app/oracle/oradata/orcl/ts_news_data02.dbf
TS_NEWS_DATA ONLINE
SQL> alter tablespace TS_NEWS_DATA drop datafile '/u01/app/oracle/oradata/orcl/ts_news_data02.dbf';
SQL> select file_name,tablespace_name,online_status from dba_data_files where tablespace_name = 'TS_NEWS_DATA';
FILE_NAME
----------------------------------------------------------------------------------------------------------------------------------
TABLESPACE_NAME ONLINE_
------------------------------ -------
/u01/app/oracle/oradata/orcl/ts_app_data01.dbf
TS_NEWS_DATA ONLINE
SQL>
