ORA-01628是段的extents耗尽(达32765上限),非磁盘空间不足;根源在字典管理表空间(DMT)下MAXEXTENTS限制或undo段碎片化,需切换至本地管理表空间(LMT)并启用自动撤销管理。

ORA-01628 错误根本不是空间不足,而是段(segment)的扩展次数达到上限,必须立刻检查并重设 MAXEXTENTS 或改用本地管理表空间(LMT)。
ORA-01628 是什么,为什么和表空间扩容无关
这个错误常被误认为是磁盘满或表空间不够,实际是 Oracle 对某个段(比如表、索引)允许的最大扩展数(EXTENT)耗尽了。在字典管理表空间(DMT)中,每个段创建时会指定 MAXEXTENTS,默认值可能低至 121 或 240,一旦分配完所有 extent 就报 ORA-01628,哪怕表空间还有几十 GB 空闲也无济于事。
关键点:MAXEXTENTS 是段级参数,不是表空间级;它只在 DMT 中生效;Oracle 11g 默认建库已用本地管理表空间(LMT),但老系统迁移或手动建表空间时仍可能残留 DMT。
- 查当前表空间类型:执行
SELECT tablespace_name, extent_management FROM dba_tablespaces;,若EXTENT_MANAGEMENT = 'DICTIONARY',就踩中雷区 - 查出问题段:报错时通常带段名,如
ORA-01628: max # extents reached for rollback segment _SYSSMU10_,说明是回滚段;若是普通表,则用SELECT segment_name, segment_type, extents, max_extents FROM dba_segments WHERE segment_name = 'XXX'; - DMT 下
MAXEXTENTS无法在线修改,只能重建段或迁移表空间
如何确认并切换到本地管理表空间(LMT)
本地管理表空间不依赖数据字典跟踪 extent,天然规避 MAXEXTENTS 限制,且性能更好。Oracle 11g 完全支持 LMT,且新创建的表空间默认就是 LMT。
- 确认目标表空间是否已是 LMT:
SELECT tablespace_name, extent_management, allocation_type FROM dba_tablespaces WHERE tablespace_name = 'USERS';,输出LOCAL+SYSTEM或UNIFORM即为安全 - 若仍是
DICTIONARY,不能直接 ALTER 转换,必须重建:导出数据 → 删除旧表空间 → 用CREATE TABLESPACE ... EXTENT MANAGEMENT LOCAL新建 → 导入 - 新建 LMT 的推荐写法:
CREATE TABLESPACE users2 DATAFILE '/u01/oradata/orcl/users2.dbf' SIZE 100M EXTENT MANAGEMENT LOCAL AUTOALLOCATE;(AUTOALLOCATE比UNIFORM更灵活,无需指定UNIFORM SIZE)
如果暂时无法迁移,如何临时绕过 MAXEXTENTS 限制
仅限应急,不可长期依赖。适用于 DMT 下关键段(如回滚段、数据字典表)已触顶但又来不及迁移的场景。
- 对非系统段(普通用户表/索引),可尝试
ALTER TABLE xxx ALLOCATE EXTENT;手动预分配一个 extent,有时能延缓报错,但不解决根本问题 - 对回滚段(
_SYSSMU*),需重启数据库并启用自动撤销管理(UNDO_MANAGEMENT=AUTO),禁用手工回滚段,这是 11g 唯一合规做法 - 绝对不要用
ALTER TABLE xxx STORAGE (MAXEXTENTS UNLIMITED)—— 在 DMT 下该语句语法合法但无效,Oracle 会静默忽略,MAXEXTENTS仍卡在原值 - 查询段当前 extent 数量:
SELECT segment_name, extents, max_extents FROM dba_segments WHERE owner = 'YOUR_SCHEMA' AND segment_type IN ('TABLE','INDEX');,提前预警extents >= max_extents * 0.9的段
最容易被忽略的细节:回滚段与 UNDO 表空间的隐式绑定
ORA-01628 最常出现在 undo 表空间的回滚段上,但很多人只盯着 UNDOTBS1 的磁盘空间,却忘了它的管理方式。即使 UNDOTBS1 是 LMT,若数据库仍运行在手工回滚段模式(UNDO_MANAGEMENT=MANUAL),回滚段本身仍是 DMT 段,MAXEXTENTS 限制照旧生效。
验证方式:SHOW PARAMETER undo_management,必须是 AUTO;再查 SELECT tablespace_name, contents FROM dba_tablespaces WHERE contents = 'UNDO';,确保 undo 表空间存在且为 LOCAL。两者缺一不可。否则,哪怕你把 undo 表空间扩到 100G,只要还在手工模式,_SYSSMU 段迟早爆 MAXEXTENTS。


















