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)。

三、表空间的关键属性

  1. 数据文件(Data File)

    • 表空间必须至少包含一个数据文件,可添加多个文件扩展容量。

    • 数据文件一旦分配给表空间,无法直接删除(需先从表空间中移除)。

  2. 存储参数(Storage Parameters)

    • 初始大小(SIZE):数据文件的初始容量(如 100M)。

    • 自动扩展(AUTOEXTEND):当空间不足时,自动增长(如AUTOEXTEND ON NEXT 10M MAXSIZE 500M)。

    • 块大小(Block Size):表空间的默认数据块大小(如 8KB),需与数据库兼容(创建数据库时指定)。

  3. 状态(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;  -- 统一区大小为1M

3. 创建 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;