Oracle 数据库的表空间(Tablespace)是数据库逻辑存储结构的核心组成部分,用于管理数据文件(Data File)并组织数据库对象(如表、索引、LOB 等)。理解表空间的概念和作用,对于数据库的设计、性能优化和维护至关重要。
一、表空间的基本概念
表空间是 Oracle 数据库中逻辑存储的最高层级,它由一个或多个物理数据文件(.dbf 文件)组成,所有数据库对象(如表、索引、视图等)都存储在表空间中。
逻辑与物理的桥梁:表空间是逻辑概念,数据文件是物理存储文件,表空间通过关联数据文件将逻辑存储映射到物理磁盘。
隔离与管理:不同表空间可用于隔离不同类型的数据(如业务数据、索引、临时数据),便于单独管理(如备份、扩容、权限控制)。
二、表空间的类型
Oracle 根据功能和用途,将表空间分为以下几类:
1. 系统表空间(SYSTEM Tablespace)
作用:存储数据库的元数据(数据字典),包括表结构、用户信息、权限定义等核心系统数据。
特点:
数据库创建时自动生成,不可删除或重命名。
必须始终在线(ONLINE),否则数据库无法正常运行。
建议不要在其中存储用户数据,以免影响系统性能或增加备份风险。
2. 辅助系统表空间(SYSAUX Tablespace)
作用:作为 SYSTEM 表空间的辅助,存储部分系统组件(如 OEM、审计日志、统计信息等),减轻 SYSTEM 表空间的负载。
特点:
数据库创建时自动生成,是 SYSTEM 的 “减负工具”。
虽然重要,但部分情况下可离线(OFFLINE)维护。
3. 用户表空间(User Tablespace)
作用:存储用户创建的数据库对象(如表、索引、存储过程等),是业务数据的主要存储区域。
特点:
可由 DBA 手动创建,灵活指定数据文件路径、大小、增长方式。
示例:
CREATE TABLESPACE user_data DATAFILE '/u01/oradata/user_data01.dbf' SIZE 100M AUTOEXTEND ON;
4. 临时表空间(Temporary Tablespace)
作用:存储临时数据,如排序操作(ORDER BY)、聚合函数(GROUP BY)、临时表数据等,操作结束后数据自动释放。
特点:
数据不永久保存,不支持备份(因数据临时且可重建)。
可创建 “临时表空间组”(Temporary Tablespace Group),供多个用户共享,提高并发排序效率。
5. undo 表空间(Undo Tablespace)
作用:存储事务的回滚数据(Undo Data),用于事务回滚(ROLLBACK)、读一致性(Read Consistency)和闪回查询(Flashback Query)。
特点:
自动管理回滚段(Oracle 9i 后默认),无需手动配置。
若 undo 数据被覆盖,可能导致长事务回滚失败,需合理设置保留时间(
RETENTION)。
三、表空间的关键属性
数据文件(Data File)
表空间必须至少包含一个数据文件,可添加多个文件扩展容量。
数据文件一旦分配给表空间,无法直接删除(需先从表空间中移除)。
存储参数(Storage Parameters)
初始大小(SIZE):数据文件的初始容量(如 100M)。
自动扩展(AUTOEXTEND):当空间不足时,自动增长(如
AUTOEXTEND ON NEXT 10M MAXSIZE 500M)。块大小(Block Size):表空间的默认数据块大小(如 8KB),需与数据库兼容(创建数据库时指定)。
状态(Status)
ONLINE:表空间可用,用户可访问其中的数据。
OFFLINE:表空间暂时不可用(如维护时),但 SYSTEM 表空间除外。
READ ONLY:表空间只读,禁止写入操作(适用于归档数据)。
四、表空间的管理与维护
创建和管理表空间是管理数据库运维的核心工作之一,以下初始创建举例:
创建表空间
CREATE TABLESPACE sales_data
DATAFILE '/u01/oradata/sales01.dbf' SIZE 200M,
'/u02/oradata/sales02.dbf' SIZE 300M
AUTOEXTEND ON NEXT 50M MAXSIZE 1000M
DEFAULT STORAGE (INITIAL 10M NEXT 5M);以下是详细的操作指南,包含常见场景和最佳实践。
1. 创建永久表空间(存储用户数据)
-- 创建名为USERS_DATA的表空间,包含两个数据文件
CREATE TABLESPACE users_data
DATAFILE '/u01/oradata/users01.dbf' SIZE 200M AUTOEXTEND ON NEXT 50M MAXSIZE UNLIMITED,
'/u02/oradata/users02.dbf' SIZE 200M AUTOEXTEND ON NEXT 50M MAXSIZE 1G
LOGGING -- 记录重做日志(默认)
EXTENT MANAGEMENT LOCAL -- 本地管理表空间(推荐)
SEGMENT SPACE MANAGEMENT AUTO; -- 自动段空间管理关键参数说明:
DATAFILE:指定数据文件路径和初始大小AUTOEXTEND:自动扩展设置EXTENT MANAGEMENT LOCAL:本地管理(优于字典管理)SEGMENT SPACE MANAGEMENT AUTO:自动管理段空间(无需手动调整 PCTFREE 等参数)
2. 创建临时表空间(用于排序等临时操作)
CREATE TEMPORARY TABLESPACE temp_data
TEMPFILE '/u01/oradata/temp01.dbf' SIZE 100M AUTOEXTEND ON NEXT 20M MAXSIZE 500M
EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M; -- 统一区大小为1M3. 创建 UNDO 表空间(管理事务回滚信息)
CREATE UNDO TABLESPACE undo_tbs
DATAFILE '/u01/oradata/undo01.dbf' SIZE 300M AUTOEXTEND ON NEXT 50M
RETENTION GUARANTEE; -- 保证undo数据保留时间注意事项:
每个实例需一个活动的 UNDO 表空间
RETENTION GUARANTEE确保长查询不会因 undo 被覆盖而失败
管理表空间
1. 修改表空间属性
-- 使表空间只读(适用于历史数据归档)
ALTER TABLESPACE users_data READ ONLY;
-- 使表空间可读写
ALTER TABLESPACE users_data READ WRITE;
-- 脱机维护(SYSTEM表空间除外)
ALTER TABLESPACE users_data OFFLINE NORMAL; -- 需无活跃事务
-- 联机恢复
ALTER TABLESPACE users_data ONLINE;2. 扩展表空间
-- 添加新数据文件
ALTER TABLESPACE users_data
ADD DATAFILE '/u03/oradata/users03.dbf' SIZE 500M;
-- 增大现有数据文件
ALTER DATABASE DATAFILE '/u01/oradata/users01.dbf'
RESIZE 1G;
-- 修改自动扩展属性
ALTER DATABASE DATAFILE '/u01/oradata/users01.dbf'
AUTOEXTEND ON NEXT 100M MAXSIZE 2G;3. 删除表空间
-- 删除表空间(保留数据文件)
DROP TABLESPACE users_data;
-- 删除表空间及数据文件(危险操作!)
DROP TABLESPACE users_data INCLUDING CONTENTS AND DATAFILES;
-- 删除临时表空间
DROP TEMPORARY TABLESPACE temp_data INCLUDING CONTENTS AND DATAFILES;4. 重命名数据文件(需重启数据库)
-- 1. 脱机表空间
ALTER TABLESPACE users_data OFFLINE;
-- 2. 操作系统层面移动/重命名文件
mv /u01/oradata/users01.dbf /u02/oradata/users01_new.dbf
-- 3. 更新控制文件指向新路径
ALTER DATABASE RENAME FILE '/u01/oradata/users01.dbf'
TO '/u02/oradata/users01_new.dbf';
-- 4. 联机表空间
ALTER TABLESPACE users_data ONLINE;查询表空间信息
1. 查看所有表空间状态
SELECT tablespace_name, status, contents FROM dba_tablespaces;2. 检查表空间使用率
SELECT
t.tablespace_name,
ROUND(SUM(d.bytes)/1024/1024, 2) AS "总大小(MB)",
ROUND(SUM(f.bytes)/1024/1024, 2) AS "空闲(MB)",
ROUND((1 - SUM(f.bytes)/SUM(d.bytes))*100, 2) AS "使用率(%)"
FROM
dba_tablespaces t,
dba_data_files d,
dba_free_space f
WHERE
t.tablespace_name = d.tablespace_name
AND t.tablespace_name = f.tablespace_name
GROUP BY
t.tablespace_name;3. 查看临时表空间使用情况
SELECT
tablespace_name,
ROUND(SUM(bytes_used)/1024/1024, 2) AS "已用(MB)",
ROUND(SUM(bytes_free)/1024/1024, 2) AS "空闲(MB)"
FROM
v$temp_space_header
GROUP BY
tablespace_name;常见问题处理
1. 表空间不足
-- 紧急处理:临时增大数据文件
ALTER DATABASE DATAFILE '/u01/oradata/users01.dbf' RESIZE 2G;
-- 长期方案:添加新数据文件
ALTER TABLESPACE users_data ADD DATAFILE '/u03/oradata/users04.dbf' SIZE 1G;2. 临时表空间争用
-- 创建临时表空间组
CREATE TEMPORARY TABLESPACE temp_01 TEMPFILE '/u01/oradata/temp_01.dbf' SIZE 200M;
CREATE TEMPORARY TABLESPACE temp_02 TEMPFILE '/u02/oradata/temp_02.dbf' SIZE 200M;
-- 将两个临时表空间添加到组
ALTER TABLESPACE temp_01 ADD TEMPFILE '/u01/oradata/temp_01.dbf' TABLESPACE GROUP temp_group;
ALTER TABLESPACE temp_02 ADD TEMPFILE '/u02/oradata/temp_02.dbf' TABLESPACE GROUP temp_group;
-- 指定组为默认临时表空间
ALTER DATABASE DEFAULT TEMPORARY TABLESPACE temp_group;3. UNDO 表空间问题
-- 切换当前UNDO表空间
ALTER SYSTEM SET undo_tablespace = 'undo_tbs_new' SCOPE=BOTH;4.临时表空间优化
-- 为高负载用户指定专用临时表空间
ALTER USER scott TEMPORARY TABLESPACE temp_data;