如何释放过度占用的Shrink Undo表空间
  环境:
 
  OS:Red Hat Enterprise Linux AS release 4 (Nahant)
  DB:Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
  现在我们可以采用如下步骤回收UNDO空间:
 
  1.确认文件
 
  SQL> select file_name,bytes/1024/1024 from dba_data_files
   2 where tablespace_name like 'UNDOTBS1';
 
  FILE_NAME
  ---------------------------------------------------------------------
  BYTES/1024/1024
  ---------------
  +ORADG/danaly/datafile/undotbs1.265.600173875
       27810
       
  2.检查UNDO Segment状态
 
  SQL> select usn,xacts,rssize/1024/1024/1024,hwmsize/1024/1024/1024,shrinks
   2 from v$rollstat order by rssize;
 
  USN   XACTS RSSIZE/1024/1024/1024 HWMSIZE/1024/1024/1024  SHRINKS
  ------- ---------- --------------------- ---------------------- ----------
   0     0      .000358582      .000358582     0
   2     0      .071517944      .071517944     0
   3     0      .13722229       .13722229     0
   9     0      .236984253      .236984253     0
   10    0      .625144958      .625144958     0
   5     1      1.22946167      1.22946167     0
   8     0      1.27175903      1.27175903     0
   4     1      1.27895355      1.27895355     0
   7     0      1.56770325      1.56770325     0
   1     0      2.02474976      2.02474976     0
   6     0      2.9671936       2.9671936     0
 
  11 rows selected.
 
  3.创建新的UNDO表空间
 
  SQL> create undo tablespace undotbs2;
 
  Tablespace created.
 
  4.切换UNDO表空间为新的UNDO表空间
 
  SQL> alter system set undo_tablespace=undotbs2 scope=both;
 
  System altered.
 
  此处使用spfile需要注意,以前曾经记录过这样一个案例:Oracle诊断案例-Spfile案例一则
 
  5.等待原UNDO表空间所有UNDO SEGMENT OFFLINE
SQL> select usn,xacts,status,rssize/1024/1024/1024,hwmsize/1024/1024/1024,shrinks
  from v$rollstat order by rssize;
 
USN   XACTS STATUS     RSSIZE/1024/1024/1024 HWMSIZE/1024/1024/1024  SHRINKS
  ----- ---------- --------------- --------------------- ---------------------- ----------
  14     0 ONLINE          .000114441      .000114441     0
  19     0 ONLINE          .000114441      .000114441     0
  11     0 ONLINE          .000114441      .000114441     0
  12     0 ONLINE          .000114441      .000114441     0
  13     0 ONLINE          .000114441      .000114441     0
  20     0 ONLINE          .000114441      .000114441     0
  15     1 ONLINE          .000114441      .000114441     0
  16     0 ONLINE          .000114441      .000114441     0
  17     0 ONLINE          .000114441      .000114441     0
  18     0 ONLINE          .000114441      .000114441     0
  0     0 ONLINE          .000358582      .000358582     0
 
  USN  XACTS  STATUS     RSSIZE/1024/1024/1024 HWMSIZE/1024/1024/1024 SHRINKS
  ---- ------- --------------- --------------------- ---------------------- ----------
  6     0 PENDING OFFLINE      2.9671936       2.9671936     0
 
  12 rows selected.
 
  再看:
  11:32:11 SQL> /
 
  USN XACTS  STATUS    RSSIZE/1024/1024/1024 HWMSIZE/1024/1024/1024  SHRINKS
  ---- ------- --------------- --------------------- ---------------------- --------
  15    1  ONLINE        .000114441    .000114441     0
  11    0  ONLINE        .000114441    .000114441     0
  12    0  ONLINE        .000114441    .000114441     0
  13    0  ONLINE        .000114441    .000114441     0
  14    0  ONLINE        .000114441    .000114441     0
  20    0  ONLINE        .000114441    .000114441     0
  16    0  ONLINE        .000114441    .000114441     0
  17    0  ONLINE        .000114441    .000114441     0
  18    0  ONLINE        .000114441    .000114441     0
  19    0  ONLINE        .000114441    .000114441     0
   0    0  ONLINE        .000358582    .000358582     0
 
  11 rows selected.
 
  Elapsed: 00:00:00.00
 
  6.删除原UNDO表空间
 
  11:34:00 SQL> drop tablespace undotbs1 including contents;
 
  Tablespace dropped.
 
drop删除表  Elapsed: 00:00:03.13
 
  7.检查空间情况
 
  空间已经释放
如何处理Oracle中TEMP表空间满的问题?
正常来说,在完成Select语句、create index等一些使用TEMP表空间的排序操作后,Oracle是会自动释放掉临时段a的。但有些有侯我们则会遇到临时段没有被释放,TEMP表空间几乎满的状况,甚至是我们重启了数据库仍没有解决问题。这个问题在论坛中也常被网友问到,下面我总结一下,给出几种处理方法。
 
方法一、重启库
 
库重启时,Smon进程会完成临时段释放,TEMP表空间的清理操作,不过很多的时侯我们的库是不允许down,所以这种方法缺少了一点的应用机会,不过这种方法还是很好用的。
 
方法二Metalink给出的一个方法
 
修改一下TEMP表空间的storage参数,让Smon进程观注一下临时段,从而达到清理和TEMP表空间的目的。
 
SQL>alter tablespace temp increase 1;
SQL>alter tablespace temp increase 0;
 
方法三、我常用的一个方法,具体内容如下:
 
1、 使用如下语句a查看一下认谁在用临时段
 
SELECT username,
      sid,
      serial#,
      sql_address,
      machine,
      program,
      tablespace,
      segtype,
      contents
  FROM v$session se,
      v$sort_usage su
WHERE se.saddr=su.session_addr     
 
2、  那些正在使用临时段的进程
SQL>Alter system kill session 'sid,serial#';
 
3、把TEMP表空间回缩一下
SQL>Alter tablespace TEMP coalesce;
 
法四、使用诊断事件的一种方法,也是被我认为是“杀手锏”的一种方法
 
1、 确定TEMP表空间的ts#
 
SQL>select ts#, name from sys.ts$ ;
TS# NAME
-----------------------
0 SYSYEM
1 RBS
2 USERS
3* TEMP
4 TOOLS
5 INDX
6 DRSYS
2、 执行清理操作
SQL>alter session set events 'immediate trace name DROP_SEGMENTS level 4' ;
说明:
temp
temp处理
temp(非本地管理表空间) 回收
可以将表空间的缺省存储参数pctincrease改为非0。一般将其设为1,如:
alter tablespace temp
default storage(pctincrease 1);
这样smon便会将自由范围自动合并。也可以手工合并自由范围:
alter tablespace temp coalesce;
否则就重建表空间:
1.startup --启动数据库
2.create temporary tablespace TEMP2 TEMPFILE '/home2/oracle/oradata/sysmon/temp02.dbf' SIZE 512M REUSE AUTOEXTEND ON NEXT 640K MAXSIZE UNLIMITED; --创建中转临时表空间
3.alter database default temporary tablespace temp2; --改变缺省临时表空间 为刚刚创建的新临时表空间temp2
4.drop tablespace temp including contents and datafiles;--删除原来临时表空间
5.create temporary tablespace TEMP TEMPFILE '/home2/oracle/oradata/sysmon/temp01.dbf' SIZE 512M REUSE AUTOEXTEND ON NEXT 640K MAXSIZE UNLIMITED; --重新创建临时表空间

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。