临时表空间爆满的处理办法

来源:互联网 发布:战国策 知乎 编辑:程序博客网 时间:2024/04/28 19:37
1这个是查看当前占用临时表空间的sql
Select se.username,
       se.sid,
       su.extents,
       su.blocks * to_number(rtrim(p.value)) as Space,
       tablespace,
       segtype,
       sql_text
  from v$sort_usage su, v$parameter p, v$session se, v$sql s
  where p.name = 'db_block_size'
       and su.session_addr = se.saddr
       and s.hash_value = su.sqlhash
       and s.address = su.sqladdr
 order by se.username, se.sid;

千万注意,这个在rac环境下,db1和db2看到的东西是不一样的,包括v$sort_segment和V$SORT_USAGE

 
2.切换临时表空间,没有就建一个新的

create temporary tablespace temp2 tempfile '+VGDATA/boss/tempfile/temp2.dbf' size 32000m;
alter database default temporary tablespace temp2;
select * from database_properties where property_name='DEFAULT_TEMP_TABLESPACE';  --看看是不是这个

3再看所有程序切过去没有,切了就把原来的临时表空间drop掉

删除表空间temp,但不删除其文件   用:drop tablespace temp;删除表空间temp同时删除表空间的数据对象 用drop tablespace temp including contents;删除表空间temp及其包含数据对象以及数据文件 用drop tablespace temp including contents and datafiles;

由于9i之后临时表空间用指针,用这个才可以真正看到temp表空间的使用率,看v$sort_segment也可以


SELECT A.TABLESPACE_NAME, A.ALLOC_KB - NVL(B.USED_KB, 0), ROUND(NVL(B.USED_KB / A.ALLOC_KB, 0) * 100, 2) 
   FROM (SELECT TABLESPACE_NAME, SUM(BYTES) / 1024 ALLOC_KB
           FROM DBA_TEMP_FILES
          GROUP BY TABLESPACE_NAME) A,
        (SELECT TABLESPACE, SUM(BLOCKS) * 8 USED_KB
           FROM V$SORT_USAGE
          GROUP BY TABLESPACE) B
 WHERE A.TABLESPACE_NAME = B.TABLESPACE(+);

由于以上语句默认block大小为8k,仅当show parameter db_block_size为8192的时候正确。

select TABLESPACE_NAME,total_extents,total_blocks,free_extents,free_blocks from v$sort_segment; 
这个看到空闲的块
0 0
原创粉丝点击