SYSTEM / SYSAUX / UNDO / TEMP / USERS 表空间详解

SYSTEM / SYSAUX / UNDO / TEMP / USERS 表空间详解

适用版本:Oracle Database 11g / 12c / 19c / 23ai 文档版本:v1.0 / 2026-07


1. 概述

Oracle 数据库包含几个核心系统表空间[1]:

表空间作用必需
SYSTEM存储数据字典
SYSAUXSYSTEM 辅助表空间是(10g+)
UNDO事务回滚数据
TEMP排序、临时数据
USERS默认用户数据

2. SYSTEM 表空间

2.1 作用

存储 Oracle 数据字典(Data Dictionary):

  • 表/索引/视图/过程定义
  • 用户权限
  • 表空间/数据文件信息
  • 系统回滚段

2.2 关键对象

-- 数据字典基表(SYS 拥有)
SELECT owner, table_name 
FROM dba_tables 
WHERE owner='SYS' 
  AND table_name LIKE '%$' 
FETCH FIRST 20 ROWS ONLY;
-- 例:USER$、OBJ$、FILE$、TS$、COL$、IND$ 等

-- 不应在 SYSTEM 表空间创建业务对象
SELECT owner, segment_name, segment_type
FROM dba_segments
WHERE tablespace_name='SYSTEM' 
  AND owner NOT IN ('SYS','SYSTEM','OUTLN','DBSNMP','APPQOSSYS');

2.3 注意事项

  • 禁止放业务对象
  • 不能 OFFLINE / READ ONLY
  • 不能 DROP / RENAME
  • 大小通常 500MB - 2GB

3. SYSAUX 表空间

3.1 作用

10g 引入,作为 SYSTEM 的辅助表空间,存储[2]:

  • AWR 历史数据
  • Oracle Text
  • Ultra Search
  • OLAP
  • Spatial
  • XML DB
  • LogMiner
  • Enterprise Manager Repository

3.2 查看占用

-- SYSAUX 占用情况
SELECT 
  occupant_name,
  occupant_desc,
  space_usage_kbytes/1024 AS mb
FROM v$sysaux_occupants
ORDER BY space_usage_kbytes DESC;

-- 示例输出:
-- OCCUPANT_NAME       MB
-- ------------------ -----
-- SM/AWR              2048
-- SM/OPTSTAT          512
-- SM/ADVISOR          256
-- ...

3.3 AWR 数据占用过多

-- AWR 占用统计
SELECT 
  snap_id,
  begin_interval_time,
  end_interval_time
FROM dba_hist_snapshot
ORDER BY snap_id DESC
FETCH FIRST 10 ROWS ONLY;

-- 清理旧 AWR 数据
EXEC DBMS_WORKLOAD_REPOSITORY.DROP_SNAPSHOT_RANGE(
  low_snap_id => 1, 
  high_snap_id => 100
);

-- 修改保留时间
EXEC DBMS_WORKLOAD_REPOSITORY.MODIFY_SNAPSHOT_SETTINGS(
  retention => 30*24*60,  -- 30 天
  interval => 60          -- 60 分钟
);

3.4 移动 SYSAUX 组件

-- 将组件移到其他表空间
EXEC DBMS_SPACE_ADMIN.MOVE_SYSAUX_TABLESPACE('SYSAUX_NEW');

4. UNDO 表空间

4.1 作用

存储 Undo 数据,用于:

  • 事务回滚
  • 读一致性(CR 块)
  • 实例恢复
  • Flashback Query

4.2 配置

-- 查看 Undo 配置
SHOW PARAMETER undo;
-- undo_tablespace: 当前使用的 UNDO 表空间
-- undo_retention: Undo 保留时间(秒)
-- undo_management: AUTO(推荐)

-- 创建 UNDO 表空间
CREATE UNDO TABLESPACE undotbs2 
  DATAFILE '/u01/oradata/orcl/undotbs2_01.dbf' SIZE 2G
  AUTOEXTEND ON NEXT 100M MAXSIZE UNLIMITED;

-- 切换 UNDO 表空间
ALTER SYSTEM SET undo_tablespace=undotbs2 SCOPE=BOTH;

-- 启用 Undo 保留保证
ALTER TABLESPACE undotbs1 RETENTION GUARANTEE;

4.3 Undo 大小估算

Undo 大小 = MAX(undo_retention × peak_undo_generate_rate)
                     │                    │
                     │                    └── v$undostat.UNDOBLKS * block_size / seconds

                     └── 业务最长查询时间

详细内容见:Oracle Undo 表空间与事务管理


5. TEMP 表空间

5.1 作用

存储临时数据:

  • 排序溢出
  • 哈希连接
  • 临时表
  • 索引创建

5.2 配置

-- 创建临时表空间
CREATE TEMPORARY TABLESPACE temp2 
  TEMPFILE '/u01/oradata/orcl/temp2_01.dbf' SIZE 2G
  AUTOEXTEND ON NEXT 100M MAXSIZE UNLIMITED
  EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M;

-- 设为默认临时表空间
ALTER DATABASE DEFAULT TEMPORARY TABLESPACE temp2;

5.3 TEMP 表空间组

-- 创建表空间组
CREATE TEMPORARY TABLESPACE temp1 
  TEMPFILE '/u01/temp1.dbf' SIZE 1G 
  TABLESPACE GROUP temp_group;

CREATE TEMPORARY TABLESPACE temp2 
  TEMPFILE '/u01/temp2.dbf' SIZE 1G 
  TABLESPACE GROUP temp_group;

-- 设为默认
ALTER DATABASE DEFAULT TEMPORARY TABLESPACE temp_group;

5.4 监控

-- TEMP 使用情况
SELECT 
  tablespace_name,
  SUM(bytes)/1024/1024 AS total_mb,
  SUM(bytes_used)/1024/1024 AS used_mb,
  SUM(bytes_free)/1024/1024 AS free_mb
FROM v$temp_space_header
GROUP BY tablespace_name;

-- 会话 TEMP 占用
SELECT 
  s.sid, s.serial#, s.username,
  t.blocks * 8/1024 AS mb_used,
  t.sql_id
FROM v$session s
JOIN v$tempseg_usage t ON s.saddr = t.session_addr
ORDER BY t.blocks DESC;

6. USERS 表空间

6.1 作用

默认用户数据表空间。

6.2 配置

-- 创建 USERS 表空间
CREATE TABLESPACE users 
  DATAFILE '/u01/oradata/orcl/users01.dbf' SIZE 1G
  AUTOEXTEND ON NEXT 100M MAXSIZE UNLIMITED
  EXTENT MANAGEMENT LOCAL AUTOALLOCATE
  SEGMENT SPACE MANAGEMENT AUTO;

-- 设为默认
ALTER DATABASE DEFAULT TABLESPACE users;

7. 多租户(CDB/PDB)表空间

12c+ 多租户架构下:

-- CDB 表空间
SELECT con_id, tablespace_name, status 
FROM cdb_tablespaces
ORDER BY con_id, tablespace_name;

-- PDB 中的表空间
ALTER SESSION SET CONTAINER = salespdb;
SELECT tablespace_name FROM dba_tablespaces;

特殊表空间

  • CDB$ROOT 的 SYSTEM/SYSAUX:所有 PDB 共享的元数据
  • 每个 PDB 有独立的 SYSTEM/SYSAUX/UNDO/TEMP/USERS

8. 常见坑与排错

8.1 SYSTEM 表空间满

现象ORA-01653: unable to extend table SYS.SOURCE$ by ... in tablespace SYSTEM

修复

-- 增大 SYSTEM 表空间
ALTER TABLESPACE SYSTEM ADD DATAFILE '/u01/system02.dbf' SIZE 1G;

-- 排查业务对象是否在 SYSTEM
SELECT owner, segment_name, bytes/1024/1024 AS mb
FROM dba_segments
WHERE tablespace_name='SYSTEM' 
  AND owner NOT IN ('SYS','SYSTEM');

-- 移动业务对象
ALTER TABLE scott.emp MOVE TABLESPACE users;

8.2 SYSAUX 暴涨

现象:SYSAUX 持续增长。

修复

-- 1. 检查占用
SELECT occupant_name, space_usage_kbytes/1024 AS mb
FROM v$sysaux_occupants
ORDER BY space_usage_kbytes DESC;

-- 2. AWR 占用多时清理
EXEC DBMS_WORKLOAD_REPOSITORY.MODIFY_SNAPSHOT_SETTINGS(
  retention => 7*24*60,
  interval => 60
);

-- 3. 旧统计信息清理
EXEC DBMS_STATS.PURGE_STATS(SYSDATE - 7);

8.3 UNDO 表空间满

现象ORA-30036: unable to extend segment by ... in undo tablespace

修复

-- 1. 增加 Undo 文件
ALTER TABLESPACE undotbs1 ADD DATAFILE '/u02/undo02.dbf' SIZE 2G;

-- 2. 增大 undo_retention(如果空间允许)

-- 3. 优化长事务

8.4 TEMP 表空间满

现象ORA-01652: unable to extend temp segment by ... in tablespace TEMP

修复

-- 1. 增大 TEMP
ALTER TABLESPACE temp ADD TEMPFILE '/u02/temp02.dbf' SIZE 2G;

-- 2. 优化大排序 SQL

-- 3. 增大 PGA
ALTER SYSTEM SET pga_aggregate_target=2G SCOPE=BOTH;

8.5 SYSTEM 表空间包含业务对象

现象:用户对象在 SYSTEM 表空间。

修复

-- 移动表
ALTER TABLE scott.emp MOVE TABLESPACE users;

-- 重建索引
ALTER INDEX scott.emp_idx REBUILD TABLESPACE users;

-- 修改默认表空间
ALTER USER scott DEFAULT TABLESPACE users;

9. 最佳实践

  1. SYSTEM 表空间只放系统对象:禁止业务对象
  2. SYSAUX 定期清理:AWR、统计信息
  3. UNDO 大小充足:≥ 业务最长查询时间
  4. 启用 Undo Guarantee:关键业务
  5. TEMP 表空间组:分散 I/O
  6. 业务表空间独立:USERS 或自定义表空间
  7. 使用 ASM:性能与管理
  8. 多租户 PDB 独立表空间:数据隔离

10. 参考资料

[1] Oracle Database Administrator’s Guide 19c, “Managing Tablespaces” https://docs.oracle.com/en/database/oracle/oracle-database/19/admin/managing-tablespaces.html

[2] Oracle Database Administrator’s Guide 19c, “Managing the SYSAUX Tablespace” https://docs.oracle.com/en/database/oracle/oracle-database/19/admin/managing-tablespaces.html