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\ ump\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 incl ing contents and datafiles;
drop tablespace undotbs4 incl ing 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 incl ing 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等文件
文献出自:http://blog.chinaunix.net/uid-12380499-id-3798749.html
相关推荐
如果Oracle在运行中很不幸遇到undo损坏,当然最好的方法是完全恢复,不过如果没有备份,可以采用一种非常规的手段(利用Oracle的隐藏参数),如果此时undo包含未提交的事务,会造成一点点的数据丢失(一般都是可忍受...
### ORACLE数据库物资管理系统磁盘损坏数据恢复处理报告 #### 系统环境 - **硬件平台及操作系统**: Windows Server 2003 - **Oracle产品及版本**: Oracle Database 10g Release 2 (10.2.0.1.0) #### 问题描述 在...
然而,在执行热备时可能会遇到各种情况,比如undo表空间未被备份,这时候就需要采取特殊的恢复方法来恢复数据的一致性和完整性。 #### 热备原理 热备主要依赖于重做日志(Redo Log)记录的事务信息来进行数据恢复...
Oracle提供了一系列工具和方法来检测和修复数据块损坏。当发现数据块损坏时,Oracle可以使用备份数据、日志文件、或者数据块的副本来进行数据块的恢复。同时,Oracle提供了一些动态视图来帮助数据库管理员检测和诊断...
然而,如果在事务过程中发生错误,或者需要撤销已执行的操作,就可以使用 UNDO 功能来恢复到事务开始前的状态。这对于维护数据的准确性至关重要。 "install.sql" 文件很可能是用来安装或设置这些回滚脚本的。这可能...
- 对于误删除或更新的数据,可以使用撤销(UNDO)表空间和闪回交易(Flashback Transaction)进行逻辑恢复。 9. **媒体恢复**: - 当物理介质(如磁盘)损坏时,需使用备份和归档日志进行媒体恢复。RMAN的MEDIA ...
在本主题中,我们将聚焦于“Raid数据恢复工具”,这是一种专门用于处理RAID系统中数据丢失或损坏情况的软件。 RAID数据恢复的必要性源于RAID阵列可能遇到的问题,例如硬件故障、驱动器失效、RAID控制器问题或人为...
在Oracle数据库管理中,Undo表空间是至关重要的组成部分,它用于存储事务的回滚信息,以便在发生错误或需要撤销操作时恢复数据。当遇到如ORA-600 [4194]这样的内部错误时,可能是因为Redo记录与Undo记录之间的不匹配...
对于更复杂的数据恢复场景,如表空间损坏等情况,还需要借助其他工具和技术。 #### 总结 自动撤销管理和闪回查询是Oracle 9i中两项非常重要的特性。AUM极大地简化了撤销数据的管理,而闪回查询则为用户提供了一个...
本文档提供了 Oracle 热备份恢复的手册,包括Undo 表空间恢复、非系统数据文件恢复、Oracle 热备份恢复过程、系统崩溃恢复、Undo 表空间和 Rollback 段、数据库初始化参数、数据库恢复命令等知识点。
总结,Oracle 10g 数据库在遭遇意外断电时,可能需要一系列复杂的恢复步骤,包括检查和修复损坏的数据文件,使用日志文件进行介质恢复,以及调整数据库参数以解决一致性问题。在无法正常恢复的情况下,备份数据和...
本教程将深入探讨MySQL数据库表的修复方法,帮助你理解可能导致数据损坏的原因,并提供有效的解决策略。 首先,数据库表损坏可能由多种原因引起。最常见的原因之一是数据库服务器的非正常关机或强制重启,这在电源...
2. 确定恢复策略:根据损坏类型和数据的重要性,决定是进行point-in-time恢复,还是完全恢复。 3. 执行恢复操作:根据策略,使用RMAN、手工复制文件、数据块修复等方式进行数据恢复。 4. 验证数据完整性:恢复完成...
以下是三种修复方法: 1. 使用KV3000: KV3000不仅是一款杀毒软件,还具备修复主引导记录和分区表的功能。在软盘启动后运行KV3000,通过F6键检查主引导记录。如果找不到关键代码,可以使用翻页键寻找,找到后使用...
当数据丢失或损坏时,可以通过备份恢复到某个时间点的状态。 #### 三、恢复方法详解 ##### 方法1:通过Oracle提供的回闪功能恢复 **步骤1**: 查看当前UNDO_RETENTION设置 ``` SHOW PARAMETER UNDO_RETENTION; ```...
4. **恢复操作**:`redo`操作时,从redo栈顶取出命令并调用其执行方法,将修改应用回系统,同时将该命令移回undo栈,以便再次`undo`。 5. **清理**:当新的操作发生时,需要清空redo栈,因为之前的redo历史已经不再...
- 对于小范围的数据丢失或损坏,可以使用闪回技术进行针对性恢复。 #### 七、性能优化 为了提高数据库性能,在使用闪回技术和备份恢复时还需要考虑以下几点: - **优化闪回性能**: - 调整undo表空间大小和undo ...