alert日志
大家应该都知道在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表空间替换成功!数据库正常运行!大功告成!
友情提醒:记得要将参数文件中添加的隐含参数注释掉,重新启动数据库