日期:2014-05-16  浏览次数:20599 次

oracle temp表空间处理方法

一.检查过程
(1) 我们可以查查数据库alert日志
例如:/u0/admin/sm/bdump/alert_sm.log
数据库中并没有报temp表空间的错,一般来说不报错,可以先不管,因为没有temp表空间可能由于没有需要用到而不释放空间。

(2) 我们可以用这个语句查一下
SELECT se.username,sid,serial#,sql_address,machine,program,tablespace,segtype,contents
FROM v$session se,v$sort_usage su
WHERE se.saddr=su.session_addr;

其实v$session是会话信息,v$sort_usage是正在使用排序段的会话。
可以检查当前数据库有没有语句正在用排序段,如果有的话可以使用一下语句删除寻找出的相关语句:
SQL>alter system kill session 'sid,serial#';

(3) 检查temp表空间是不是自动扩展的
SQL>select file_name,bytes/1024/1024 "MB",autoextensible,tablespace_name from dba_temp_files;

(4) 查询目前数据库中默认的临时表空间
SQL>select * from database_properties where property_name like 'DEFAULT%';
或SQL>select username,temporary_tablespace from dba_users;

二.处理过程
(1) 重起数据库,看看有没有释放临时表空间
Smon进程会完成临时段释放,TEMP表空间的清理操作,不过很多的时侯我们的库是不允许down的,所以这种方法缺少了一点的应用机会,不过这种方法还是很好用的。

(2) 如果检查出temp表空间是自动扩展的,建议先修改成非自动扩展
由于数据库temp表空间是自动扩展,有可能它不断使用新的空间,建议先把它变成非自动扩展。
例如:
alter database tempfile '/u0/oradata/sm/temp01.dbf' autoextend off;

(3) 如果temp表空间不是自动扩展,而且空间比较小
例如:数据库的temp表空间只有1.6G,觉得可以扩大一点,扩大3G左右
SQL> alter system temp add tempfile '/u0/oradata/sm/temp02.dbf' size 3096M;

(4) 如果temp表空间由于自动扩展变得太大,可以新建一个temp表空间把它取代
详细可参看eygle大师的"Oracle9i中如何重建与切换临时表空间"
http://www.eygle.com/archives/2006/04/oracle9i_default_temporary_tablespace.html
例如:用temp2表空间取代temp表空间
SQL> create temporary tablespace temp2 tempfile '/opt/oracle/oradata/conner/temp1.dbf' size 10M autoextend off;
SQL> alter tablespace temp add tempfile '/opt/oracle/oradata/conner/temp2.dbf' size 20M;
SQL> alter database default temporary tablespace temp2;
SQL> drop tablespace temp;
最后在操作系统上把temp的文件删除,就可以释放空间。

(5) 如果使用的版本是oracle 10g以上,可以收缩表空间
SELECT se.username,sid,serial#,sql_address,machine,program,tablespace,segtype,contents
FROM v$session se,v$sort_usage su
WHERE se.saddr=su.session_addr;
其实v$session是会话信息,v$sort_usage是正在使用排序段的会话。
可以检查当前数据库有没有语句正在用排序段,如果有的话可以使用一下语句删除寻找出的相关语句:
SQL>alter system kill session 'sid,serial#';
SQL>Alter tablespace TEMP coalesce;

(6) 网上Metalink给出的一个方法  
修改一下TEMP表空间的storage参数,让Smon进程观注一下临时段,从而达到清理和TEMP表空间的目的。    
SQL>alter tablespace temp increase 1;   
SQL>alter tablespace temp increase 0;

(7) 网上给出诊断事件的一种方法
确定TEMP表空间的ts#
SQL> select ts#, name from sys.ts$ ;

       TS# NAME
---------- ------------------------
         0 SYSTEM
         1 UNDOTBS1
         2 TEMP
         3 INDX
         4 TOOLS
         5 USERS
         6 DKH_DATA
         7 DKH_INDX
         8 PHS_DATA
         9 PHS_INDX

10 rows selected.

执行清理操作
SQL>alter session set events 'immediate trace name DROP_SEGMENTS level 3' ;

说明:
temp表空间的TS# 为 2*, So TS#+ 1= 3


PS注意几个问题:
(1) 在oracle中,temp表空间是独立于其他的表空间的(回滚表空间UNDOTBS,数据表空间DATATBS等),因为它的数据是临时的,不用保存的
所以查数据表都不一样:
temp:    dba_temp_files v$tempfile
其他:    dba_data_files v$datafile
完成的说,整个数据库的大小是由 temp + 其他表空间大小,一般我们就只算其他表空间大小,例如在月报中

(2) 建表空间不一样
temp表空间:
SQL>create temporary tablespace temp2 tempfile '/opt/oracle/oradata/conner/temp1.dbf' size 10M autoextend off;

数据表空间:
SQL>create tablespace test_a datafile '/home/oracle/oradata/test/test_a.dbf' size 100m extent management local segment space management auto;

undo表空间
SQL> create UNDO TABLESPACE undotbs_01 DATAFILE 'C:/Oracle/Ordata/TSH1/undo0101.dbf' SIZE 100M REUSE AUTOEXTEND off;

(3) 加表空间的方法不一样
temp表空间
SQL> alter tablespace temp add tempfile '/opt/oracle/oradata/conner/temp2.dbf' size 20M autoextend off;

数据表空间和UNDO表空间一样
SQL> alter tablespace test_a add datafile '/opt/oracle/oradata/conner/abc.dbf' size 10M autoextend off;
SQL> alter tablespace undotbs_01 add datafile '/opt/oracle/oradata/conner/undotbs_02.dbf' size 10M autoextend off;
?