oracle跳过undo回滚段启动,[Oracle] 解析在没有备份的情况下undo损坏怎么办

如果Oracle在运行中很不幸遇到undo损坏,当然最好的方法是完全恢复,不过如果没有备份,可以采用一种非常规的手段(利用Oracle的隐藏参数),

如果此时undo包含未提交的事务,会造成一点点的数据丢失(一般都是可忍受的),如果没有未提交的事务,则不会有数据丢失。其主要步骤有:

1. 修改undo表空间管理为手动;

2. 设置隐藏参数(_offline_rollback_segments或_corrupted_rollback_segments)标识受影响的回滚段,使Oracle忽略其上的未提交事务;

3. 手动删除受影响的回滚段和undo表空间,然后重建新的undo表空间;

4. 还原undo表空间管理为自动。

实验如下:如果undo数据文件损坏,数据库只能到mount状态,open时会出现以下错误:

ORA-01157: cannot identify/lock data file 14 - see DBWR trace file

ORA-01110: data file 14: 'I:\INTEL_DATA\O06DMS0\UNDO1.O06DMS0'

说明该undo文件已经损坏或丢失,把该文件offline之后就可以打开数据库了:

sql> alter database datafile 'I:\INTEL_DATA\O06DMS0\UNDO1.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

------------------------------------ ----------- -------------

undo_management string AUTO

undo_retention integer 900

undo_tablespace string undo1shutdown 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_DATA\O06DMS0\UNDO2.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

------------------------------------ ----------- -------------------

undo_management string AUTO

undo_retention integer 900

undo_tablespace string undo2

最终检查一下:select segment_name,status from dba_rollback_segs;

SEGMENT_NAME STATUS

------------------------------ ----------------

SYSTEM ONLINE

_SYSSMU40_1968985325$ ONLINE

_SYSSMU39_4040503138$ ONLINE

_SYSSMU38_4059847715$ ONLINE

_SYSSMU37_2692202156$ ONLINE

_SYSSMU36_2617425201$ ONLINE

_SYSSMU35_1133967719$ ONLINE

_SYSSMU34_1916939664$ ONLINE

_SYSSMU33_99444166$ ONLINE

_SYSSMU32_162619813$ ONLINE

_SYSSMU31_830375278$ ONLINE

总结

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值