日期:2014-05-16 浏览次数:20605 次
一.检查过程 (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;?