zoukankan      html  css  js  c++  java
  • undo表空间故障特殊恢复(二)ORA01092: ORACLE 实例终止。强制断开连接 岁月无情

    undo表空间故障特殊恢复(二)


    这个测试的是instance recover(单实例里就是crash recovery)的恢复需要故障undo里的数据,
    一般的情况instance recover使用联机日志文件的,当发生多版本更新的故障,也可需要回滚段数据的。


    测试表


    SQL> select count(1) from tabtest;

      COUNT(1)
    ----------
         17732

    SQL> insert into tabtest select * from tabtest where rownum<2001;

    已创建2000行。

    SQL> insert into tabtest select * from tabtest where rownum<2001;

    已创建2000行。


    模拟断电故障,让回滚段的数据没来得回滚,使回滚段在数据库关闭时,保留未commit的事务


    SQL> shutdown abort
    ORACLE 例程已经关闭。


    SQL> quit
    从 Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Production
    With the Partitioning, OLAP, Data Mining and Real Application Testing options 断

    只有退出sqlplus环境,才能更改回滚段数据文件,删除回滚数据文件,模拟回滚段丢失

    C:/Documents and Settings/Administrator>sqlplus "/as sysdba"

    SQL*Plus: Release 10.2.0.4.0 - Production on 星期四 9月 9 22:23:50 2010

    Copyright (c) 1982, 2007, Oracle.  All Rights Reserved.

    已连接到空闲例程。

    SQL> startup
    ORACLE 例程已经启动。

    Total System Global Area  574619648 bytes
    Fixed Size                  1297944 bytes
    Variable Size             234881512 bytes
    Database Buffers          331350016 bytes
    Redo Buffers                7090176 bytes
    数据库装载完毕。
    ORA-01157: 无法标识/锁定数据文件 2 - 请参阅 DBWR 跟踪文件
    ORA-01110: 数据文件 2: 'E:/ORACLE/PRODUCT/10.2.0/ORADATA/TEST/UNDOTBS13.DBF'


    错误出现了,因为我已经删除文件“E:/ORACLE/PRODUCT/10.2.0/ORADATA/TEST/UNDOTBS13.DBF”


    SQL> shutdown abort;
    ORACLE 例程已经关闭。

    这里startup force是模拟instance recover时需要回滚段里的数据情况,为什么能模拟出来,我也不清楚,我是经过多次测试发现的,哪位高人知道原因,请指点????

    SQL> startup force;
    ORACLE 例程已经启动。

    Total System Global Area  574619648 bytes
    Fixed Size                  1297944 bytes
    Variable Size             234881512 bytes
    Database Buffers          331350016 bytes
    Redo Buffers                7090176 bytes
    数据库装载完毕。
    ORA-01157: 无法标识/锁定数据文件 2 - 请参阅 DBWR 跟踪文件
    ORA-01110: 数据文件 2: 'E:/ORACLE/PRODUCT/10.2.0/ORADATA/TEST/UNDOTBS13.DBF'


    SQL> alter database datafile 2 offline drop;

    数据库已更改。

    SQL> alter database open;
    alter database open
    *
    第 1 行出现错误:
    ORA-01092: ORACLE 实例终止。强制断开连接


    这里instance recover需要回滚段里数据,但是回滚段丢失,所以实例出现异常直接关闭


    SQL> startup
    ORA-24324: 未初始化服务句柄
    ORA-01041: 内部错误, hostdef 扩展名不存在

    SQL> quit
    从 Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Production
    With the Partitioning, OLAP, Data Mining and Real Application Testing options 断

    C:/Documents and Settings/Administrator>sqlplus "/as sysdba"

    SQL*Plus: Release 10.2.0.4.0 - Production on 星期四 9月 9 22:27:05 2010

    Copyright (c) 1982, 2007, Oracle.  All Rights Reserved.

    已连接到空闲例程。

    SQL> startup
    ORACLE 例程已经启动。

    Total System Global Area  574619648 bytes
    Fixed Size                  1297944 bytes
    Variable Size             234881512 bytes
    Database Buffers          331350016 bytes
    Redo Buffers                7090176 bytes
    数据库装载完毕。
    ORA-01092: ORACLE 实例终止。强制断开连接


    SQL>

    在看看alertlog文件,错误信息如下:

    。。。。

    Errors in file e:/oracle/product/10.2.0/admin/test/bdump/test_smon_1828.trc:
    ORA-00604: error occurred at recursive SQL level 1
    ORA-00376: file 2 cannot be read at this time
    ORA-01110: data file 2: 'E:/ORACLE/PRODUCT/10.2.0/ORADATA/TEST/UNDOTBS13.DBF'

    Thu Sep 09 22:27:17 2010
    Errors in file e:/oracle/product/10.2.0/admin/test/udump/test_ora_3844.trc:
    ORA-00604: 递归 SQL 级别 1 出现错误
    ORA-00376: 此时无法读取文件 2
    ORA-01110: 数据文件 2: 'E:/ORACLE/PRODUCT/10.2.0/ORADATA/TEST/UNDOTBS13.DBF'

    Error 604 happened during db open, shutting down database
    USER: terminating instance due to error 604
    Thu Sep 09 22:27:17 2010
    Errors in file e:/oracle/product/10.2.0/admin/test/bdump/test_pmon_5952.trc:
    ORA-00604: error occurred at recursive SQL level

    Thu Sep 09 22:27:18 2010
    Errors in file e:/oracle/product/10.2.0/admin/test/bdump/test_reco_3988.trc:
    ORA-00604: error occurred at recursive SQL level

    Thu Sep 09 22:27:18 2010
    Errors in file e:/oracle/product/10.2.0/admin/test/bdump/test_ckpt_5320.trc:
    ORA-00604: error occurred at recursive SQL level

    Thu Sep 09 22:27:18 2010
    Errors in file e:/oracle/product/10.2.0/admin/test/bdump/test_lgwr_1312.trc:
    ORA-00604: error occurred at recursive SQL level

    Thu Sep 09 22:27:18 2010
    Errors in file e:/oracle/product/10.2.0/admin/test/bdump/test_mman_4972.trc:
    ORA-00604: error occurred at recursive SQL level

    Thu Sep 09 22:27:18 2010
    Errors in file e:/oracle/product/10.2.0/admin/test/bdump/test_dbw0_4060.trc:
    ORA-00604: error occurred at recursive SQL level

    Thu Sep 09 22:27:18 2010
    Errors in file e:/oracle/product/10.2.0/admin/test/bdump/test_psp0_1276.trc:
    ORA-00604: error occurred at recursive SQL level

    Instance terminated by USER, pid = 3844
    ORA-1092 signalled during: ALTER DATABASE OPEN...


    。。。。。

    根据错误信息知道回滚段数据故障会丢失,如果有备份的话,直接recover datafile 很简单就可以恢复,这里假设没有备份,
    那该如何处理呢?现在因为回滚段数据文件的故障,导致数据库无法打开,那我们想办法让数据库的检查绕过或修复回滚段数
    据文件,数据库open时,所有的数据文件都要online,如果不能online,那就要恢复或者直接把数据文件drop掉。我们这里没有
    备份不能恢复,那就drop掉故障的数据文件,然后让数据可以打开,然后在重新创建新的回滚段表空间,让数据库使用新的回滚段
    表空间,最后在把有故障的回滚段表空间删除。这是解决问题的基本思路。操作步骤如下:


    修改参数文件 ,添加隐含参数

    我这里只用了“_corrupted_rollback_segments”

    在文本参数文件inittest.ora的最后追加如下一条记录


    *._corrupted_rollback_segments=( _SYSSMU12$,_SYSSMU13$,_SYSSMU14$,_SYSSMU15$,_SYSSMU16$,_SYSSMU17$,_SYSSMU18$,_SYSSMU19$,_SYSSMU20$,_SYSSMU11$)


    SQL> quit
    从 Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Production
    With the Partitioning, OLAP, Data Mining and Real Application Testing options 断

    C:/Documents and Settings/Administrator>sqlplus "/as sysdba"

    SQL*Plus: Release 10.2.0.4.0 - Production on 星期四 9月 9 22:32:43 2010

    Copyright (c) 1982, 2007, Oracle.  All Rights Reserved.

    已连接到空闲例程。

    SQL> startup  pfile='E:/oracle/product/10.2.0/db_1/database/inittest.ora'
    ORACLE 例程已经启动。

    Total System Global Area  574619648 bytes
    Fixed Size                  1297944 bytes
    Variable Size             234881512 bytes
    Database Buffers          331350016 bytes
    Redo Buffers                7090176 bytes
    数据库装载完毕。
    数据库已经打开。

    现在数据库已经打开, 剩下就简单多了,创建新的回滚段表空间,删除故障回滚段表空间

    SQL>

    SQL> show parameter undo

    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------------------------------
    undo_management                      string      AUTO
    undo_retention                       integer     900
    undo_tablespace                      string      UNDOTBS1


    SQL> create undo tablespace undotbs4 datafile 'E:/ORACLE/PRODUCT/10.2.0/ORADATA/
    TEST/UNDOTBS41.DBF' size 50m ;

    表空间已创建。

    SQL> show parameter undo

    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------------------------------
    undo_management                      string      AUTO
    undo_retention                       integer     900
    undo_tablespace                      string      UNDOTBS1
    SQL> alter system set undo_tablespace='undotbs4' scope=spfile;
    alter system set undo_tablespace='undotbs4' scope=spfile
    *
    第 1 行出现错误:
    ORA-32001: 已请求写入 SPFILE, 但是在启动时未指定 SPFILE


    SQL> alter system set undo_tablespace='undotbs4';

    系统已更改。

    SQL>


    SQL> shutdown immediate
    数据库已经关闭。
    已经卸载数据库。
    ORACLE 例程已经关闭。


    SQL> startup  pfile='E:/oracle/product/10.2.0/db_1/database/inittest.ora'
    ORACLE 例程已经启动。

    Total System Global Area  574619648 bytes
    Fixed Size                  1297944 bytes
    Variable Size             234881512 bytes
    Database Buffers          331350016 bytes
    Redo Buffers                7090176 bytes
    数据库装载完毕。
    数据库已经打开。


    检查当前使用回滚段情况

    SQL> select segment_name,status,tablespace_name from dba_rollback_segs;

    SEGMENT_NAME                   STATUS           TABLESPACE_NAME
    ------------------------------ ---------------- ------------------------------
    SYSTEM                         ONLINE           SYSTEM
    _SYSSMU1$                      NEEDS RECOVERY   UNDOTBS1
    _SYSSMU2$                      NEEDS RECOVERY   UNDOTBS1
    _SYSSMU3$                      NEEDS RECOVERY   UNDOTBS1
    _SYSSMU4$                      NEEDS RECOVERY   UNDOTBS1
    _SYSSMU5$                      NEEDS RECOVERY   UNDOTBS1
    _SYSSMU6$                      NEEDS RECOVERY   UNDOTBS1
    _SYSSMU7$                      NEEDS RECOVERY   UNDOTBS1
    _SYSSMU8$                      NEEDS RECOVERY   UNDOTBS1
    _SYSSMU9$                      NEEDS RECOVERY   UNDOTBS1
    _SYSSMU10$                     NEEDS RECOVERY   UNDOTBS1

    SEGMENT_NAME                   STATUS           TABLESPACE_NAME
    ------------------------------ ---------------- ------------------------------
    _SYSSMU11$                     ONLINE           UNDOTBS4
    _SYSSMU12$                     ONLINE           UNDOTBS4
    _SYSSMU13$                     ONLINE           UNDOTBS4
    _SYSSMU14$                     ONLINE           UNDOTBS4
    _SYSSMU15$                     ONLINE           UNDOTBS4
    _SYSSMU16$                     ONLINE           UNDOTBS4
    _SYSSMU17$                     ONLINE           UNDOTBS4
    _SYSSMU18$                     ONLINE           UNDOTBS4
    _SYSSMU19$                     ONLINE           UNDOTBS4
    _SYSSMU20$                     ONLINE           UNDOTBS4

    已选择21行。

    SQL> select * from v$recover_file;

         FILE# ONLINE  ONLINE_
    ---------- ------- -------
    ERROR                                                                CHANGE#
    ----------------------------------------------------------------- ----------
    TIME
    --------------
             2 OFFLINE OFFLINE
    FILE NOT FOUND                                                             0


             8 OFFLINE OFFLINE
                                                                        16898701
    07-9月 -10

         FILE# ONLINE  ONLINE_
    ---------- ------- -------
    ERROR                                                                CHANGE#
    ----------------------------------------------------------------- ----------
    TIME
    --------------


    SQL> show parameter undo

    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------------------------------
    undo_management                      string      AUTO
    undo_retention                       integer     900
    undo_tablespace                      string      UNDOTBS4
    SQL> drop tablespace undotbs4 including contents and datafiles;
    drop tablespace undotbs4 including contents and datafiles
    *
    第 1 行出现错误:
    ORA-30013: 还原表空间 'UNDOTBS4' 当前正在使用中

    SQL>


    SQL> shutdown immediate;
    数据库已经关闭。
    已经卸载数据库。
    ORACLE 例程已经关闭。

    再用修改文本参数文件,添加隐含参数

    在文本参数文件inittest.ora的最后追加如下一条记录


    *._corrupted_rollback_segments=( _SYSSMU2$,_SYSSMU3$,_SYSSMU4$,_SYSSMU5$,_SYSSMU6$,_SYSSMU7$,_SYSSMU8$,_SYSSMU9$,_SYSSMU10$,_SYSSMU1$)


    启动数据库


    SQL> startup  pfile='E:/oracle/product/10.2.0/db_1/database/inittest.ora'
    ORACLE 例程已经启动。

    Total System Global Area  574619648 bytes
    Fixed Size                  1297944 bytes
    Variable Size             234881512 bytes
    Database Buffers          331350016 bytes
    Redo Buffers                7090176 bytes
    数据库装载完毕。
    数据库已经打开。


    SQL> drop tablespace undotbs1 including contents and datafiles;

    表空间已删除。

    SQL> select segment_name,status,tablespace_name from dba_rollback_segs;

    SEGMENT_NAME                   STATUS           TABLESPACE_NAME
    ------------------------------ ---------------- ------------------------------
    SYSTEM                         ONLINE           SYSTEM
    _SYSSMU11$                     ONLINE           UNDOTBS4
    _SYSSMU12$                     ONLINE           UNDOTBS4
    _SYSSMU13$                     ONLINE           UNDOTBS4
    _SYSSMU14$                     ONLINE           UNDOTBS4
    _SYSSMU15$                     ONLINE           UNDOTBS4
    _SYSSMU16$                     ONLINE           UNDOTBS4
    _SYSSMU17$                     ONLINE           UNDOTBS4
    _SYSSMU18$                     ONLINE           UNDOTBS4
    _SYSSMU19$                     ONLINE           UNDOTBS4
    _SYSSMU20$                     ONLINE           UNDOTBS4

    已选择11行。

    SQL> shutdown immediate;
    数据库已经关闭。
    已经卸载数据库。
    ORACLE 例程已经关闭。


    SQL> startup  pfile='E:/oracle/product/10.2.0/db_1/database/inittest.ora'
    ORACLE 例程已经启动。

    Total System Global Area  574619648 bytes
    Fixed Size                  1297944 bytes
    Variable Size             234881512 bytes
    Database Buffers          331350016 bytes
    Redo Buffers                7090176 bytes
    数据库装载完毕。
    数据库已经打开。

    查看如下都正常了吧


    SQL> select segment_name,status,tablespace_name from dba_rollback_segs;

    SEGMENT_NAME                   STATUS           TABLESPACE_NAME
    ------------------------------ ---------------- ------------------------------
    SYSTEM                         ONLINE           SYSTEM
    _SYSSMU11$                     ONLINE           UNDOTBS4
    _SYSSMU12$                     ONLINE           UNDOTBS4
    _SYSSMU13$                     ONLINE           UNDOTBS4
    _SYSSMU14$                     ONLINE           UNDOTBS4
    _SYSSMU15$                     ONLINE           UNDOTBS4
    _SYSSMU16$                     ONLINE           UNDOTBS4
    _SYSSMU17$                     ONLINE           UNDOTBS4
    _SYSSMU18$                     ONLINE           UNDOTBS4
    _SYSSMU19$                     ONLINE           UNDOTBS4
    _SYSSMU20$                     ONLINE           UNDOTBS4

    已选择11行。

    SQL> select count(1) from tabtest;

      COUNT(1)
    ----------
         21732

    SQL> create spfile from pfile;

    文件已创建。


    SQL> create spfile from pfile;

    文件已创建。


    SQL> shutdown immediate;
    数据库已经关闭。
    已经卸载数据库。
    ORACLE 例程已经关闭。


    SQL> startup
    ORACLE 例程已经启动。

    Total System Global Area  574619648 bytes
    Fixed Size                  1297944 bytes
    Variable Size             234881512 bytes
    Database Buffers          331350016 bytes
    Redo Buffers                7090176 bytes
    数据库装载完毕。
    数据库已经打开。
    SQL>

    已经恢复ok

    说明:

    其实在恢复数据库后的善后工作很重要,不要留尾巴。做事要认真些,完美些,不要留下遗憾。细节很重要

    善后处理:

    0. 检查数据库、实例的状态(v$instance,v$database),确认是否还有其他文件恢复(v$recover_file)
    1. 检查是否有无效的对象定义
    2. 检查是否有失效的索引
    3. 查看应用脚本是否正常
    4。检查系统是否有死锁
    5. 检查系统的各资源是否正常
    6. 查看系统log、alertlog、tracelog等文件

    ----end-----

  • 相关阅读:
    Codeforces Round #604(Div. 2,
    简单的三层框架以及使用dbutils进行数据库操作(入门)
    DBUtil数据库工具封装
    GUI 中监听 文本框实时改变的实例
    java基础教程GUI
    Dao层通用化,Spring3.0+Hibernate3.3.2通用Dao层整合
    计算器代码
    记事本应用程序java源代码
    GUI
    dbutils开源项目用法
  • 原文地址:https://www.cnblogs.com/huyinyang/p/3023256.html
Copyright © 2011-2022 走看看