暂无图片
暂无图片
3
暂无图片
暂无图片
暂无图片

Oracle数据库出现UNDO坏块!

新运维新数据 2021-11-03
2635

各位新朋友~记得先点蓝字关注我哦~


大家应该都知道在Oracle数据库中有一个undo表空间,它扮演了十分重要的角色,它的主要作用就是数据的回滚。其中undo表空间中的undo块记录了数据修改之前的操作,可以帮助我们随时对数据的修改进行回退!但是,undo存在坏块那怎么办呢?


坏块概念

首先,小编给大家大概介绍一下什么是坏块?在数据库中有一个概念叫做数据块的一致性,Oracle的数据块的一致性包括了两个层次:物理一致性和逻辑一致性,如果一个数据块在这两个层次上存在不一致性,那它就是一个坏块,数据库后台日志就会告警ORA-1578或者是ORA-600错误。


坏块处理方案

在这里给大家分享一个案例,从以下的日志可以看到Oracle data block corrupted(file#116,block#836180),这个输出的意思就是第116号数据文件的第836180块已经损坏了,通过视图查询得知,这个116号数据文件就是undo表空间。这时候的SMON进程为了保护数据的一致性,强制关闭了数据库,让我们无法打开数据库。



当然大家不要慌,小编今天就告诉你们当undo出现坏块要如何解决。


小编的思路是这样的,需要创建出新的undotbs2表空间替换掉已经坏掉的undotbs1表空间,创建新的undo表空是需要打开数据库的,但是只要数据库一启动,SMON进程就会强行关闭数据库,那不就走进了死胡同了吗?


数据文件脱机

这时候,我们需要在数据库mount的状态下,将带有坏块的#116数据文件进行offline drop脱机处理,这样SMON进程就暂时检测不到坏块,成功拉起数据库!


    startup mount
    alter database datafile 116 offline drop;
    alter database open


    创建新undo表空间

    前面小编也说到了,undo表空间在数据库中扮演了十分重要的角色,数据库怎么能一日没有undo呢?

    所以我们打开数据库以后,需要创建一个新的undo表空间,并设置为默认表空间,


      create undo tablespace undotbs2 datafile '/oradata/ETL/UNDOTBS2.dbf' size 1G autoextend on;
      alter system set undo_tablespace=undotbs2 scope=both;


      删除旧undo表空间

      新的表空间建立好以后,原来坏掉的undo表空间我们就可以彻底删除了,但是在删除的过程中发现原undo表空间仍然存在活跃的undo段

        drop tablespace undotbs1 including contents and datafiles;


        原来还有活跃的旧undo段在,所以数据库阻止了我们的删除!


        查询相关视图,获取所有原undo表空间仍活跃的undo段

          select status,segment_name from dba_rollback_segs where status not in ('OFFLINE') and tablespace_name='UNDOTBS1';


          将这些活跃的undo段添加到pfile参数文件中,进行跳过处理。

            *._allow_resetlogs_corruption=true
            *._allow_terminal_recovery_corruption=true
            *._corrupted_rollback_segments=(_SYSSMU10_1197734989$,_SYSSMU20_1050586925$,_SYSSMU26_3131552754$,_SYSSMU28_1349284785$,_SYSSMU32_980979620$,_SYSSMU34_3070439537$,_SYSSMU47_2705532003$,_SYSSMU50_602588002$,_SYSSMU51_201410034$,_SYSSMU58_3524391680$,_SYSSMU59_773718799$,_SYSSMU60_1941620517$,_SYSSMU61_1757677461$,_SYSSMU64_3091325918$,_SYSSMU65_2877150887$,_SYSSMU66_2848890605$)

            关闭数据库,以修改后的pfile文件进行启动数据库

              startup  pfile=/oracle/product/11.2.0/db_1/dbs/initETL.ora;


              这时候,没有活跃段的阻拦,我们成功删除了旧undo表空间及其的所有数据

                drop tablespace undotbs1 including contents and datafiles;


                至此,新的undo表空间替换成功!数据库正常运行!大功告成!小编友情提醒:记得要将参数文件中添加的隐含参数注释掉,重新启动数据库


                怎么样,大家学会了吗?如果还有疑问,欢迎来美创学院找我!



                美创运维中心数据库服务团队拥有Oracle ACE 1人、OCM 10余人、数十名Oracle OCP、MySQL OCP、红帽RHCA、中间件weblogic、tuxedo认证、达梦工程师 ,著有《Oracle DBA实战攻略》,《Oracle数据库性能优化方法和最佳实践》,《Oracle内核技术揭秘》等多本数据运维优化书籍。目前运维各类数据库合计2000余套,精通Oracle、MySQL、SQLServer、DB2、PostgreSQL、达梦等主流商业和开源数据库。并成为首批国内达梦战略合作伙伴之一,拥有海量经验和完善的人员培养体系。并同时提供超融合,私有云整体解决方案。



                最后修改时间:2021-11-03 09:57:15
                文章转载自新运维新数据,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                评论