redo与undo同时丢失后的恢复(没有备份)

系统停电导致redo和undo损坏 
下面是恢复步骤,希望对大家有用。

当前状态是需要redo recover但是文件不存在或文件损坏
经过redo的clear或不完全恢复后启动数据库的时候,出现ora报错,能后添加系统隐藏参数后和修改系统通过system为undotbs后成功启动数据库。
1。redo丢失或损坏有如下两种常用的处理办法
用CLEAR命令重建该日志文件
非当前状态,而且已经归档
SQL>alter database clear logfile group 3;
如果是该日志组还没有归档,则需要用
SQL>alter database clear unarchived logfile group 3;
SQL> alter database clear unarchived logfile group 3 unrecoverable datafile;
否者需要不完全恢复
先加入隐含参数到pfile或spfile文件如:
SQL> alter system set "_allow_resetlogs_corruption"=true scope=spfile ;
系统已更改。
SQL> alter system set "_allow_terminal_recovery_corruption"=true scope=spfile ;
系统已更改。
pfile:
*._allow_resetlogs_corruption=true
*._allow_terminal_recovery_corruption=true
SQL> startup mount pfile=/u01/ora.init ;
recover数据库
现在开始不完全恢复:
SQL> recover database until cancel;
ORA-00279: 更改 1029419 (在 05/15/2005 01:21:08 生成) 对于线程 1 是必需的
ORA-00289: 建议: D:\ORACLE\ORA92\RDBMS\ARC00078.001
ORA-00280: 更改 1029419 对于线程 1 是按序列 # 78 进行的

指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
  cancel
ORA-01547: 警告: RECOVER 成功但 OPEN RESETLOGS 将出现如下错误
ORA-01194: 文件1需要更多的恢复来保持一致性
ORA-01110: 数据文件 1: ‘F:\RMAN\SYSTEM01.DBF‘
SQL> alter database open resetlogs ;
失败
2。需要使用system启动数据库
SQL> create pfile from spfile;
  文件已创建。
  修改pfile文件
  #*.undo_management=‘AUTO‘
  #*.undo_tablespace=‘UNDOSTB1‘
  *.undo_management=‘manual‘
  *.undo_tablespace=‘system‘
使用pfile启动数据库
重建undotbs1表空间和数据文件
drop tablespace undotbs1 including contents and datafiles;
create undo tablespace undotbs1 datafile ‘/opt/oradata/sid/undotbs01.dbf‘ size 4096m;
重新启动数据库 
  
  
参考:

REDO文件丢失或者损坏的恢复

REDO文件的功能描述
REDO文件存储所有数据库的变更内容和每一次变更所需的重做脚本,是数据库不可缺少的一部分,如果REDO GROUP中只有一个REDO文件,同时这个REDO文件被损坏,则系统切换到这个REDO GROUP时,数据库将直接DOWN机;如果REDO GROUP中有多个REDO文件,其中一个或者多个REDO被损坏,只要该组中还有一个好的REDO文件,则系统将报警(写入alert<sid>.log文档中),数据库仍然可以超常运行。
REDO文件在数据库恢复时提供前滚所需的内容。

查看REDO 相关信息的视图有:V$LOG,V$LOGFILE,V$INSTANCE_RECOVERY
SQL> DESC V$INSTANCE_RECOVERY;
名称 是否为空? 类型
----------------------------------------- -------- ------
RECOVERY_ESTIMATED_IOS NUMBER
ACTUAL_REDO_BLKS NUMBER
TARGET_REDO_BLKS NUMBER
LOG_FILE_SIZE_REDO_BLKS NUMBER
LOG_CHKPT_TIMEOUT_REDO_BLKS NUMBER
LOG_CHKPT_INTERVAL_REDO_BLKS NUMBER
FAST_START_IO_TARGET_REDO_BLKS NUMBER
TARGET_MTTR NUMBER
ESTIMATED_MTTR NUMBER
CKPT_BLOCK_WRITES NUMBER
OPTIMAL_LOGFILE_SIZE NUMBER
ESTD_CLUSTER_AVAILABLE_TIME NUMBER
WRITES_MTTR NUMBER
WRITES_LOGFILE_SIZE NUMBER
WRITES_LOG_CHECKPOINT_SETTINGS NUMBER
WRITES_OTHER_SETTINGS NUMBER
WRITES_AUTOTUNE NUMBER
WRITES_FULL_THREAD_CKPT NUMBER
一般情况下,最好有3-5个REDO GROUP,每个REDO GROUP中有两个成员,放在不同的磁盘资源上。同一个REDO GROUP 中的REDO文件的大小尽量设置为相同,否则系统以最小的一个为基准,比较浪费空间。各个REDO GROUP 的大小也最好一致。

REDO文件恢复实例
2.1查看REDO 相关视图
SQL> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIME
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- -------------------
1 1 14 10485760 2 YES ACTIVE 1304089 2006-07-06 12:33:59
2 1 15 10485760 2 YES INACTIVE 1314889 2006-07-06 15:55:10
3 1 16 10485760 2 NO CURRENT 1323514 2006-07-07 08:33:21
STATUS状态的解释:
CURRENT: 当前的REDO文件,REDO BUFFER 的内容有LGWR进程写入当前REDO文件,如果丢失该组文件,会造成数据的丢失.
ACTIVE : 文件中含有的内容还没有写入到ARCHIVELOG文件中,如果丢失该组文件也会造成数据的丢失.
INACTIVE: 已经归档,丢失文件不会造成数据丢失,不过在做数据库的恢复时,该组文件可以用来做前滚操作.
SQL> SELECT * FROM V$LOGFILE ORDER BY GROUP#;
GROUP# STATUS TYPE MEMBER IS_
---------- ------- ------- ------------------------------ ---
1 ONLINE C:\ORADATA\AIDU\REDO01.LOG NO
1 ONLINE C:\ORADATA\AIDU\REDO01B.LOG NO
2 ONLINE C:\ORADATA\AIDU\REDO02.ORA NO
2 ONLINE C:\ORADATA\AIDU\REDO02B.ORA NO
3 ONLINE C:\ORADATA\AIDU\REDO03.LOG NO
3 ONLINE C:\ORADATA\AIDU\REDO03B.LOG NO
已选择6行。
可以看到,当前数据库有3个REDO GROUP,每个GROUP 含有两个MEMBER(REDO文件).

2.2 增加REDO GROUP
SQL> alter database add logfile group 4 ‘C:\ORADATA\AIDU\REDO04.ORA‘ SIZE 10M REUSE;
数据库已更改。
SQL> SELECT * FROM V$LOGFILE ORDER BY GROUP#;
GROUP# STATUS TYPE MEMBER IS_
---------- ------- ------- ------------------------------ ---
1 ONLINE C:\ORADATA\AIDU\REDO01B.LOG NO
1 ONLINE C:\ORADATA\AIDU\REDO01.LOG NO
2 ONLINE C:\ORADATA\AIDU\REDO02.ORA NO
2 ONLINE C:\ORADATA\AIDU\REDO02B.ORA NO
3 ONLINE C:\ORADATA\AIDU\REDO03B.LOG NO
3 ONLINE C:\ORADATA\AIDU\REDO03.LOG NO
4 ONLINE C:\ORADATA\AIDU\REDO04.ORA NO
已选择7行。

2.3 删除REDO GROUP
SQL> ALTER DATABASE DROP LOGFILE GROUP 4;
数据库已更改。
SQL> SELECT * FROM V$LOGFILE ORDER BY GROUP#;
GROUP# STATUS TYPE MEMBER IS_
---------- ------- ------- ------------------------------ ---
1 ONLINE C:\ORADATA\AIDU\REDO01.LOG NO
1 ONLINE C:\ORADATA\AIDU\REDO01B.LOG NO
2 ONLINE C:\ORADATA\AIDU\REDO02.ORA NO
2 ONLINE C:\ORADATA\AIDU\REDO02B.ORA NO
3 ONLINE C:\ORADATA\AIDU\REDO03.LOG NO
3 ONLINE C:\ORADATA\AIDU\REDO03B.LOG NO
已选择6行。

2.4 REDO GROUP中增加REDO文件(MEMBER)
SQL> ALTER DATABASE ADD LOGFILE MEMBER ‘C:\ORADATA\AIDU\REDO01C.LOG‘ TO GROUP 1;
数据库已更改。
SQL> SELECT * FROM V$LOGFILE ORDER BY GROUP#;
GROUP# STATUS TYPE MEMBER IS_
---------- ------- ------- ------------------------------ ---
1 INVALID ONLINE C:\ORADATA\AIDU\REDO01C.LOG NO
1 ONLINE C:\ORADATA\AIDU\REDO01.LOG NO
1 ONLINE C:\ORADATA\AIDU\REDO01B.LOG NO
2 ONLINE C:\ORADATA\AIDU\REDO02.ORA NO
2 ONLINE C:\ORADATA\AIDU\REDO02B.ORA NO
3 ONLINE C:\ORADATA\AIDU\REDO03.LOG NO
3 ONLINE C:\ORADATA\AIDU\REDO03B.LOG NO
已选择7行。
我们注意到新建的MEMBER的状态为INVALID,这个不用担心,等下次切换到该组,然后状态就会修改为正常。

2.5 REDO GROUP中删除REDO 文件(MEMBER)
SQL> ALTER DATABASE DROP LOGFILE MEMBER ‘C:\ORADATA\AIDU\REDO01C.LOG‘;
数据库已更改。
SQL> SELECT * FROM V$LOGFILE ORDER BY GROUP#;
GROUP# STATUS TYPE MEMBER IS_
---------- ------- ------- ------------------------------ ---
1 ONLINE C:\ORADATA\AIDU\REDO01.LOG NO
1 ONLINE C:\ORADATA\AIDU\REDO01B.LOG NO
2 ONLINE C:\ORADATA\AIDU\REDO02.ORA NO
2 ONLINE C:\ORADATA\AIDU\REDO02B.ORA NO
3 ONLINE C:\ORADATA\AIDU\REDO03.LOG NO
3 ONLINE C:\ORADATA\AIDU\REDO03B.LOG NO
已选择6行。
注意: 不可以删除REDO GROUP 中所有的REDO 文件,这样会报错,如下所示:
SQL> ALTER DATABASE DROP LOGFILE MEMBER ‘C:\ORADATA\AIDU\REDO01.LOG‘;
数据库已更改。
SQL> ALTER DATABASE DROP LOGFILE MEMBER ‘C:\ORADATA\AIDU\REDO01B.LOG‘;
ALTER DATABASE DROP LOGFILE MEMBER ‘C:\ORADATA\AIDU\REDO01B.LOG‘
*第 1 行出现错误:
ORA-00361: 无法删除最后一个日志成员 C:\ORADATA\AIDU\REDO01B.LOG (组 1)

2.6 已经归档的REDO文件损坏的恢复
所谓已经归档的REDO文件就是在V$LOG视图中状态为INACTIVE的REDO文件。
这些文档的丢失,不会对数据库造成任何影响,但需要及时的恢复,否则切换到这个组时将会发生错误。
解决问题有两个办法:

A.删除这个REDO GROUP,记住删除后数据库的REDO GROUP数目不应小于2,如果当前REDO GROUP数目为2,则不可以使用这个办法。

B.在组中增加新的同样大小的REDO文件,然后删除原来的MEMBER。增加、删除REDO文件的方法见上面的2.4,2.5。

2.7没有归档的REDO文件损坏的恢复

2.7.1 简述
所谓没有归档的REDO文件就是在V$LOG视图中状态为ACTIVE,CURRENT的REDO文件。如果没有归档的REDO GROUP中含有多个REDO 文件,丢失或者损坏的只是部分REDO文件,则可以通过复制正常的REDO文件,覆盖损坏的REDO文件的方式解决问题,数据不会丢失,不用做恢复操作。
如果没有归档的REDO GROUP组中所有的REDO文件都丢失或者损坏,将会导致数据库数据丢失,如果没有归档的REDO GROUP 为当前组,则数据库立即DOWN机。当这个情况发生时,就意味着数据的丢失,我们只能将数据库恢复到前一次的归档日志切换时刻。

2.7.2 建立测试环境
检查当前的REDO GROUP为第1组.
SQL> SELECT * FROM V$LOG;
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS
---------- ---------- ---------- ---------- ---------- --- ----------------
FIRST_CHANGE# FIRST_TIME
------------- -------------------
1 1 17 10485760 1 NO CURRENT
1333209 2006-07-07 11:47:23
2 1 15 10485760 2 YES INACTIVE
1314889 2006-07-06 15:55:10
3 1 16 10485760 2 YES INACTIVE
1323514 2006-07-07 08:33:21
建立一个测试表,这个数据库的变化存放在当前的REDO文件中。
SQL> CREATE TABLE AIDU.TEST_FOR_REDO AS SELECT * FROM AIDU.TEST02;
表已创建。

2.7.3 模拟灾难发生
SQL> SHUTDOWN ABORT;
ORACLE 例程已经关闭。
SQL>HOST DELETE C:ORADATAAIDUREDO01*.* #删除当前日志组的所有成员文件
SQL> STARTUP #启动数据库时将报找不到数据库文件的错误,数据库只能启动到MOUNT状态。
ORA-32004: obsolete and/or deprecated parameter(s) specified
ORACLE 例程已经启动。

Total System Global Area 268435456 bytes
Fixed Size 1248504 bytes
Variable Size 96469768 bytes
Database Buffers 167772160 bytes
Redo Buffers 2945024 bytes
数据库装载完毕。
ORA-00313: 无法打开日志组 1 (用于线程 1) 的成员
ORA-00312: 联机日志 1 线程 1: ‘C:\ORADATA\AIDU\REDO01B.LOG‘
ORA-27041: 无法打开文件
OSD-04002: 无法打开文件
O/S-Error: (OS 2) 系统找不到指定的文件。
SQL> SELECT OPEN_MODE FROM V$DATABASE;
OPEN_MODE
----------
MOUNTED

2.7.4 进行灾难恢复

尝试使用RESETLOG或者NORESETLOGS打开数据库,结果失败
SQL> alter database open resetlogs;
alter database open resetlogs
*第 1 行出现错误:
ORA-01139: RESETLOGS 选项仅在不完全数据库恢复后有效
SQL> alter database open noresetlogs;
alter database open noresetlogs
*第 1 行出现错误:
ORA-01139: RESETLOGS 选项仅在不完全数据库恢复后有效

尝试删除当前被破坏的REDO GROUP,结果失败
SQL> alter database drop logfile group 1;
alter database drop logfile group 1
*
第 1 行出现错误:
ORA-01623: 日志 1 是实例 aidu (线程 1) 的当前日志 - 无法删除
ORA-00312: 联机日志 1 线程 1: ‘C:\ORADATA\AIDU\REDO01B.LOG‘

清除当前日志组的内容,然后重新建立
SQL> ALTER DATABASE CLEAR UNARCHIVED LOGFILE GROUP 1;
*第 1 行出现错误:
ORA-01624: 日志 1 是紧急恢复实例 aidu (线程 1) 所必需的
ORA-00312: 联机日志 1 线程 1: ‘C:\ORADATA\AIDU\REDO01B.LOG‘

这样我们只能做不完全的恢复了,恢复的方法有两个:

使用RMAN或者手工进行基于CANCEL的恢复。
SQL>SHUTDOWN IMMEDIATE;
手工删除数据文件(DATAFILE)
C:>RMAN TARGET /
RMAN>STARTUP MOUNT
RMAN>RUN{
ALLOCATE CHANNEL D1 TYPE DISK;
RESTORE DATABASE;
RECOVER DATABASE;
RELEASE CHANNEL D1;}
RMAN>ALTER DATABASE OPEN RESETLOGS;
这里不详细讨论RMAN的恢复。

使用EXP,IMP进行恢复。
具体操作步骤如下:
SQL>SHUTDOWN IMMEDIATE;
在init.ora中加入参数: _allow_resetlogs_corruption=TRUE
重新启动数据库,利用until cancel恢复
SQL>recover database until cancel; 
Cancel
如果出错,不再理会,发出 
SQL>alter database open resetlogs;
数据库被打开后,马上执行一个full export
shutdown数据库,去掉_all_resetlogs_corrupt参数
重建库
import并完成恢复
建议执行一下ANALYZE TABLE ...VALIDATE STRUCTURE CASCADE

原文地址:https://www.cnblogs.com/chendian0/p/10331974.html

时间: 2024-10-05 04:19:16

redo与undo同时丢失后的恢复(没有备份)的相关文章

MyISAM表的.frm文件丢失后的恢复方法

MyISAM表的.frm文件丢失后的恢复方法: 1.创建实验用的MyISAM表t1,并插入数据: mysql> create table t1(id int) engine=myisam; Query OK, 0 rows affected (0.01 sec) mysql> insert into t1 values(1),(2),(3),(4),(5),(6),(7),(8); Query OK, 8 rows affected (0.00 sec) Records: 8  Duplica

磁盘阵列中分区信息丢失后如何恢复磁盘的盘符

磁盘阵列,也可以说是容错式廉价磁盘阵列,可以将多个较小的磁碟整合成为一个较大的磁碟装置.对磁盘阵列的操作,主要是空间的分区,即磁盘阵列分区,而分区又可以分为一个或多个区.本文介绍的方法是磁盘阵列中的分区信息丢失后如何恢复磁盘的盘符. 当用户对服务器重新配置磁盘阵列信息时,重配磁盘阵列的信息得保证和当初配置信息一致,如果配置的参数和当初配置的不一致,部分目录可能正确,但绝大多数文件不能打开,造成数据丢失,而部分服务器在重配阵列信息后要自动初始化,所有的数据都会清除,这种情况造成的损失就更大了. 当

Oracle在线 redo log文件丢失后的恢复

今天一个开发库启动不了了,发过来报错一看是日志文件损坏了(见下图),接着说了一下前因后果.说是年前服务器掉电了,然后就再没有启动起来过.今天有人用才想到要处理. 先说一下大体的思路,如果损坏的redo log是INACTIVE状态的,也就是实例崩溃恢复用不到的redo log,那处理起来比较容易,直接alter database clear logfile group #;或alter database clear unarchived logfile group #;重建日志组就行了.建议重建

ORACLE数据库文件丢失后的恢复测试

一.测试环境 数据库版本是11GR2,在做完一份完全备份之后,关机,做一份快照,每一次开机之后都执行数次alter system switch logfile以产生归档日志. 之后的测试都是基于这么一个完全备份来恢复. CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '/backup/%F'; backup incremental level 0 format '/backup/%T_%f' database; 二.

ORACLE 11G RAC ASM磁盘组全部丢失后的恢复

一.环境描述(1)Oracle 11.2.0.3 RAC ON Oracle Linux 6 x86_64,只有一个ASM外部冗余磁盘组--DATA:(2)OCR,VOTEDISK,DATAFILE,CONTROLFILE,SPFILE全部位于这个磁盘组上:二.故障描述(1)存储故障导致ASM磁盘丢失.(2)CRS因为OCR和VOTEDISK的丢失,除了OHAS还联机外,CLUSTERWARE服务都已经停止.三.备份情况(1)RMAN备份:包括controlfile,database,spfil

丢失了所有控制文件副本后进行恢复 以trace文件恢复

实验:基于trace的控制文件重建及数据库回复(所有控制文件丢失等) 1.测试数据的构造,创建只读表空间 create tablespace tbs_users datafile '/u01/app/oracle/oradata/PROD/datafile/tbs_users1.dbf' size 5m, '/u01/app/oracle/oradata/PROD/datafile/tbs_users2.dbf' size 5m; alter tablesapce tbs_users read

[网络课摘抄]8.1模拟控制文件丢失后的数据库恢复(完全恢复)

1.环境准备 1.1确认数据库版本 1.2确认数据库归档 1.3备份数据库文件 2模拟控制文件丢失后的数据库恢复(完全恢复). 2.1查看控制文件位置 2.2执行操作后删除控制文件 2.3启动数据库 启动数据库的时候发现数据库发生了报错,提示无法确认控制文件,检查告警文件,我们现在检查一下告警文件里的信息: 2.4重建控制文件 对于日志和数据文件都完整的情况下,如果只是控制文件丢失,那么重建控制文件是最好的一种解决方式,一般重建控制文件能够解决99%的问题,现在我们就重建控制文件. 2.5尝试打

硬盘分区丢失后数据怎样恢复

有些时候,在使用电脑的过程中,硬盘分区丢失了,分区数据也消失不见了.那么分区丢失了数据还能恢复吗?硬盘分区丢失想要恢复数据怎么办?鉴于很多人有着相似的问题,今天就关于硬盘丢失分区数据恢复问题给大家分享一些方法. 首先,我们来了解一下分区的概念,硬盘分区实质上是对硬盘的一种格式化,然后才能使用硬盘保存各种信息.简单来说,新买来的硬盘,就像一张面积相当大的白纸,什么也没有,我们可以往上面写各种各样的东西,但是,随意的往上写是不行的,为了方便管理,我们必须把它分成几个区域,这就是分区.硬盘分区有三种,

说说MySQL中的Redo log Undo log都在干啥

阅读目录(Content) 1 undo 1.1 undo是啥 1.2 undo参数 1.3 undo空间管理 2 redo 2.1 redo是啥 2.2 redo 参数 2.3 redo 空间管理 3 undo及redo如何记录事务 3.1 Undo + Redo事务的简化过程 3.2  IO影响 3.3 恢复 在数据库系统中,既有存放数据的文件,也有存放日志的文件.日志在内存中也是有缓存Log buffer,也有磁盘文件log file,本文主要描述存放日志的文件. MySQL中的日志文件,