undo异常处理步骤(10g)

联系:手机/微信(+86 17813235971) QQ(107644445)QQ咨询惜分飞

标题:undo异常处理步骤(10g)

作者:惜分飞©版权所有[未经本人同意,不得以任何形式转载,否则有进一步追究法律责任的权利.]

1、启动数据库,发现错误
startup

2、查看是否是undo文件损坏引起
select a.ts#,a.name,b.name from v$datafile a,v$tablespace b where a.ts#=b.ts#;

3、损坏undo离线
alter database datafile n offline drop;

4、打开数据库
alter database open;

5、查看当前undo表空间,并确认是否是当前undo损坏,如果不是当前undo,直接执行8,否则继续
show parameter undo_tablespace;

6、创建新undo表空间
CREATE UNDO TABLESPACE UNDOTBSNEW DATAFILE
‘/opt/oracle/oradata/xifenfei/UNDOTBS01.dbf
SIZE 50M autoextend on next 10m maxsize 30G;

7、修改默认undo为新创建表空间
alter system set undo_tablespace=’UNDOTBSNEW’;

8、查询回滚段信息,为下面删除损坏undo的回滚段做到心中有底
select segment_name,status from dba_rollback_segs;

9、删除损坏undo,如果报ORA-01548错误,继续下面操作,否则跳到14
drop tablespace UNDOTBSOLD including contents and datafiles;

10、创建pfile文件
create pfile=’/tmp/pfile’ from spfile;

11、修改pfile文件,添加隐含参数
*._allow_resetlogs_corruption=true
*._corrupted_rollback_segments=(_SYSSMU1$,_SYSSMU2$,_SYSSMU3$,_SYSSMU4$,_SYSSMU5$,
_SYSSMU6$,_SYSSMU7$,_SYSSMU8$,_SYSSMU9$,_SYSSMU10$)

12、使用pfile启动数据库
startup pfile=’/tmp/pfile’

13、删除损坏undo
drop tablespace UNDOTBSOLD including contents and datafiles;

14、查看回滚段状态
select segment_name,status from dba_rollback_segs;

15、如果有损坏表空间回滚段还存在,手工删除
drop rollback segment “_SYSSMUx$”;

16、重启数据库
shutdown immediate
startup

此条目发表在 Oracle备份恢复 分类目录。将固定链接加入收藏夹。

undo异常处理步骤(10g)》有 6 条评论

  1. 低调人生 说:

    在第4步,打开数据库的时候,如果undo里面还有没有提交的事务,而且此时undo又损坏,数据库是不能打开的。
    我在10.2.0.5里面测试是不能打开的,即使我加了_corrupted_rollback_segments

    是的,11.2.0.3的测试也是这样的,如果undo表空间有未提交事务,而此时shutdown abort,即使加了上面的隐患参数及*._corrupted_rollback_segments=(_SYSSMU1_1240252155$,_SYSSMU2_111974964$,_SYSSMU3_4004931649$,_SYSSMU4_1126976075$,_SYSSMU5_4011504098$,_SYSSMU6_3654194381$,_SYSSMU7_4222772309$,_SYSSMU8_3612859353$,_SYSSMU9_3945653786$,_SYSSMU10_3271578125$)
    也不能打开数据库,纷飞哥可有好办法?

  2. ivyliu 说:

    在第4步,打开数据库的时候,如果undo里面还有没有提交的事务,而且此时undo又损坏,数据库是不能打开的。
    我在10.2.0.5里面测试是不能打开的,即使我加了_corrupted_rollback_segments

  3. 惜 分飞 说:

    Oracle 11g的缺省UNDO段命名,增加了一个Unix Time的时间戳在回滚段名称里

    SQL> select * from v$rollname;
     
           USN NAME
    ---------- ------------------------------
             0 SYSTEM
             1 _SYSSMU1_1518548437$
             2 _SYSSMU2_2082490410$
             3 _SYSSMU3_991555123$
             4 _SYSSMU4_2369290268$
             5 _SYSSMU5_1018230376$
             6 _SYSSMU6_1834113595$
             7 _SYSSMU7_137577888$
             8 _SYSSMU8_1557854099$
             9 _SYSSMU9_1126410412$
            10 _SYSSMU10_3176102001$
     
    11 rows selected
  4. 惜 分飞 说:

    对于异常undo处理,一定要先offline,否则会删除异常undo后,alert中可能会出现
    SMON:about undo segment N
    SMON:mark undo segment N as needs recovery
    此时隐含参数无法除掉(如果除掉数据库不能正常启动)

  5. 惜 分飞 说:

    为了保险起见,可以先删除rollback segment 再删除undo tablespace