[Oracle] 解析在没有备份的情况下undo损坏怎么办
如果Oracle在运行中很不幸遇到undo损坏,当然最好的方法是完全恢复,不过如果没有备份,可以采用一种非常规的手段(利用Oracle的隐藏参数), 如果此时undo包含未提交的事务,会造成一点点的数据丢失(一般都是可忍受的),如果没有未提交的事务,则不会有数据丢失。其主要步骤有:1. 修改undo表空间管理为手动; 实验如下:如果undo数据文件损坏,数据库只能到mount状态,open时会出现以下错误:ORA-01157: cannot identify/lock data file 14 - see DBWR trace file ORA-01110: data file 14: 'I:INTEL_DATAO06DMS0UNDO1.O06DMS0' 说明该undo文件已经损坏或丢失,把该文件offline之后就可以打开数据库了: SQL> alter database datafile 'I:INTEL_DATAO06DMS0UNDO1.O06DMS0' offline drop; SQL> alter database open; 打开数据库的目的是为了找出受影响的回滚段: select segment_name,status from dba_rollback_segs;SEGMENT_NAME STATUS ------------------------------ ---------------- SYSTEM ONLINE _SYSSMU10_1201331463$ OFFLINE _SYSSMU9_2926456744$ OFFLINE _SYSSMU8_640224757$ OFFLINE _SYSSMU7_3984293596$ OFFLINE _SYSSMU6_3694658906$ OFFLINE _SYSSMU5_3475919656$ OFFLINE _SYSSMU4_168502732$ OFFLINE _SYSSMU3_1987193959$ OFFLINE _SYSSMU2_3908286755$ OFFLINE _SYSSMU1_3281912951$ OFFLINE SQL> show parameter undo NAME TYPE VALUE 关闭数据库: shutdown immediate;
创建一个临时的pfile:SQL> create pfile='H:initO06DMS0.ora' from spfile; 修改pfile如下:*.undo_management='manual' -- undo表空间管理方式修改为手动*.undo_tablespace='undo2' --指定一个新的undo表空间 *._offline_rollback_segments=('_SYSSMU10_1201331463$','_SYSSMU9_2926456744$','_SYSSMU8_640224757$','_SYSSMU7_3984293596$','_SYSSMU6_3694658906$','_SYSSMU5_3475919656$','_SYSSMU4_168502732$','_SYSSMU3_1987193959$','_SYSSMU2_3908286755$','_SYSSMU1_3281912951$') --把所有受影响的回滚段都列在这里 并以改pfile重新启动数据库: startup pfile='H:initO06DMS0.ora'
手动删除受影响的回滚段:SQL>drop rollback segment "_SYSSMU10_1201331463$"; SQL>drop rollback segment "_SYSSMU9_2926456744$"; SQL>drop rollback segment "_SYSSMU8_640224757$"; SQL>drop rollback segment "_SYSSMU7_3984293596$"; SQL>drop rollback segment "_SYSSMU6_3694658906$"; SQL>drop rollback segment "_SYSSMU5_3475919656$"; SQL>drop rollback segment "_SYSSMU4_168502732$"; SQL>drop rollback segment "_SYSSMU3_1987193959$"; SQL>drop rollback segment "_SYSSMU2_3908286755$"; SQL>drop rollback segment "_SYSSMU1_3281912951$"; 手动删除旧的undo表空间: drop tablespace undo1 including contents;重建新的undo表空间: create undo tablespace undo2 datafile 'I:INTEL_DATAO06DMS0UNDO2.O06DMS0' size 100m;创建新的spfile,覆盖旧的spfile: create spfile from pfile='H:initO06DMS0.ora';关闭数据库: shutdown immediate;
以原来的spfile启动数据库: startup;还原undo表空间管理为自动: alter system set undo_management='auto' scope=spfile;取消隐藏参数的设置: alter system reset "_offline_rollback_segments" scope=spfile;重启使其生效: shutdown immediate;SQL> startup SQL> show parameter undo NAME TYPE VALUE 最终检查一下: select segment_name,status from dba_rollback_segs;
SEGMENT_NAME STATUS (编辑:莱芜站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |