当对数据库中的表进行查询时,使用undo表空间暂存查询结果(oracle8i为rollback表空间),通常情况下结果集越大undo表空间也会增加。在oracle9i中提供了一个AUM(Auto UNDO Managment)工具来自动管理undo表空间,但大量事实发现,aum只能自动增加表空间,收缩表空间的功能很不理想(这一点上个人感觉还不如oracle8i手工管理rollback表空间方便)。 于是导致以上问题的出现。
解决的方法如下:
一、针对temp表空间
temp表空间的重建比较简单,不需要关闭数据库。步骤如下:
1。以system用户进入;
2.create temporary tablespace TEMP2 TEMPFILE ‘/oracle/u01/oracle/oradata/BIZDB/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 ‘/oracle/u01/oracle/oradata/BIZDB/temp01.dbf’ SIZE 512M REUSE AUTOEXTEND ON NEXT 640K MAXSIZE UNLIMITED; –重新创建临时表空间
6.alter database default temporary tablespace temp; –重置缺省临时表空间为新建的temp表空间
7.drop tablespace temp2 including contents and datafiles;–删除中转用临时表空间
8.alter user narrowad temporary tablespace temp; –重新指定用户表空间为重建的临时表空间
完成!
二、undo表空间
重建undo表空间比较复杂,需要关闭数据库,并需要sysdba权限来操作。步骤如下:
1。先以system重户登陆;
select file_name,bytes/1024/1024 from dba_data_files where tablespace_name like ‘UNDOTBS1′; –查询undo表空间目前的大小
select usn,xacts,rssize/1024/1024/1024,hwmsize/1024/1024/1024,shrinks from v$rollstat order by rssize; –每个回滚段的状态
create undo tablespace undotbs2 datafile ‘/oracle/u01/oracle/oradata/BHVHDB/undotbs02.dbf’ SIZE 2000M; –创建一个新的undotbs2表空间
关掉数据库
以sysdba权限登陆:
sqlplus /nolog
connect / as sysdba
startup mount
alter database open;
show parameter undo –查看当前undo表空间的参数
select name from v$tablespace; –查看当前在线的所有表空间
alter system set undo_tablespace=undotbs2 scope=both; //在执行该步骤时如果出现错误 则表示在启动数据库时加载的不是spfile配置文件 而是init文件。因为该命令需要同时在数据库中修改undo表空间的指向,也需要修改spfile配置文件中的参数指向。以上错误的解决办法如下:执行create spfile from pfile; 在系统配置中增加spfile的指向
关掉数据库
sqlplus /nolog
connect / as sysdba
startup mount
alter database open;
show parameter undo
select name from v$tablespace;
alter system set undo_tablespace=undotbs2 scope=both; //该步骤应该执行正确
select usn,xacts,status,rssize/1024/1024/1024,hwmsize/1024/1024/1024,shrinks from v$rollstat order by rssize; 等待原UNDO表空间所有UNDO SEGMENT OFFLINE
drop tablespace undotbs1 including contents and datafiles;
胜利完成!