`

UNDO损坏的恢复方法

 
阅读更多

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损坏,当然最好的方法是完全恢复,但如果是在没有备份的情况下undo损坏怎么办?以下就为大家介绍出现这种情况的解决办法,需要的朋友参考下

    ORACLE数据库物资管理系统磁盘损坏数据恢复处理报告 UNDO文件损坏

    ORACLE数据库物资管理系统磁盘损坏数据恢复处理报告 UNDO文件损坏

    Raid数据恢复工具

    快速恢复已损坏的raid磁盘阵列数据,可以帮助重建磁盘阵列信息(如raid0,raid1,raid5,raid50)

    oracle drop table(表)数据恢复方法

    代码如下: –查看数据库回收站 select object_name,original_name,partition_name,type,ts_name,... 您可能感兴趣的文章:Oracle数据块损坏之10231内部事件不完全恢复[Oracle] 解析在没有备份的情况下undo损坏怎么办ORA

    深入解析OracleDBA入门进阶与诊断案例 3/4

     8.19 诊断案例之二:回滚段损坏的恢复  第9章 等待事件   9.1 等待事件的源起   9.2 从等待发现瓶颈   9.3 Oracle 10g的增强   9.4 顶级等待事件   9.5 重要等待事件  第10章 性能诊断与SQL...

    深入解析OracleDBA入门进阶与诊断案例 2/4

     8.19 诊断案例之二:回滚段损坏的恢复  第9章 等待事件   9.1 等待事件的源起   9.2 从等待发现瓶颈   9.3 Oracle 10g的增强   9.4 顶级等待事件   9.5 重要等待事件  第10章 性能诊断与SQL...

    深入解析OracleDBA入门进阶与诊断案例 4/4

     8.19 诊断案例之二:回滚段损坏的恢复  第9章 等待事件   9.1 等待事件的源起   9.2 从等待发现瓶颈   9.3 Oracle 10g的增强   9.4 顶级等待事件   9.5 重要等待事件  第10章 性能诊断与SQL...

    undrop-for-innodb:适用于MySQLInnoDB的TwinDB数据恢复工具包

    TwinDB数据恢复工具包 支持的故障 TwinDB数据恢复工具包是一组工具,可在较低级别上与MySQL文件一起使用,并允许在不同的故障情况后恢复InnoDB数据库。 该工具箱也称为InnoDB的UnDrop... 最好的获取源代码的方法是从Gi

    构建最高可用Oracle数据库系统 Oracle 11gR2 RAC管理、维护与性能优化

    13.5.1联机Redo日志损坏与恢复 13.5.2数据文件脱机与恢复 13.5.3表空间脱机与恢复 13.6本章小结 第14章 RAC安全性 14.1数据访问安全性 14.1.1 Oracle安全性解决方案 14.1.2 VPD和OLS策略 14.2 Database Vault...

    Oracle数据库实验操作

    实验112:不完全恢复,当前日志损坏的恢复 199 实验113:不完全恢复,resetlogs后的再次恢复 203 实验114:表空间的传送 203 实验115:整个数据库的闪回 203 Rman备份和恢复 204 实验116:rman的连接,report和list...

    Teigha for .dwg TX_SDK 3.09 C++.7z.002/003

    恢复和修正损坏的dwg文件 编辑和维护dwg文件数据: 炸开实体 实体坐标转换 修改实体的任意属性 复制对象 将.dwg 和.dxf 文件 转换为SVG, PDF, DWF, BMP, STL。 导入DWF文件 支持定制对象 支持外部文件,如...

    Teigha for .dwg TX_SDK 3.09 C++.7z.003/003

    恢复和修正损坏的dwg文件 编辑和维护dwg文件数据: 炸开实体 实体坐标转换 修改实体的任意属性 复制对象 将.dwg 和.dxf 文件 转换为SVG, PDF, DWF, BMP, STL。 导入DWF文件 支持定制对象 支持外部文件,如...

    Oracle 闪回技术详细介绍及总结

    需要注意的是,闪回技术旨在快速恢复逻辑错误,对于物理损坏或是介质丢失的错误,闪回技术就回天乏术了,还是得借助于Oracle一些高级的备份恢复工具如RAMN去完成(这才是Oracle强大备份恢复机制的精髓所在啊) ...

    深入解析Oracle.DBA入门进阶与诊断案例

    8.19 诊断案例之二:回滚段损坏的恢复 402 第9章 等待事件 406 9.1 等待事件的源起 406 9.2 从等待发现瓶颈 408 9.2.1 V$SESSION 和V$SESSION_WAIT 409 9.2.2 V$SESSION_EVENT和V$SYSTEM_EVENT 410 ...

    EditPlus 3.31 Build 860 简体中文版

    一套功能强大,可取代记事本的文字编辑器,拥有无限制的 Undo/Redo、英文拼字检查、自动换行、列数标记、搜寻取代、同时编辑多文件、全屏幕浏览功能。而它还有一个好用的功能,就是它有监视剪贴簿的功能,能够同步于...

    EditPlus 3.31 Build 1129

    一套功能强大,可取代记事本的文字编辑器,拥有无限制的 Undo/Redo、英文拼字检查、自动换行、列数标记、搜寻取代、同时编辑多文件、全屏幕浏览功能。而它还有一个好用的功能,就是它有监视剪贴簿的功能,能够同步于...

    autocad命令全集

    215 RECOVER   修复损坏的图形文件 216 RECTANG REC 绘制矩形 217 REDEFINE   恢复一条已被取消的命令 218 REDO   恢复由Undo(或U)命令取消的最后一条命令 219 REDRAW R 重新显示当前视窗中的图形 220 ...

    Oracle9i的init.ora参数中文说明

    Oracle9i初始化参数中文说明 Blank_trimming: 说明: 如果值为TRUE, 即使源长度比目标长度 (SQL92 兼容) 更长, 也允许分配数据。 值范围: TRUE | FALSE 默认值: FALSE serializable: 说明: 确定查询是否获取表级...

Global site tag (gtag.js) - Google Analytics