oracle仍能创建字典管理表空间(dmt)仅因语法兼容性残留,实际从9.2起禁止创建,运行时因依赖sys.uet$/fet$字典表更新、引发高并发争用、无法支持assm、易产生不可控碎片且扩容风险高,故不建议使用。

为什么 Oracle 仍能创建字典管理表空间但不建议用
Oracle 从 8i 开始主推本地管理表空间(LMT),10g 起默认创建的都是 LMT,但 CREATE TABLESPACE 语法仍保留 DICTIOANRY 关键字(需显式指定)。这不是功能支持,而是兼容性残留——就像还能执行 ALTER SYSTEM SWITCH LOGFILE,不代表推荐手动切日志。
真正的问题不在语法能否通过,而在于运行时行为:字典管理表空间(DMT)把空闲/已用空间信息全存在 SYS.FET$ 和 SYS.UET$ 这两张数据字典表里。每次分配或回收 extent,都要更新这些表,且依赖递归 SQL 查询,高并发下极易争用 SYSTEM 表空间和数据字典锁。
- 碎片问题不可控:DMT 没有位图管理,delete 表后留下的空闲空间可能零散分布,
dba_free_space中会看到大量小 chunk,但allocate extent时却因找不到连续块而失败 - 无法启用自动段空间管理(ASSM):ASSM 是 LMT 的子特性,DMT 只能配
FREELIST,必须手工调优PCTUSED、FREELISTS等参数,稍有偏差就引发热点块争用 - 扩容风险高:DMT 扩容依赖
MINIMUM EXTENT参数,若设得过大,小对象插入频繁时会导致空间浪费;设得太小,又加剧递归 SQL 压力
如何确认当前库还有没有字典管理表空间
别只看建库时间——升级或迁移后旧表空间可能被遗留。直接查 dba_tablespaces 最可靠:
SELECT tablespace_name, extent_management, segment_space_management FROM dba_tablespaces WHERE extent_management = 'DICTIONARY';
如果返回结果非空,说明存在 DMT。注意:extent_management 是关键字段,值为 'DICTIONARY' 才是真 DMT;segment_space_management 字段此时必为 'MANUAL'(DMT 不支持 AUTO)。
常见误判点:
- 看到
SYSTEM或SYSAUX表空间就以为是 DMT?错。它们默认就是 LMT,哪怕你没显式写EXTENT MANAGEMENT LOCAL - 查
dba_data_files看文件路径?没用。文件物理路径和管理方式无关 - 用
SELECT * FROM fet$?危险。直接访问基表违反 Oracle 支持政策,且fet$在 12c+ 已被隐藏视图封装
发现字典管理表空间后该怎么处理
不能直接 DROP——里面可能有用户对象。迁移路径只有一条:重建 + 导出导入。没有在线转换命令,这是 Oracle 明确不支持的操作。
实操要点:
- 先确认该表空间是否为空:
SELECT owner, segment_name FROM dba_segments WHERE tablespace_name = 'YOUR_DMT_TBS';,非空则需逐个迁移对象 - 新建 LMT 表空间(带
SEGMENT SPACE MANAGEMENT AUTO),再用ALTER USER ... DEFAULT TABLESPACE切换用户默认表空间 - 对表做
ALTER TABLE ... MOVE TABLESPACE new_tbs,索引做ALTER INDEX ... REBUILD TABLESPACE new_tbs——注意 move/rebuild 会产生 rowid 变更,应用层需重连或刷新缓存 - 最后检查
dba_rollback_segs和dba_temp_files是否也用了 DMT;临时表空间必须是TEMPORARY类型,且只能是 LMT
为什么有些老系统还在用字典管理表空间
不是技术偏好,而是历史包袱。典型场景包括:
- Oracle 7.3 或 8.0 升级上来的库,当年建的 DMT 表空间一直没动过,DBA 认为“没坏就不修”
- 某些定制化中间件(如老版本 PeopleSoft)安装脚本硬编码了 DMT 创建语句,升级时未同步更新
- 误信“DMT 更省空间”——其实相反:DMT 的 extent 分配粒度难控制,反而更容易造成内部碎片,实际可用率常比 LMT 低 15%~20%
最麻烦的是隐性依赖:比如某个报表作业在 DMT 表空间里建了全局临时表(ON COMMIT DELETE ROWS),迁移到 LMT 后没改连接字符串,结果报 ORA-01565 找不到临时文件——这种问题不会在迁移前的测试里暴露,只在生产高峰时触发。











