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

Oracle 11G rollback段出错修复
测试服务器的磁盘满了,经分析由于测试服务器经常进行大量数据清理,UNDO表空间占了太多空间,于是打算新建UNDO表空间(UNDOTBS2),把旧(UNDOTBS1)的清理掉。
删除旧空间的时候发现怎么都删不了,报错说有回滚段被占用。
于是用查看回滚段情况:
select owner,segment_name,SEGMENT_ID,FILE_ID,BLOCK_ID,STATUS,tablespace_name from dba_rollback_segs;
?
结果显示?_SYSSMU14_1571488672$,_SYSSMU16_3431913684$?等多个在UNDOTBS1上的回滚段的STATUS显示“NEEDS RECOVERY”,即这些回滚段有错误需要修复,阻止了删除UNDOTBS1。
?
上网搜索相关修复方法,按实际情况拟定修复方案,最后成功修复。方案如下:
  1. 用实例的system账号以DBA身份登录sqlplus:
    • sqlplus system/**** as sysdba
  2. 关闭数据库:
    • shutdown immediate
  3. 创建pfile文件:
    • create pfile 'c:/pfile.ora' from spfile
  4. 修改pfile文件,添加以下参数:
    • *.undo_management='Manual'
    • _corrupted_rollback_segments=('_SYSSMU14_1571488672$','_SYSSMU16_3431913684$')
  5. 启动数据库:
    • startup pfile='c:/pfile.ora'
  6. 删除状态为needs Recovery的segment:
    • drop rollback segment "_SYSSMU14_1571488672$";?
    • 注意是用双引号,删除会有报错信息,只要删除了就忽略出错信息吧。
  7. 重启数据库并删除undo表空间:
    • drop tablespace UNDOTBS1 including contents and datafiles;
  8. 修改pfile.ora,去除之前添加的隐藏参数启动数据库:
    • startup pfile='c:/pfile.ora'
  9. 检查数据库是否能正常工作。
  10. 检查正常,确认完成修复,重启服务器。
?
?
以下为修复中使用过的一些命令记录:
查询正在运行的事务的回滚段使用情况
select s.username, u.name from v$transaction t,v$rollstat r,?v$rollname u,v$session s where s.taddr=t.addr and?t.xidusn=r.usn and r.usn=u.usn order by s.username;

查询数据文件情况
select * from dba_data_files?where tablespace_name like 'UNDOTBS1';

查询回滚空间的使用情况
select usn,xacts,status,rssize/1024/1024/1024,?hwmsize/1024/1024/1024,shrinks from v$rollstat?order by rssize;

创建新的UNDO表空间
create undo tablespace undotbs2 datafile 'D:\app\Administrator\oradata\QAS\UNDOTBS02.DBF' size 10m?reuse autoextend on next 100m maxsize 20g;

指定系统使用新的UNDO表空间
alter system set undo_tablespace=undotbs2 scope=both;

显示UNDO相关参数
show parameter undo;
?
几个参考链接:
http://blog.csdn.net/life_dba/article/details/9139353
http://blog.csdn.net/cockcrow/article/details/598703
http://www.dba-oracle.com/t_fix_undo_log_corruption.htm