Oracle 11g批量减少段空间,Segment Advisor建议具体操作步骤是?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1139个文字,预计阅读时间需要5分钟。
相关专题:
直接说结论:segment advisor 本身不执行收缩,只提建议;批量收缩必须靠脚本驱动 shrink space,且需提前开启行移动。
Segment Advisor 不会自动收缩段,只生成可操作建议
很多人误以为启用 Automatic Segment Advisor 后,Oracle 就会“自动清理空间”。实际上它只做两件事:扫描段、判断哪些段存在显著空间浪费(比如已用块远少于分配块),然后把结果写进 DBA_ADVISOR_FINDINGS 和 DBA_ADVISOR_RECOMMENDATIONS。你查不到任何自动执行的 shrink 日志——它从不发 DDL 命令。
常见错误现象:SELECT * FROM DBA_ADVISOR_FINDINGS WHERE TASK_NAME LIKE 'SEGMENT%' 返回多条“reclaimable space”记录,但表大小没变、BYTES 也没降。
- 必须手动查出推荐对象,再逐个执行收缩
- 默认建议只覆盖高水位线(HWM)明显偏高的段,对小表或刚清空的表可能不触发
- Advisor 运行时不会锁表,但后续
shrink space会短暂阻塞 DML(尤其非compact模式)
如何从 Advisor 建议中提取可收缩的表并批量处理
核心是拼出合法的 ALTER TABLE ... SHRINK SPACE 语句。注意:不是所有推荐对象都适合直接 shrink —— 索引组织表(IOT)、LOB 段、分区表的个别分区需单独处理。
示例查询(过滤掉系统对象和不可收缩类型):
SELECT 'ALTER TABLE ' || owner || '.' || segment_name || ' ENABLE ROW MOVEMENT;' cmd1, 'ALTER TABLE ' || owner || '.' || segment_name || ' SHRINK SPACE;' cmd2, 'ALTER TABLE ' || owner || '.' || segment_name || ' DISABLE ROW MOVEMENT;' cmd3, s.bytes/1024/1024 "MB_ALLOCATED", (s.bytes - f.bytes)/1024/1024 "RECLAIMABLE_MB" FROM dba_advisor_findings f JOIN dba_segments s ON f.owner = s.owner AND f.object_name = s.segment_name WHERE f.task_name LIKE 'SEGMENT%' AND f.recommendation LIKE '%reclaimable%' AND s.segment_type = 'TABLE' AND s.owner NOT IN ('SYS','SYSTEM','XDB') ORDER BY "RECLAIMABLE_MB" DESC;
- 输出的
cmd1/cmd2/cmd3可直接复制执行,但建议先加COMPACT测试(即改SHRINK SPACE为SHRINK SPACE COMPACT) - 若某表含函数索引或位图索引,
SHRINK SPACE可能报ORA-10631,需先DISABLE再收缩 - 不要在业务高峰期批量跑,每个
SHRINK SPACE默认会尝试下移 HWM,期间表上不能有 DDL
为什么 shrink space compact 更安全但效果有限
shrink space compact 只压缩数据块、整理行,不移动高水位线(HWM)。这意味着:释放的空间仍属于该段,不会返还给表空间,dba_free_space 不会增加,user_segments.bytes 也不变——但后续 INSERT 会优先填满这些空块,减少新块分配。
- 适合在线业务:全程不锁表,DML 可持续
- 无法缓解表空间紧张:因为磁盘空间没真正归还
- 必须配
ENABLE ROW MOVEMENT,否则报ORA-10636 - 执行后需
ANALYZE TABLE ... COMPUTE STATISTICS或DBMS_STATS.GATHER_TABLE_STATS更新统计信息,否则执行计划可能劣化
临时表空间和永久表空间收缩不能混用同一命令
看到 “ALTER TABLESPACE ... SHRINK SPACE” 别急着套用到数据文件上——这是专用于临时表空间的语法。对永久表空间的数据文件,你只能:ALTER DATABASE DATAFILE '/path/file.dbf' RESIZE <size>,而这个命令失败率极高,常报 ORA-03297。
- 查最小可 resize 值必须用
dba_extents算 HWM:SELECT CEIL((NVL(e.hwm, 1) * <block_size>)/1024/1024) FROM dba_data_files f LEFT JOIN (SELECT file_id, max(block_id + blocks - 1) hwm FROM dba_extents GROUP BY file_id) e ... - 临时表空间收缩(
ALTER TABLESPACE temp SHRINK SPACE)可联机、无等待,但仅 Oracle 11g+ 支持 - 永久表空间无法整体 shrink,只能靠收缩其内部的表/索引段,再 resize 单个数据文件
最易被忽略的一点:收缩前没检查 ROW MOVEMENT 状态,或收缩后忘了 DISABLE ROW MOVEMENT —— 虽然不影响功能,但会带来潜在风险(比如意外触发行迁移导致性能抖动),而且审计时会被标记为配置异常。
本文共计1139个文字,预计阅读时间需要5分钟。
相关专题:
直接说结论:segment advisor 本身不执行收缩,只提建议;批量收缩必须靠脚本驱动 shrink space,且需提前开启行移动。
Segment Advisor 不会自动收缩段,只生成可操作建议
很多人误以为启用 Automatic Segment Advisor 后,Oracle 就会“自动清理空间”。实际上它只做两件事:扫描段、判断哪些段存在显著空间浪费(比如已用块远少于分配块),然后把结果写进 DBA_ADVISOR_FINDINGS 和 DBA_ADVISOR_RECOMMENDATIONS。你查不到任何自动执行的 shrink 日志——它从不发 DDL 命令。
常见错误现象:SELECT * FROM DBA_ADVISOR_FINDINGS WHERE TASK_NAME LIKE 'SEGMENT%' 返回多条“reclaimable space”记录,但表大小没变、BYTES 也没降。
- 必须手动查出推荐对象,再逐个执行收缩
- 默认建议只覆盖高水位线(HWM)明显偏高的段,对小表或刚清空的表可能不触发
- Advisor 运行时不会锁表,但后续
shrink space会短暂阻塞 DML(尤其非compact模式)
如何从 Advisor 建议中提取可收缩的表并批量处理
核心是拼出合法的 ALTER TABLE ... SHRINK SPACE 语句。注意:不是所有推荐对象都适合直接 shrink —— 索引组织表(IOT)、LOB 段、分区表的个别分区需单独处理。
示例查询(过滤掉系统对象和不可收缩类型):
SELECT 'ALTER TABLE ' || owner || '.' || segment_name || ' ENABLE ROW MOVEMENT;' cmd1, 'ALTER TABLE ' || owner || '.' || segment_name || ' SHRINK SPACE;' cmd2, 'ALTER TABLE ' || owner || '.' || segment_name || ' DISABLE ROW MOVEMENT;' cmd3, s.bytes/1024/1024 "MB_ALLOCATED", (s.bytes - f.bytes)/1024/1024 "RECLAIMABLE_MB" FROM dba_advisor_findings f JOIN dba_segments s ON f.owner = s.owner AND f.object_name = s.segment_name WHERE f.task_name LIKE 'SEGMENT%' AND f.recommendation LIKE '%reclaimable%' AND s.segment_type = 'TABLE' AND s.owner NOT IN ('SYS','SYSTEM','XDB') ORDER BY "RECLAIMABLE_MB" DESC;
- 输出的
cmd1/cmd2/cmd3可直接复制执行,但建议先加COMPACT测试(即改SHRINK SPACE为SHRINK SPACE COMPACT) - 若某表含函数索引或位图索引,
SHRINK SPACE可能报ORA-10631,需先DISABLE再收缩 - 不要在业务高峰期批量跑,每个
SHRINK SPACE默认会尝试下移 HWM,期间表上不能有 DDL
为什么 shrink space compact 更安全但效果有限
shrink space compact 只压缩数据块、整理行,不移动高水位线(HWM)。这意味着:释放的空间仍属于该段,不会返还给表空间,dba_free_space 不会增加,user_segments.bytes 也不变——但后续 INSERT 会优先填满这些空块,减少新块分配。
- 适合在线业务:全程不锁表,DML 可持续
- 无法缓解表空间紧张:因为磁盘空间没真正归还
- 必须配
ENABLE ROW MOVEMENT,否则报ORA-10636 - 执行后需
ANALYZE TABLE ... COMPUTE STATISTICS或DBMS_STATS.GATHER_TABLE_STATS更新统计信息,否则执行计划可能劣化
临时表空间和永久表空间收缩不能混用同一命令
看到 “ALTER TABLESPACE ... SHRINK SPACE” 别急着套用到数据文件上——这是专用于临时表空间的语法。对永久表空间的数据文件,你只能:ALTER DATABASE DATAFILE '/path/file.dbf' RESIZE <size>,而这个命令失败率极高,常报 ORA-03297。
- 查最小可 resize 值必须用
dba_extents算 HWM:SELECT CEIL((NVL(e.hwm, 1) * <block_size>)/1024/1024) FROM dba_data_files f LEFT JOIN (SELECT file_id, max(block_id + blocks - 1) hwm FROM dba_extents GROUP BY file_id) e ... - 临时表空间收缩(
ALTER TABLESPACE temp SHRINK SPACE)可联机、无等待,但仅 Oracle 11g+ 支持 - 永久表空间无法整体 shrink,只能靠收缩其内部的表/索引段,再 resize 单个数据文件
最易被忽略的一点:收缩前没检查 ROW MOVEMENT 状态,或收缩后忘了 DISABLE ROW MOVEMENT —— 虽然不影响功能,但会带来潜在风险(比如意外触发行迁移导致性能抖动),而且审计时会被标记为配置异常。

