oracle 11g升级到19c后临时表空间占用翻倍,主因是19c更激进的pga管理、自动并行行为及temporary lob_data长期占用;需调高pga_aggregate_target、禁用自动并行、显式释放lob段或重建temp表空间。

Oracle 11g 升级到 19c 后临时表空间占用翻倍,不是因为“升级自动变大”,而是因为 19c 的内存管理、并行行为和 LOB 处理逻辑更激进,而旧应用没适配——默认配置下更容易把排序/哈希操作挤出 PGA,全压进 TEMP。
PGA_AGGREGATE_TARGET 默认值变化导致大量溢出
11g 中 PGA 默认按 AMM(自动内存管理)或固定值保守设置;19c 在启用 MEMORY_TARGET 或 SGA_TARGET 时,PGA_AGGREGATE_TARGET 可能被动态压低,尤其当数据库总内存未显式调高时。一旦 PGA 不足,ORDER BY、GROUP BY 等操作立刻溢出到 TEMP,且每个会话都独立溢出。
- 查当前 PGA 实际分配:执行
SELECT name, value FROM v$parameter WHERE name = 'pga_aggregate_target';,再对比 11g 时期的值(单位是字节) - 查溢出频率:运行
SELECT name, value FROM v$sysstat WHERE name LIKE '%sort%';,重点看sorts (disk)是否比升级前显著上升 - 临时缓解:在不重启前提下可在线调高,例如
ALTER SYSTEM SET pga_aggregate_target = 4G SCOPE=BOTH;,但需确认主机物理内存余量
并行查询默认行为变更引发 TEMP 倍增
19c 对并行度(DOP)更“敢用”:即使 SQL 没写 /*+ PARALLEL */,只要对象统计信息完整 + 优化器判定收益高,就可能自动启用并行。每个并行进程(PX slave)都会独立申请临时段,5 个并行进程 = 5 倍 TEMP 占用,且段释放延迟更长。
- 快速识别:查
v$sort_usage中sid对应的program若含P00、P01等,基本就是并行进程 - 验证是否自动并行:查
v$sql中对应高占用 SQL 的degree和req_degree列,非 1 即启用 - 控制开关:
ALTER SESSION SET parallel_degree_policy = 'MANUAL';或全局禁用自动并行(ALTER SYSTEM SET parallel_degree_policy = 'LIMITED';),但会影响部分报表性能
TEMPORARY LOB_DATA 占用不释放成隐形黑洞
19c 对 CLOB/BLOB 字段的处理更依赖临时 LOB 段,尤其在 JDBC 长连接中执行含 ORDER BY 的查询时,会生成 TEMPORARY LOB_DATA 类型的临时段。这类段不会随语句结束释放,也不会出现在传统 v$sort_usage 的常规排序统计里,只在 contents = 'TEMPORARY LOB_DATA' 时暴露。
- 定位命令:
SELECT sid, sql_id, contents FROM v$sort_usage WHERE contents = 'TEMPORARY LOB_DATA'; - 关联会话:
SELECT sid, username, program, machine FROM v$session WHERE sid IN (上面查出的 sid 列表); - 根本解法:应用侧必须在读取完 CLOB 后显式调用
DBMS_LOB.FREETEMPORARY;若无法改代码,只能 kill 对应会话强制释放
重建 TEMP 表空间是唯一能清空高位 extent 的方式
19c 的 TEMP 文件一旦扩展,高位 extent 就永远卡住——ALTER TABLESPACE TEMP SHRINK SPACE 完全无效(该命令仅支持永久表空间),RESIZE 也会因 ORA-03297 失败。你看到的“占用翻倍”,很可能只是文件大小膨胀了,但真实可用空间已耗尽(查 v$temp_space_header 才知)。
- 别信
DBA_TEMP_FILES.bytes:它只显示文件尺寸,不是空闲量 - 查真实空闲:
SELECT tablespace_name, round((free_blocks * block_size) / 1024 / 1024) free_mb FROM v$temp_space_header;,如果接近 0,哪怕文件显示 50 GB 也随时报 ORA-01652 - 重建流程不可跳步:新建 TEMP 表空间 →
ALTER DATABASE DEFAULT TEMPORARY TABLESPACE切换 → 确认v$sort_usage无残留 →DROP TABLESPACE ... INCLUDING CONTENTS AND DATAFILES
最常被忽略的一点:RAC 环境下,一个节点的 TEMP 占满不会自动触发其他节点切换,但所有实例共享同一套 TEMP 文件。升级后若未同步调整各节点的 pga_aggregate_target 或并行策略,很容易出现“只有节点1爆,但整个集群卡”的假象。











