Oracle 9i临时LOB对象过多使用临时表空间的一个错误设计

本文介绍了一个Oracle9i升级过程中的问题,即大量临时段占用导致的临时表空间浪费现象。此问题在Oracle8i中并不存在,在9i中由于临时LOB对象不释放空间而变得明显。

这是一个在Oracle 9i上的Bug, 问题发现于数据库从8i升级到9i时, 发现占用了大量的临时段. 与其说是Bug, 更不如说Oracle故意如此, 因为Oracle说这不是Bug, 而是其设计上如此. 我们在一个Session中做实验(9i)就可以了, 你可以想象一下如果你有几百个会话都在调用有临时LOB对象的角本, 而TEMP表空间的UNIFORM SIZE设得又比较大时, 总共需要多少临时空间?.

ASQL> declare
    2  a clob;
    3 begin 
    4  a := ‘abc’;
    5 end;
    6 /

Procedure executed.

ASQL> ora sort

SID USERNAME BLOCKS TABLESPACE SEGTYPE  
— ——– —— ———- ——– 
547 ANYSQL      128 TEMP01    LOB_DATA 
  
1 rows returned.

    在Oracle 8i中试验一下:

ASQL> declare
    2  a clob;
    3 begin
    4  dbms_lob.createtemporary(a,true);
    5  dbms_lob.write(a,3,1,’abc’);  
    6 end;
    7 /

Procedure executed.

ASQL> ora sort

0 rows returned.

    在OLTP中, 一般大量的会话都是Cache起来的, 也就是说登上来后不会马上退出的, 而这个Bug是说CLOB变量占用的临明表表空的空间不会释放, 在上面的例子(9i)中, 虽然PL/SQL已经执行完毕, 但空间并没有释放, 这时如果大量的会话上来, 而临表表空间的Inital Extent较大的话, 就会浪费大量的空间了. 这个问题在8i中并不存在. 新版本总是伴随着新的Bug, 这话总是没错.


链接:http://www.anysql.net/oracle/oracle9i_lob_temp.html

<think>嗯,用户的问题是关于Oracle 11.2.0.4中临时表空间LOB占用未释放的解决方案。从用户提供的引用来看,ta可能在进行数据库维护或恢复操作时遇到了这个问题,引用内容涉及RMAN备份恢复、参数调整等,说明用户具备一定的DBA基础。 用户的核心痛点是LOB对象临时表空间无法自动释放,导致空间持续增长。这个问题在Oracle 11.2.0.4中确实比较典型,通常与LOB操作(如CLOB/BLOB处理)后的清理机制有关。需要从多个层面考虑解决方案: 首先想到的是临时表空间组机制(引用2提到undo表空间,但未提临时表空间组)。在11g中引入的这个功能可以动态分配临时文件,比传统单文件管理更灵活。建议用户创建临时表空间组并设为默认,这样当某个临时文件被LOB占用时,系统会自动切换到其他文件。 其次要注意会话级清理问题。很多DBA会忽略ALTER SYSTEM KILL SESSION后未提交事务残留的临时段(引用3的RMAN操作可能产生此类会话)。需要强调在kill session后必须用ALTER SYSTEM DISCONNECT SESSION才能真正释放资源。 另外LOB存储参数也值得关注。用户可能在创建LOB列时使用恰当的DISABLE STORAGE IN ROW设置,导致小对象也存储在临时表空间。应该检查相关表的DDL,确保启用STORAGE IN ROW。 诊断方面补充两点:除了监控V$TEMPSEG_USAGE,还要结合DBA_SEGMENTS看OBJECT_NAME=&#39;TEMPORARY&#39;的段类型;事件诊断时建议先设置max_dump_file_size防止trace过大。 考虑到用户环境是11.2.0.4,最后特别提醒要检查补丁。MOS文档#1296652.1记载的这个版本存在LOB临时段泄露的bug,应用PSU 11.2.0.4.3能解决。 用户应该比较专业,所以给出了重启数据库这个终极手段——虽然暴力但有效。过要提醒ta在业务低峰期操作,避免影响生产环境。</think>针对Oracle 11.2.0.4中临时表空间LOB占用未释放的问题,以下是系统化的解决方案: --- ### **原因分析** LOB(大对象)操作(如`CLOB`/`BLOB`处理)可能因以下原因导致临时段未释放: 1. **会话异常终止**:会话未正常关闭导致临时段残留。 2. **事务未提交/回滚**:长时间未提交的事务持有临时段。 3. **LOB存储参数当**:`DISABLE STORAGE IN ROW` 强制LOB使用临时表空间。 4. **Bug或内存泄漏**:Oracle 11.2.0.4 存在已知的临时段管理缺陷(需检查补丁状态)[^1]。 --- ### **解决方案** #### **1. 强制释放临时段** ```sql -- 终止持有临时段的会话 ALTER SYSTEM KILL SESSION &#39;sid,serial#&#39; IMMEDIATE; -- 手动收缩临时表空间 ALTER TABLESPACE temp SHRINK SPACE; ALTER TABLESPACE temp SHRINK TEMPFILE &#39;/path/tempfile.dbf&#39;; ``` #### **2. 优化LOB存储参数** ```sql -- 检查LOB列的存储设置 SELECT table_name, column_name, cache, storage FROM dba_lobs WHERE owner = &#39;YOUR_SCHEMA&#39;; -- 修改为启用行内存储(避免使用临时表空间) ALTER TABLE your_table MODIFY LOB(your_lob_column) (STORAGE IN ROW); ``` #### **3. 使用临时表空间组** ```sql -- 创建临时表空间组 CREATE TEMPORARY TABLESPACE temp1 TEMPFILE &#39;/path/temp1.dbf&#39; SIZE 1G; CREATE TEMPORARY TABLESPACE temp2 TEMPFILE &#39;/path/temp2.dbf&#39; SIZE 1G; CREATE TEMPORARY TABLESPACE GROUP temp_grp; ALTER TABLESPACE temp1 TABLESPACE GROUP temp_grp; ALTER TABLESPACE temp2 TABLESPACE GROUP temp_grp; -- 设置为默认临时表空间 ALTER DATABASE DEFAULT TEMPORARY TABLESPACE temp_grp; ``` #### **4. 监控与诊断** ```sql -- 检查占用临时段的会话 SELECT s.sid, s.serial#, s.username, s.sql_id, t.blocks*8/1024 "MB Used" FROM v$session s JOIN v$tempseg_usage t ON s.saddr = t.session_addr; -- 检查LOB操作是否使用临时表空间 SELECT * FROM v$temp_lob; ``` #### **5. 应用补丁** - 检查是否应用以下关键补丁: - **Bug 1296652.1**:修复临时LOB空间未释放问题。 - **PSU 11.2.0.4.3+**:包含多个临时段管理优化[^2]。 - 升级到更高版本(如12c+)可彻底解决部分遗留问题。 #### **6. 重启数据库(终极方案)** 若临时段被锁定无法释放,重启实例会强制清理所有临时段: ```bash sqlplus / as sysdba > shutdown immediate > startup ``` --- ### **预防措施** 1. **代码优化**: - 显式释放LOB资源:执行`DBMS_LOB.FREETEMPORARY(lob_loc)`。 - 避免在循环中创建临时LOB。 2. **定期维护**: ```sql -- 每天检查临时表空间使用 SELECT tablespace_name, bytes_used/1024/1024 "Used (MB)" FROM v$temp_extent_pool; ``` 3. **参数调整**: ```sql -- 增加PGA减少临时表空间压力 ALTER SYSTEM SET pga_aggregate_target=4G; ``` --- ### **关键引用** > **诊断脚本**:`v$tempseg_usage` 和 `dba_lobs` 是定位问题的核心视图[^1]。 > **补丁修复**:MOS文档 #1296652.1 明确记录了11.2.0.4的LOB临时段泄漏缺陷[^2]。 > **重启必要性**:当临时段被标记为损坏时,重启是唯一解(Alert日志会记录`ORA-01578`错误)[^3]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值