undo 表空间中的undo块记录的是数据修改之前的操作,可以帮助我们随时对数据的修改进行回退,但是当undo出现了坏块怎么办呢?
坏块?在数据库中有一个数据库一致性的概念,在oracle中数据库一致性包括两个层次:物理一致性和逻辑一致性,如果一个数据块在这两个层次上存在不一致性,那它就是一个坏块,数据后后台就会出现告警ORA-1578或ORA-600这种错误。
这里就说当undo表空间出现坏块时,该怎样做?
1.首先我们需要停掉监听,防止还有程序在对数据进行操作
2.然后建立新的undotbs2表空间代替已经坏掉的undotbs1表空间。但是这里有一个问题是:创建表空间需要数据库在open状态,而当有undo坏块时,数据库是不能启动到open状态的,因为一启动,SMON进程就会强行关闭数据库。
如果要是出现2这种情况,我们首先需要把数据库启动到mount状态,然后让出现坏块的表空间所对应的文件处于数据文件脱机状态
startup mount; alter database datafile File_id offline drop; alter database open;
然后创建新的表空间,并修改undo_tablespace参数
create undo tablespace undotbs2 datafile '路径' size 1G autoextend on; alter system set undo_tablespace=undotbs2 scope=both;
3.删除旧的表空间
新的表空间创建后,删除旧的表空间
drop tablespace undotbs1 including contents and datafiles;
注意:如果此时删不掉,说明数据库中原undo表空间仍然存在活跃的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$,xxxx,xxxx)
最后使用pfile进行启动
startup pfile=/oracle/product/11.2.0/db_1/dbs/initETL.ora;
当启动完了之后再删除就旧的表空间
补充几个常用的命令:
select * from v$rollname; select * from undo$; select * from v$tablespace; ##使数据文件处于在线状态 alter database datafile File_id online;