Oracle表空间管理 #

一、表空间概述 #

1.1 什么是表空间 #

表空间(Tablespace)是Oracle数据库中最大的逻辑存储结构,是数据库的逻辑容器。一个Oracle数据库由多个表空间组成,每个表空间由一个或多个数据文件组成。

text
Oracle存储结构
├── 逻辑结构
│   ├── 表空间(Tablespace)
│   │   ├── 段(Segment)
│   │   │   ├── 区(Extent)
│   │   │   │   └── 块(Block)
│   │   │   └── ...
│   │   └── ...
│   └── ...
└── 物理结构
    └── 数据文件(Data File)

1.2 表空间类型 #

text
表空间类型
├── 系统表空间
│   ├── SYSTEM - 存储数据字典
│   └── SYSAUX - 辅助系统表空间
├── 用户表空间
│   ├── USERS - 默认用户表空间
│   ├── EXAMPLE - 示例表空间
│   └── 自定义用户表空间
├── 临时表空间
│   ├── TEMP - 默认临时表空间
│   └── 自定义临时表空间
├── 撤销表空间
│   ├── UNDOTBS1 - 默认撤销表空间
│   └── 自定义撤销表空间
└── 特殊表空间
    ├── UNDO - 撤销数据
    └── TEMP - 临时数据

1.3 默认表空间 #

sql
-- 查看数据库中的表空间
SELECT 
    TABLESPACE_NAME,
    CONTENTS,
    STATUS,
    BIGFILE
FROM DBA_TABLESPACES;

-- 查看表空间使用情况
SELECT 
    TABLESPACE_NAME,
    ROUND(SUM(BYTES)/1024/1024, 2) AS SIZE_MB,
    ROUND(SUM(MAXBYTES)/1024/1024, 2) AS MAX_SIZE_MB,
    ROUND((SUM(BYTES) - SUM(FREE_BYTES))/1024/1024, 2) AS USED_MB
FROM (
    SELECT 
        TABLESPACE_NAME,
        BYTES,
        MAXBYTES,
        0 AS FREE_BYTES
    FROM DBA_DATA_FILES
    UNION ALL
    SELECT 
        TABLESPACE_NAME,
        0,
        0,
        BYTES
    FROM DBA_FREE_SPACE
)
GROUP BY TABLESPACE_NAME;

二、创建表空间 #

2.1 基本语法 #

sql
-- 创建表空间基本语法
CREATE TABLESPACE tablespace_name
DATAFILE 'path/to/datafile.dbf' SIZE size
[AUTOEXTEND ON|OFF] [NEXT size] [MAXSIZE size]
[EXTENT MANAGEMENT LOCAL|DICTIONARY]
[SEGMENT SPACE MANAGEMENT AUTO|MANUAL]
[LOGGING|NOLOGGING];

2.2 创建普通表空间 #

sql
-- 创建简单表空间
CREATE TABLESPACE users_data
DATAFILE '/u01/app/oracle/oradata/orcl/users_data01.dbf' 
SIZE 100M;

-- 创建自动扩展表空间
CREATE TABLESPACE users_data
DATAFILE '/u01/app/oracle/oradata/orcl/users_data01.dbf' 
SIZE 100M
AUTOEXTEND ON
NEXT 10M
MAXSIZE 500M;

-- 创建多数据文件表空间
CREATE TABLESPACE users_data
DATAFILE 
    '/u01/app/oracle/oradata/orcl/users_data01.dbf' SIZE 100M,
    '/u01/app/oracle/oradata/orcl/users_data02.dbf' SIZE 100M
AUTOEXTEND ON NEXT 10M MAXSIZE UNLIMITED;

2.3 创建大文件表空间 #

sql
-- 创建大文件表空间(Bigfile Tablespace)
-- 大文件表空间只能有一个数据文件,最大可达32TB

CREATE BIGFILE TABLESPACE big_data
DATAFILE '/u01/app/oracle/oradata/orcl/big_data01.dbf' 
SIZE 1G
AUTOEXTEND ON NEXT 100M MAXSIZE 32T;

-- 大文件表空间优点
-- 1. 简化管理(只有一个数据文件)
-- 2. 支持更大的存储容量
-- 3. 减少数据文件数量

2.4 创建临时表空间 #

sql
-- 创建临时表空间
CREATE TEMPORARY TABLESPACE temp_data
TEMPFILE '/u01/app/oracle/oradata/orcl/temp_data01.dbf' 
SIZE 100M
AUTOEXTEND ON NEXT 10M MAXSIZE 500M;

-- 创建临时表空间组
CREATE TEMPORARY TABLESPACE temp_group1
TEMPFILE '/u01/app/oracle/oradata/orcl/temp_group1.dbf' 
SIZE 50M
TABLESPACE GROUP temp_group;

CREATE TEMPORARY TABLESPACE temp_group2
TEMPFILE '/u01/app/oracle/oradata/orcl/temp_group2.dbf' 
SIZE 50M
TABLESPACE GROUP temp_group;

-- 指定默认临时表空间
ALTER DATABASE DEFAULT TEMPORARY TABLESPACE temp_data;

2.5 创建撤销表空间 #

sql
-- 创建撤销表空间
CREATE UNDO TABLESPACE undotbs2
DATAFILE '/u01/app/oracle/oradata/orcl/undotbs2.dbf' 
SIZE 200M
AUTOEXTEND ON NEXT 10M MAXSIZE UNLIMITED;

-- 切换撤销表空间
ALTER SYSTEM SET UNDO_TABLESPACE = undotbs2;

-- 查看撤销表空间信息
SELECT * FROM V$UNDOSTAT;

2.6 创建表空间选项 #

sql
-- 本地管理表空间(推荐)
CREATE TABLESPACE local_tbs
DATAFILE '/u01/app/oracle/oradata/orcl/local_tbs01.dbf' SIZE 100M
EXTENT MANAGEMENT LOCAL
AUTOALLOCATE;  -- 或 UNIFORM SIZE 1M

-- 段空间自动管理(推荐)
CREATE TABLESPACE auto_seg_tbs
DATAFILE '/u01/app/oracle/oradata/orcl/auto_seg_tbs01.dbf' SIZE 100M
SEGMENT SPACE MANAGEMENT AUTO;

-- 日志模式
CREATE TABLESPACE nologging_tbs
DATAFILE '/u01/app/oracle/oradata/orcl/nologging_tbs01.dbf' SIZE 100M
NOLOGGING;

-- 块大小
CREATE TABLESPACE block_16k_tbs
DATAFILE '/u01/app/oracle/oradata/orcl/block_16k_tbs01.dbf' SIZE 100M
BLOCKSIZE 16K;

三、修改表空间 #

3.1 修改表空间属性 #

sql
-- 修改表空间名称
ALTER TABLESPACE users_data RENAME TO users_data_new;

-- 修改表空间状态
ALTER TABLESPACE users_data OFFLINE;                    -- 离线
ALTER TABLESPACE users_data ONLINE;                     -- 在线
ALTER TABLESPACE users_data READ ONLY;                  -- 只读
ALTER TABLESPACE users_data READ WRITE;                 -- 读写

-- 修改日志模式
ALTER TABLESPACE users_data NOLOGGING;
ALTER TABLESPACE users_data LOGGING;

3.2 添加数据文件 #

sql
-- 添加数据文件
ALTER TABLESPACE users_data
ADD DATAFILE '/u01/app/oracle/oradata/orcl/users_data02.dbf' 
SIZE 100M;

-- 添加自动扩展数据文件
ALTER TABLESPACE users_data
ADD DATAFILE '/u01/app/oracle/oradata/orcl/users_data03.dbf' 
SIZE 100M
AUTOEXTEND ON NEXT 10M MAXSIZE 500M;

3.3 修改数据文件 #

sql
-- 修改数据文件大小
ALTER DATABASE 
DATAFILE '/u01/app/oracle/oradata/orcl/users_data01.dbf' 
RESIZE 200M;

-- 启用自动扩展
ALTER DATABASE 
DATAFILE '/u01/app/oracle/oradata/orcl/users_data01.dbf' 
AUTOEXTEND ON NEXT 10M MAXSIZE 500M;

-- 关闭自动扩展
ALTER DATABASE 
DATAFILE '/u01/app/oracle/oradata/orcl/users_data01.dbf' 
AUTOEXTEND OFF;

-- 移动数据文件(需要表空间离线)
ALTER TABLESPACE users_data OFFLINE;
ALTER DATABASE 
RENAME FILE '/u01/app/oracle/oradata/orcl/users_data01.dbf' 
TO '/u02/app/oracle/oradata/orcl/users_data01.dbf';
ALTER TABLESPACE users_data ONLINE;

3.4 修改临时表空间 #

sql
-- 添加临时文件
ALTER TABLESPACE temp_data
ADD TEMPFILE '/u01/app/oracle/oradata/orcl/temp_data02.dbf' 
SIZE 100M;

-- 修改临时文件大小
ALTER DATABASE 
TEMPFILE '/u01/app/oracle/oradata/orcl/temp_data01.dbf' 
RESIZE 200M;

-- 删除临时文件
ALTER DATABASE 
TEMPFILE '/u01/app/oracle/oradata/orcl/temp_data01.dbf' 
DROP INCLUDING DATAFILES;

四、删除表空间 #

4.1 删除表空间 #

sql
-- 删除空表空间
DROP TABLESPACE users_data;

-- 删除表空间及其内容
DROP TABLESPACE users_data INCLUDING CONTENTS;

-- 删除表空间及其内容和数据文件
DROP TABLESPACE users_data INCLUDING CONTENTS AND DATAFILES;

-- 级联删除约束
DROP TABLESPACE users_data 
INCLUDING CONTENTS AND DATAFILES 
CASCADE CONSTRAINTS;

4.2 删除注意事项 #

sql
-- 不能删除系统表空间
DROP TABLESPACE SYSTEM;  -- ORA-01519

-- 删除前检查依赖
SELECT * FROM DBA_SEGMENTS WHERE TABLESPACE_NAME = 'USERS_DATA';
SELECT * FROM DBA_TABLES WHERE TABLESPACE_NAME = 'USERS_DATA';
SELECT * FROM DBA_INDEXES WHERE TABLESPACE_NAME = 'USERS_DATA';

-- 检查是否为默认表空间
SELECT USERNAME, DEFAULT_TABLESPACE, TEMPORARY_TABLESPACE
FROM DBA_USERS
WHERE DEFAULT_TABLESPACE = 'USERS_DATA' 
   OR TEMPORARY_TABLESPACE = 'USERS_DATA';

五、表空间监控 #

5.1 查看表空间信息 #

sql
-- 查看表空间基本信息
SELECT 
    TABLESPACE_NAME,
    CONTENTS,
    STATUS,
    EXTENT_MANAGEMENT,
    SEGMENT_SPACE_MANAGEMENT,
    BIGFILE
FROM DBA_TABLESPACES;

-- 查看数据文件信息
SELECT 
    FILE_NAME,
    TABLESPACE_NAME,
    BYTES/1024/1024 AS SIZE_MB,
    MAXBYTES/1024/1024 AS MAX_SIZE_MB,
    AUTOEXTENSIBLE,
    STATUS
FROM DBA_DATA_FILES
ORDER BY TABLESPACE_NAME;

-- 查看临时文件信息
SELECT 
    FILE_NAME,
    TABLESPACE_NAME,
    BYTES/1024/1024 AS SIZE_MB,
    STATUS
FROM DBA_TEMP_FILES;

5.2 查看表空间使用情况 #

sql
-- 表空间使用情况详细报告
SELECT 
    d.TABLESPACE_NAME,
    ROUND(d.TOTAL_SPACE_MB, 2) AS TOTAL_MB,
    ROUND(f.FREE_SPACE_MB, 2) AS FREE_MB,
    ROUND(d.TOTAL_SPACE_MB - f.FREE_SPACE_MB, 2) AS USED_MB,
    ROUND((d.TOTAL_SPACE_MB - f.FREE_SPACE_MB) / d.TOTAL_SPACE_MB * 100, 2) AS USED_PCT
FROM (
    SELECT 
        TABLESPACE_NAME,
        SUM(BYTES)/1024/1024 AS TOTAL_SPACE_MB
    FROM DBA_DATA_FILES
    GROUP BY TABLESPACE_NAME
) d
JOIN (
    SELECT 
        TABLESPACE_NAME,
        SUM(BYTES)/1024/1024 AS FREE_SPACE_MB
    FROM DBA_FREE_SPACE
    GROUP BY TABLESPACE_NAME
) f ON d.TABLESPACE_NAME = f.TABLESPACE_NAME
ORDER BY USED_PCT DESC;

-- 使用DBA_TABLESPACE_USAGE_METRICS视图(11g+)
SELECT 
    TABLESPACE_NAME,
    USED_SPACE,
    TABLESPACE_SIZE,
    USED_PERCENT
FROM DBA_TABLESPACE_USAGE_METRICS;

5.3 查看段信息 #

sql
-- 查看表空间中的段
SELECT 
    SEGMENT_NAME,
    SEGMENT_TYPE,
    TABLESPACE_NAME,
    BYTES/1024/1024 AS SIZE_MB,
    EXTENTS
FROM DBA_SEGMENTS
WHERE TABLESPACE_NAME = 'USERS'
ORDER BY BYTES DESC;

-- 查看段的区信息
SELECT 
    SEGMENT_NAME,
    EXTENT_ID,
    FILE_ID,
    BLOCK_ID,
    BYTES/1024 AS SIZE_KB
FROM DBA_EXTENTS
WHERE TABLESPACE_NAME = 'USERS'
AND SEGMENT_NAME = 'EMPLOYEES';

六、表空间维护 #

6.1 表空间空间管理 #

sql
-- 手动扩展表空间
-- 方法1:添加数据文件
ALTER TABLESPACE users_data
ADD DATAFILE '/u01/app/oracle/oradata/orcl/users_data04.dbf' 
SIZE 100M;

-- 方法2:调整数据文件大小
ALTER DATABASE 
DATAFILE '/u01/app/oracle/oradata/orcl/users_data01.dbf' 
RESIZE 200M;

-- 方法3:启用自动扩展
ALTER DATABASE 
DATAFILE '/u01/app/oracle/oradata/orcl/users_data01.dbf' 
AUTOEXTEND ON NEXT 10M MAXSIZE UNLIMITED;

6.2 表空间碎片整理 #

sql
-- 查看碎片程度
SELECT 
    TABLESPACE_NAME,
    COUNT(*) AS FREE_FRAGMENTS,
    SUM(BYTES)/1024/1024 AS TOTAL_FREE_MB,
    MAX(BYTES)/1024/1024 AS MAX_FREE_MB
FROM DBA_FREE_SPACE
GROUP BY TABLESPACE_NAME
HAVING COUNT(*) > 1;

-- 合并相邻空闲空间
ALTER TABLESPACE users_data COALESCE;

-- 使用SHRINK整理碎片(ASSM表空间)
ALTER TABLE employees SHRINK SPACE;
ALTER TABLE employees SHRINK SPACE COMPACT;

6.3 修复损坏的数据文件 #

sql
-- 检查数据文件状态
SELECT FILE_NAME, STATUS, ERROR FROM V$DATAFILE;

-- 恢复离线数据文件
ALTER DATABASE DATAFILE '/u01/app/oracle/oradata/orcl/users_data01.dbf' ONLINE;

-- 使用RMAN恢复
RMAN> RECOVER DATAFILE '/u01/app/oracle/oradata/orcl/users_data01.dbf';
RMAN> ALTER DATABASE DATAFILE '/u01/app/oracle/oradata/orcl/users_data01.dbf' ONLINE;

七、表空间最佳实践 #

7.1 表空间规划 #

text
表空间规划建议
├── 系统表空间
│   ├── SYSTEM:数据字典,保持适当大小
│   └── SYSAUX:辅助数据,定期清理
├── 用户表空间
│   ├── 按业务模块分离
│   ├── 按数据类型分离(索引、LOB)
│   └── 按访问频率分离(热数据、冷数据)
├── 临时表空间
│   ├── 创建独立的临时表空间
│   └── 使用临时表空间组
└── 撤销表空间
    ├── 根据事务量设置大小
    └── 考虑闪回需求

7.2 空间估算 #

sql
-- 估算表空间需求
-- 考虑因素:
-- 1. 数据量
-- 2. 增长率
-- 3. 索引大小
-- 4. 安全余量(20-30%)

-- 计算表大小
SELECT 
    TABLE_NAME,
    NUM_ROWS,
    AVG_ROW_LEN,
    NUM_ROWS * AVG_ROW_LEN / 1024 / 1024 AS EST_SIZE_MB
FROM USER_TABLES;

-- 计算索引大小
SELECT 
    INDEX_NAME,
    TABLE_NAME,
    LEAF_BLOCKS * 8 / 1024 AS SIZE_MB
FROM USER_INDEXES;

7.3 监控告警 #

sql
-- 创建表空间使用率监控脚本
SELECT 
    TABLESPACE_NAME,
    ROUND(USED_PERCENT, 2) AS USED_PCT,
    CASE 
        WHEN USED_PERCENT > 90 THEN 'CRITICAL'
        WHEN USED_PERCENT > 80 THEN 'WARNING'
        ELSE 'OK'
    END AS STATUS
FROM DBA_TABLESPACE_USAGE_METRICS
WHERE USED_PERCENT > 80;

-- 设置自动告警阈值
EXEC DBMS_SERVER_ALERT.SET_THRESHOLD(
    METRICS_ID => DBMS_SERVER_ALERT.TABLESPACE_PCT_FULL,
    WARNING_OPERATOR => DBMS_SERVER_ALERT.OPERATOR_GE,
    WARNING_VALUE => '80',
    CRITICAL_OPERATOR => DBMS_SERVER_ALERT.OPERATOR_GE,
    CRITICAL_VALUE => '90',
    OBSERVATION_PERIOD => 1,
    CONSECUTIVE_OCCURRENCES => 1,
    INSTANCE_NAME => NULL,
    OBJECT_TYPE => DBMS_SERVER_ALERT.OBJECT_TYPE_TABLESPACE,
    OBJECT_NAME => 'USERS_DATA'
);

八、表空间相关视图 #

8.1 数据字典视图 #

视图名称 说明
DBA_TABLESPACES 所有表空间信息
DBA_DATA_FILES 所有数据文件信息
DBA_TEMP_FILES 所有临时文件信息
DBA_FREE_SPACE 表空间空闲空间
DBA_SEGMENTS 段信息
DBA_EXTENTS 区信息
V$TABLESPACE 表空间控制文件信息
V$DATAFILE 数据文件信息
V$TEMPFILE 临时文件信息

8.2 常用查询 #

sql
-- 查看表空间详细信息
SELECT 
    t.TABLESPACE_NAME,
    t.STATUS,
    t.CONTENTS,
    t.EXTENT_MANAGEMENT,
    t.SEGMENT_SPACE_MANAGEMENT,
    d.FILE_NAME,
    d.BYTES/1024/1024 AS SIZE_MB
FROM DBA_TABLESPACES t
JOIN DBA_DATA_FILES d ON t.TABLESPACE_NAME = d.TABLESPACE_NAME
ORDER BY t.TABLESPACE_NAME;

-- 查看默认表空间设置
SELECT 
    PROPERTY_NAME,
    PROPERTY_VALUE
FROM DATABASE_PROPERTIES
WHERE PROPERTY_NAME LIKE '%TABLESPACE%';

九、总结 #

表空间管理要点:

操作 命令
创建 CREATE TABLESPACE
修改 ALTER TABLESPACE
删除 DROP TABLESPACE
添加数据文件 ALTER TABLESPACE ADD DATAFILE
调整大小 ALTER DATABASE RESIZE
监控 DBA_TABLESPACES, DBA_DATA_FILES

下一步,让我们学习表操作!

最后更新:2026-03-27