您当前的位置: 首页 > 数据库教程 > Oracle教程 > Oracle] 解析在没有备份的情况下undo损坏怎么办

Oracle] 解析在没有备份的情况下undo损坏怎么办

作者:不详 来源:网络 发布时间: 2014-09-01 11:38 点击:
Oracle在运行中很不幸遇到undo损坏,当然最好的方法是完全恢复,但如果是在没有备份的情况下undo损坏怎么办?以下就为大家介绍出现这种情况的解决办法,需要的朋友参考下 如果Oracle在运行中很不幸遇到undo损坏,当然最好的方法是完全恢复,不过如果没有备份,可以采用

Oracle] 解析在没有备份的情况下undo损坏怎么办

  Oracle在运行中很不幸遇到undo损坏,当然最好的方法是完全恢复,但如果是在没有备份的情况下undo损坏怎么办?以下就为大家介绍出现这种情况的解决办法,需要的朋友参考下

  如果Oracle在运行中很不幸遇到undo损坏,当然最好的方法是完全恢复,不过如果没有备份,可以采用一种非常规的手段(利用Oracle的隐藏参数),如果此时undo包含未提交的事务,会造成一点点的数据丢失(一般都是可忍受的),如果没有未提交的事务,则不会有数据丢失。其主要步骤有:

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

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

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

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

  实验如下:

  Step 1.

  
如果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;

  打开数据库的目的是为了找出受影响的回滚段:

  
SQL> 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    undo1

  关闭数据库:

  
SQL> shutdown immediate;

  Step 2.

  
创建一个临时的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重新启动数据库:

  
SQL> startup pfile='H:initO06DMS0.ora'

  Step 3.

  
手动删除受影响的回滚段:

  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表空间:

  
SQL> drop tablespace undo1 including contents;

  重建新的undo表空间:

  
SQL> create undo tablespace undo2 datafile 'I:INTEL_DATAO06DMS0UNDO2.O06DMS0' size 100m;

  创建新的spfile,覆盖旧的spfile:

  
SQL> create spfile from pfile='H:initO06DMS0.ora';

  关闭数据库:

  
SQL> shutdown immediate;

  Step 4.

  以原来的spfile启动数据库:

  
SQL> startup;

  还原undo表空间管理为自动:

  
SQL> alter system set undo_management='auto' scope=spfile;

  取消隐藏参数的设置:

  
SQL> alter system reset "_offline_rollback_segments" scope=spfile;

  重启使其生效:

  
SQL> shutdown immediate;

  SQL> startup

  SQL> show parameter undo

  NAME                               TYPE      VALUE

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

  undo_management                    string    AUTO

  undo_retention                     integer   900

  undo_tablespace                    string    undo2

  最终检查一下:

  
SQL> 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
分享到:
本文"Oracle] 解析在没有备份的情况下undo损坏怎么办"由远航站长收集整理而来,仅供大家学习与参考使用。更多网站制作教程尽在远航站长站。
顶一下
(0)
0%
踩一下
(0)
0%
[点击 次] [返回上一页] [打印]
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 密码: 验证码:
关于本站 - 联系我们 - 广告合作 - 网站声明 - 友情连接- 网站地图 - 站点地图 - 返回顶部
Copyright © 2007-2013 www.yhzhan.com(远航站长). All Rights Reserved .
远航站长:为中小站长提供最佳的学习与交流平台,提供网页制作与网站编程等各类网站制作教程.
官方QQ:445490277 网站群:26680406 网站备案号:豫ICP备07500620号-4