原文出处:http://blog.csdn.net/wyzxg/archive/2010/09/10/5874726.aspx

undo表空间故障特殊恢复(二)------ORA-01092: ORACLE 实例终止。强制断开连接

这个测试的是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-----

[本帖最后由 wyzxg 于 2010-9-10 00:49 编辑]

ora-01092: oracle 实例终止.强制断开连接,undo表空间故障特殊恢复(二)------ORA-01092: ORACLE 实例终止。强制断开连接...相关推荐

  1. undo表空间故障特殊恢复(二)------ORA-01092: ORACLE 实例终止。强制断开连接

    author:skate time:2010-09-10 undo表空间故障特殊恢复(二) 这个测试的是instance recover(单实例里就是crash recovery)的恢复需要故障und ...

  2. Oracle数据库 ORA-01555 快照过旧 (undo表空间:撤销表空间)

    UNDO表空间用于存放UNDO数据,当执行DML操作时,oracle会将这些操作的旧数据写入到UNDO段,以保证可以回滚或者一致读等,而临时表空间主要用来做查询和存放一些缓冲区数据.你听说UNDO也是 ...

  3. oracle如何添加undo,ORACLE RAC 11G 添加以及删除UNDO表空间

    在生产环境上,由于闪存盘的容量有限,现在需要将闪存盘里面的UNDO表空间,替换到非闪存的磁盘里面. 磁盘的使用情况如下: 表空间使用情况如下: RAC两个节点占用将近167G的空间. 操作步骤如下: ...

  4. Oracle undo 表空间管理

    Oracle 的Undo有两种方式: 一是使用undo 表空间,二是使用回滚段. 我们通过 undo_management 参数来控制使用哪种方式,如果设为auto,就使用UNDO 表空间,这时必须要 ...

  5. oracle清理undo空间,删除Oracle Undo表空间

    近期处理了一次删除.重建Undo表空间的事情,有些细节还是值得记下来备忘.事情的起因是工程师需要将分布在不同ASM磁盘组里的Oracle数据库文件,迁移到新建的ASM磁盘组,操作过程中,错误的删除了U ...

  6. [Oracle]理解undo表空间

    [Oracle]理解undo表空间 一.回退段介绍 在Oracle数据库中,当某个事物对数据进行修改时,Oracle首先将数据的原始值保存到一个回退段中.一个事物只能将它的回退信息保存到一个回退段中, ...

  7. 【DB笔试面试682】在Oracle中,Undo段中区3种状态分别是什么(Undo表空间系列)?...

    ♣ 题目 部分 在Oracle中,Undo段中区3种状态分别是什么? ♣ 答案部分 Undo信息存储在Undo段中,Undo段又存储在Undo表空间中.Undo表空间仅用于Undo段(在Undo表空间 ...

  8. oracle8i ora 12500,总结Oracle8i 的UNDO表空间损坏(ORA-01092及ORA-00600【4193】)情况下的数据库不完全恢复的经历...

    服务器断电重启导致备份生产环境的恢复目录库无法进行启动,提示Ora-01092例程终止.强行断开连接 查看跟踪日志: Wed Jan 10 08:41:37 2018 Errors in file d ...

  9. oracle数据导入表空间,ORACLE导入数据文件到指定的表空间

    最近工作中碰见ORACLE导入数据文件到指定的表空间中的事,虽然导入成功了.但这个功能应该算是我们在工作中经常碰见的需求,所以在此作个记录,以后用到也方便查找. 下面直接贴操作流程! Microsof ...

最新文章

  1. 老板来了:人脸识别 + 手机推送,老板来了你立刻知道!
  2. 寒假每日一题(入门组)【week1 完结】
  3. amd一点也不yes_最不值得买的高端显卡!RTX3080从真香变成了鸡肋?
  4. aaynctask控制多个下载进度_C# 多线程方法 控制两个进度条
  5. Laravel Model 利用 Macroable 为数据模型添加宏能力
  6. Linux内核代码 分析大纲思维导图
  7. noSql-redis
  8. Python进阶三部曲网络编程
  9. MediaPlayer对象从停止状态到播放状态调用的方法是prepare()和start()
  10. 解决springboot jar包冲突
  11. 关于加密与解密、签名与验签
  12. 机械制图计算机识图,机械制图与识图基础.ppt
  13. LT8618SX寄存器配置
  14. 微信小店二次开发_怎么吧微信小店装修的更好看
  15. C语言五子棋--人机对弈--人人对弈
  16. 12组-选题与需求分析报告
  17. echarts正负极柱状图
  18. 力扣765——情侣牵手(贪心+BFS)
  19. 【论文解读】深度学习目标检测的开山鼻祖 |R-CNN详解 | 两阶段目标检测代表
  20. Makefile 中 FORCE

热门文章

  1. 英伟达_如何超越英伟达?
  2. SOCKET bind INADDR_LOOPBACK和INADDR_ANY的区别
  3. 使用openssh-clients的scp命令来传输文件
  4. SourceInsight 设置点滴
  5. linux下C语言中的flock函数用法
  6. 进程控制1--fork vfork函数
  7. python内函数名加括号和不加括号的区别,python中 函数名加括号与不加括号
  8. 【转】extern “C“以及__declspec(dllexport) 讲解和def文件dll导出方法
  9. 【转】使用Azure Rest API获得Access Token介绍
  10. 【转】Windows Server 2012 R2 双网卡绑定