system和sysaux表空间不可设为默认,仅能设置用户级默认表空间;system存储核心数据字典且不可迁移,sysaux收纳可移动组件(如awr、em),其空间需通过v$sysaux_occupants定位后调整保留策略或清理日志。
system 和 sysaux 表空间不能被“设置为默认”
oracle 数据库里没有 alter database set default tablespace system 这种语法,system 和 sysaux 表空间是系统强制使用的元数据容器,不是用户可自由指定的默认表空间。你真正能控制的只有用户的 default tablespace 和 temporary tablespace。
常见错误现象:ORA-01952(无法删除 SYSTEM 中的对象)、创建用户时没显式指定表空间导致意外写入 SYSTEM、或误以为把某个组件“移到 SYSAUX”就能释放 SYSTEM 空间。
-
SYSTEM只能存数据字典基表(obj$、tab$等)和早期 Oracle 组件(如 PL/SQL 编译单元),不可迁移 -
SYSAUX是从 10g 起引入的辅助系统表空间,用来收纳原本挤在SYSTEM里的可移动组件(如 AWR、OEM、Spatial、XDB) - 用户对象(表、索引、LOB)绝不能创建在
SYSTEM或SYSAUX上——这不是限制,而是 Oracle 在 DDL 层直接禁止的(ORA-01950: no privileges on tablespace 'SYSTEM')
查清哪些组件实际占用了 SYSAUX 空间
很多 DBA 看到 SYSAUX 膨胀就急着清理,但先得知道谁在用。Oracle 提供了视图 V$SYSAUX_OCCUPANTS,它列出所有注册在 SYSAUX 的组件及其空间使用估算。
执行:
SELECT occupant_name, schema_name, space_usage_kbytes FROM v$sysaux_occupants ORDER BY space_usage_kbytes DESC;
- 注意
space_usage_kbytes是估算值,非实时精确值;真实占用需结合DBA_SEGMENTS查具体段 - 重点关注
AWR(SM/AWR)、EM(EM)、XDB(XDB)、LOGMNR(LOGMNR)这几类,它们通常占大头 - 有些组件(如
TEXT或ORDIM)只在启用对应功能后才出现,未启用则不占空间
安全收缩 SYSAUX 的关键操作:别动 SYSTEM,管好 AWR 和日志
SYSTEM 几乎没法“管理”,真正能动手的是 SYSAUX 里的可调组件。最常被误操作的是 AWR 快照和数据库审计日志。
- 调整 AWR 保留策略:
EXEC dbms_workload_repository.modify_snapshot_settings(retention => 86400);(单位秒,此处设为 1 天) - 清理旧审计记录(如果用标准审计):
DELETE FROM sys.aud$ WHERE timestamp# ,之后必须 <code>COMMIT并考虑SHRINK SPACE - 禁用不用的组件:比如没用 OEM,可运行
EXEC dbms_swrf_internal.remove_em_db_entry;(需 SYS 用户,且仅限 11g+) - 切勿手动
DROPSYSAUX中的对象或移动段——组件注册信息与物理段强绑定,破坏会导致ORA-00600或数据库无法启动
新建用户时务必显式指定 DEFAULT TABLESPACE
这是防止用户对象意外污染 SYSTEM 或 SYSAUX 的最后一道防线。Oracle 默认安装时,DEFAULT TABLESPACE 往往设为 USERS,但克隆库、脚本部署或老版本升级后可能丢失该设置。
检查命令:
SELECT property_name, property_value FROM database_properties WHERE property_name = 'DEFAULT_TABLESPACE';
- 如果返回空或值为
SYSTEM,立刻修正:ALTER DATABASE DEFAULT TABLESPACE users; - 创建用户时不要依赖默认值:
CREATE USER app_user IDENTIFIED BY pwd DEFAULT TABLESPACE app_data; - 已有用户若仍用
SYSTEM作默认表空间(可通过DBA_USERS.default_tablespace查),用ALTER USER ... DEFAULT TABLESPACE ...切换,并确认其下无段(否则会报错)
真正的难点不在命令本身,而在于组件注册表与物理段之间的隐式耦合——改一个参数可能触发后台作业重建段,但不会告诉你它正在往哪个表空间写。所以任何对 SYSAUX 的操作,都得先查 V$SYSAUX_OCCUPANTS,再看 DBA_SEGMENTS,最后才动手。










