oracle 19c新建表空间必须指定segment space management auto,因lmt强制启用assm,写manual会报ora-12913;extent management local与segment space management auto缺一不可,建好后不可修改,须查dba_tablespaces确认segment_space_management为auto。

新建表空间时必须指定 SEGMENT SPACE MANAGEMENT AUTO
Oracle 19c 的本地管理表空间(LMT)只支持自动段空间管理(ASSM),不接受 MANUAL。试图在 CREATE TABLESPACE 中写 SEGMENT SPACE MANAGEMENT MANUAL 会直接报错 ORA-12913。这不是配置选项,而是强制要求。
正确写法示例:
CREATE TABLESPACE users_tenant_a DATAFILE '/u01/oradata/cdb1/hrpdb/users01.dbf' SIZE 500M EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO;
-
EXTENT MANAGEMENT LOCAL和SEGMENT SPACE MANAGEMENT AUTO必须同时存在,缺一不可 - Navicat 界面中对应「存储」标签页的「段空间管理」选
AUTO(不是MANUAL) - 一旦建好,该参数不可修改——要改只能
DROP TABLESPACE后重建
确认现有表空间是否真正在用 ASSM
别信界面或 DDL 注释,查数据字典才可靠:
SELECT tablespace_name, extent_management, segment_space_management FROM dba_tablespaces WHERE tablespace_name = 'USERS';
返回结果中 SEGMENT_SPACE_MANAGEMENT 列必须是 AUTO。常见误判点:
-
SYSTEM和UNDOTBS1表空间在 19c 中仍是MANUAL,这是正常设计,不代表你配错了 - 查到
AUTO只说明表空间层面启用 ASSM,但具体某个表是否受益,还取决于它是否在该表空间里、且没被创建为SEGMENT CREATION DEFERRED - LOB 段、IOT、分区表的子段可能绕过 ASSM 行为,需单独验证
ASSM 下 INITRANS 和 PCTFREE 还要不要调?
要,但作用变了:ASSM 不再靠 freelist 找空闲块,而是用位图;INITRANS 和 PCTFREE 改为控制块内 ITL 槽位和行迁移风险。
-
INITRANS太低(如默认 2)→ 高并发 UPDATE 同一块时触发enq: TX - allocate ITL entry等待 -
PCTFREE太高(如 40)→ 块内有效密度低,浪费 buffer cache;太低(如 5)→ UPDATE 易引发行迁移和chain row - OLTP 场景建议起手
INITRANS 16、PCTFREE 10;批量插入后只读场景可压到PCTFREE 1
为什么 SHRINK SPACE 失败却没报错?
因为 ASSM 表空间只是前提,不是充分条件。执行 ALTER TABLE t SHRINK SPACE 前,三个硬性检查缺一不可:
- 表所在表空间的
SEGMENT_SPACE_MANAGEMENT是AUTO(已满足) - 表本身已执行过
ALTER TABLE t ENABLE ROW MOVEMENT(没执行就 shrink,命令静默失败) - 表类型是普通堆表——含
LONG、BFILE、函数索引、位图连接索引的表,Oracle 直接禁止 shrink,且不提示原因
最易忽略的是 ENABLE ROW MOVEMENT:它不写进 DDL,也不在 DBA_TABLES 里暴露字段,只能靠 SELECT * FROM DBA_TAB_MODIFICATIONS 或反复测试验证。











