SYSTEM / SYSAUX / UNDO / TEMP / USERS 表空间详解
SYSTEM / SYSAUX / UNDO / TEMP / USERS 表空间详解
适用版本:Oracle Database 11g / 12c / 19c / 23ai 文档版本:v1.0 / 2026-07
1. 概述
Oracle 数据库包含几个核心系统表空间[1]:
| 表空间 | 作用 | 必需 |
|---|---|---|
| SYSTEM | 存储数据字典 | 是 |
| SYSAUX | SYSTEM 辅助表空间 | 是(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. 最佳实践
- SYSTEM 表空间只放系统对象:禁止业务对象
- SYSAUX 定期清理:AWR、统计信息
- UNDO 大小充足:≥ 业务最长查询时间
- 启用 Undo Guarantee:关键业务
- TEMP 表空间组:分散 I/O
- 业务表空间独立:USERS 或自定义表空间
- 使用 ASM:性能与管理
- 多租户 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