Oracle 释放过度使用的Undo表空间 故障现象:UNDO表空间越来越大,长此下去最终数据因为磁盘空间不足而崩溃; 问题分析:产生问题的原因主要以下两点: 1. 有较大的事务量让Oracle Undo自动扩展,产生过度占用磁盘空间的情况; 2. 有较大事务没有收缩或者没有提交所导制; 说 明:本问题在ORACLE系统管理中属于比较正常的一现象,日常维护多注意对磁盘空间的监控。 备 份: (如果没有在线事务,可以不做,关闭监听) $>exp vas/vas file=/opt/oracle/data_1.dmp,/opt/oracle/data_2.dmp log=/opt/oracle/date.log owner=vas rows=y indexes=y compress=n buffer=65536 feedback=100000 volsize=0 filesize=1000M 解决步骤: 1. 启动SQLPLUS,并用sys登陆到数据库。 #su - oracle $>sqlplus /nolog SQL*Plus: Release 9.2.0.4.0 - Production on Wed Nov 8 13:45:10 2006 Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved. SQL> conn as sysdba; Connected. 2. 查找数据库的UNDO表空间名 #cat $ORACLE_HOME/dbs/initddptest.ora …… *.undo_management=’AUTO’ *.undo_retention=10800 *.undo_tablespace=’UNDOTBS2’ …… 3. 确认UNDO表空间; SQL> select name from v$tablespace; NAME ------------------------------ CWMLITE DRSYS EXAMPLE INDX ODM SYSTEM TOOLS USERS XDB TEMP TESTLIB UNDOTBS2 4. 检查数据库UNDO表空间占用空间情况以及数据文件存放位置; SQL>select file_name,bytes/1024/1024 from dba_data_files 2 where tablespace_name like 'UNDOTBS2'; 5. 查看回滚段的使用情况,哪个用户正在使用回滚段的资源,如果有用户最好更换时间(特别是生产环境)。 SQL> select s.username, u.name from v$transaction t,v$rollstat r, 2 v$rollname u,v$session s where s.taddr=t.addr and 3 t.xidusn=r.usn and r.usn=u.usn order by s.username; 6. 检查UNDO Segment状态; SQL> select usn,xacts,rssize/1024/1024/1024,hwmsize/1024/1024/1024,shrinks 2 from v$rollstat order by rssize; 7. 创建新的UNDO表空间,并设置自动扩展参数; SQL> create undo tablespace undotbs1 datafile '/oradata/oradata/ddptest/UNDOTBS1.dbf' size 1000m reuse autoextend on next 800m maxsize unlimited; Tablespace created. 8. 动态更改spfile配置文件; SQL> alter system set undo_tablespace=undotbs1 scope=both; System altered. 9. 等待原UNDO表空间所有UNDO SEGMENT OFFLINE; SQL> select usn,xacts,status,rssize/1024/1024/1024,hwmsize/1024/1024/1024,shrinks 2 from v$rollstat order by rssize; 10. 再执行看UNDO表空间所有UNDO SEGMENT ONLINE; SQL> select usn,xacts,status,rssize/1024/1024/1024,hwmsize/1024/1024/1024,shrinks 2 from v$rollstat order by rssize; 11. 删除原有的UNDO表空间; SQL> drop tablespace undotbs2 including contents; Tablespace dropped. 12. 确认删除是否成功; SQL> select name from v$tablespace; NAME ------------------------------ CWMLITE DRSYS EXAMPLE INDX ODM SYSTEM TOOLS USERS XDB TEMP TESTLIB UNDOTBS1 12 rows selected. 13. 在做此步骤前,请到$ORACLE_HOME/dbs/init$ORACLE_SID.ora如下内容是否发生变更: #cat $ORACLE_HOME/dbs/initddptest.ora …… *.undo_management=’AUTO’ *.undo_retention=10800 *.undo_tablespace=’UNDOTBS2’ …… 如果没有发生变更请执行如下语句: SQL> create pfile from spfile; File created. 14. 册除原UNDO表空间的数据文件,其文件名为步骤中执行的结果。 #rm $ORACLE_BASE/oradata/$ORACLE_SID/undotbs02.dbf 附:UNDO表空间介绍 UNDO表空间用于存放UNDO数据,当执行DML操作(INSERT,UPDATE和DELETE)时,oracle会将这些操作的旧数据写入到 UNDO段,在oracle9i之前,管理UNDO数据时使用(Rollback Segment)完成的.从oracle9i开始,管理UNDO数据不仅可以使用回滚段,还可以使用UNDO表空间.因为规划和管理回滚段比较复杂,所有 oracle database 10g已经完全丢弃用回滚段.并且使用UNDO表空间来管理UNDO数据. UNDO数据也称为回滚(ROLLBACK)数据,它用于确保数据的一致性.当执行DML操作时,事务操作前的数据被称为UNDO记录.UNDO段用于保存事务所修改数据的旧值,其中存储着被修改数据块的位置以及修改前数据, UNDO数据的作用. 1,回退事务 当执行DML操作修改数据时,UNDO数据被存放到UNDO段,而新数据则被存放到数据段中,如果事务操作存在问题,旧需要回退事务,以取消事务变 化.假定用户A执行了语句UPDATE emp SET sal=1000 WHERE empno=7788后发现,应该修改雇员7963的工资,而不是雇员7788的工资,那么通过执行ROLLBACK语句可以取消事务变化.当执行 ROLLBACK命令时,oracle会将UNDO段的UNDO数据800写回的数据段中. 2,读一致性 用户检索数据库数据时,oracle总是使用用户只能看到被提交过的数据(读取提交)或特定时间点的数据(SELECT语句时间点).这样可以确保 数据的一致性.例如,当用户A执行语句UPDATE emp SET sal=1000 WHERE empno=7788时,UNDO记录会被存放到回滚段中,而新数据则会存放到EMP段中;假定此时该数据尚未提交,并且用户B执行SELECT sal FROM emp WHERE empno=7788,此时用户B将取得UNDO数据800,而该数据正是在UNDO记录中取得的. 3,事务恢复 事务恢复是例程恢复的一部分,它是由oracle server自动完成的.如果在数据库运行过程中出现例程失败(如断电,内存故障,后台进程故障等),那么当重启oracle server时,后台进程SMON会自动执行例程恢复,执行例程恢复时,oracl会重新做所有未应用的记录.回退未提交事务. 4,倒叙查询(FlashBack Query) 倒叙查询用于取得特定时间点的数据库数据,它是9i新增加的特性,假定当前时间为上午11:00,某用户在上午10:00执行UPDATE emp SET sal=3500 WHERE empno=7788语句,修改并提交了事务(雇员原工资为3000),为了取