• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    [Oracle] 解析在没有备份的情况下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_DATA\O06DMS0\UNDO1.O06DMS0'
    说明该undo文件已经损坏或丢失,把该文件offline之后就可以打开数据库了:
    SQL> alter database datafile 'I:\INTEL_DATA\O06DMS0\UNDO1.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_DATA\O06DMS0\UNDO2.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数据块损坏之10231内部事件不完全恢复
    • ORACLE检查找出损坏索引(Corrupt Indexes)的方法详解
    • Oracle数据库的备份与恢复
    • Oracle误删除表数据后的数据恢复详解
    • oracle冷备份恢复和oracle异机恢复使用方法
    • oracle如何恢复被覆盖的存储过程
    • Oracle数据库数据丢失恢复的几种方法总结
    • oracle drop table(表)数据恢复方法
    • ORACLE 数据库RMAN备份恢复
    • Oracle数据库不同损坏级别的恢复教程
    上一篇:[Oracle] 分析AWR报告的方法介绍
    下一篇:Oracle中获取执行计划的几种方法分析
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

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