Oracle中临时表空间的清理

2015-07-16 12:07:58 · 作者: · 浏览: 1

索引create或rebuild
Order by 或 group by
Distinct 操作
Union 或 intersect 或 minus
Sort-merge joins
analyze


重启数据库可以释放临时表空间,如果不能重启实例,而一直保持问题sql语句的执行,temp表空间会一直增长。即使重建了临时表空间,过一段时间后,临时表空间的使用率就达到99%,然后,表空间就开始增长,直到耗尽硬盘空间。如下图所示临时表空间,刚建立时是8G,现在已到32G:


Oracle中临时表空间的清理


为了防止临时表空间无限制的增加,我采用隔一段时间就重建临时表空间的方法,为了方便,我保留两组语句,轮流执行即可,假定现在临时表空间名称是temp,新建一个tempa表空间,删除temp表空间,方法如下:


create? temporary? tablespace? TEMPA? TEMPFILE? '/opt/app/oracle/oradata/orcl/tempa01.dbf '? SIZE? 8192M? REUSE? AUTOEXTEND? ON? NEXT? 1024K? MAXSIZE? UNLIMITED;? --创建中转临时表空间
alter? database? default? temporary? tablespace? tempa;? ? ? --改变缺省临时表空间


drop? tablespace? temp? including? contents? and? datafiles;? ? --删除原来临时表空间


新建的临时表空间如下图所示:


过一段时间,当临时表空间增长到一定的程度,再新建一个temp表空间,删除tempa表空间,即:


Oracle中临时表空间的清理


create? temporary? tablespace? TEMP? TEMPFILE? '/opt/app/oracle/oradata/orcl/temp01.dbf '? SIZE? 8192M? REUSE? AUTOEXTEND? ON? NEXT? 1024K? MAXSIZE? UNLIMITED;? --创建中转临时表空间
alter? database? default? temporary? tablespace? temp;? ? --改变缺省临时表空间
drop? tablespace? tempa? including? contents? and? datafiles;? --删除原来临时表空间


这样就可以保证临时表空间不至于过大,防止过多的占用有限的硬盘空间。


=====================================================


用下面语句可查看当前临时表空间使用空间大小与正在占用临时表空间的sql语句:


select sess.SID, segtype, blocks * 8 / 1000 "MB", sql_text
? from v$sort_usage sort, v$session sess, v$sql sql
?where sort.SESSION_ADDR = sess.SADDR
? and sql.ADDRESS = sess.SQL_ADDRESS
?order by blocks desc;


下面语句查询临时表空间的空闲程度:


select 'the ' || name || ' temp tablespaces ' || tablespace_name ||
? ? ? ' idle ' ||
? ? ? round(100 - (s.tot_used_blocks / s.total_blocks) * 100, 3) ||
? ? ? '% at ' || to_char(sysdate, 'yyyymmddhh24miss')
? from (select d.tablespace_name tablespace_name,
? ? ? ? ? ? ? nvl(sum(used_blocks), 0) tot_used_blocks,
? ? ? ? ? ? ? sum(blocks) total_blocks
? ? ? ? ? from v$sort_segment v, dba_temp_files d
? ? ? ? where d.tablespace_name = v.tablespace_name(+)
? ? ? ? group by d.tablespace_name) s,
? ? ? v$database;