1、丢失非当前的联机redolog
(1)查看哪些redolog是非当前文件
SQL> select GROUP#, ARCHIVED,STATUS, FIRST_TIME from V$log;
GROUP# ARC STATUS FIRST_TIME
---------- --- ---------------- --------------
1 YES INACTIVE 18-7月 -12
2 NO CURRENT 19-7月 -12
3 YES UNUSED
SQL> select group#,member from V$logfile;
GROUP# MEMBER
--------------------------------------------------------------------------------
3 D:\APP\ADMINISTRATOR\ORADATA\ORCL\REDO03.LOG
2 D:\APP\ADMINISTRATOR\ORADATA\ORCL\REDO02.LOG
1 D:\APP\ADMINISTRATOR\ORADATA\ORCL\REDO01.LOG
SQL>
可以看出来一个文件是当前联机redolog,一个是非当前,一个还没有使用,我们删除这个INACTIVE状态的,也就是D:\APP\ADMINISTRATOR\ORADATA\ORCL\REDO01.LOG
(2)删除非联机的redolog
SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> host del D:\APP\ADMINISTRATOR\ORADATA\ORCL\REDO01.LOG
SQL> startup mount;
ORACLE 例程已经启动。
Total System Global Area 535662592 bytes
Fixed Size 1334380 bytes
Variable Size 209716116 bytes
Database Buffers 318767104 bytes
Redo Buffers 5844992 bytes
数据库装载完毕。
SQL> alter database open;
alter database open
*
第 1 行出现错误:
ORA-00313: 无法打开日志组 1 (用于线程 1) 的成员
ORA-00312: 联机日志 1 线程 1: 'D:\APP\ADMINISTRATOR\ORADATA\ORCL\REDO01.LOG'
SQL>
(3)恢复redolog
SQL> alter database clear logfile group 1;
数据库已更改。
SQL> alter database open;
数据库已更改。
SQL>
由于丢失的并不是当前的联机redolog,不会造成数据丢失,只需要重建改组redolog就可以了。
————————————————————————————————————————————————————————————————————————————
2、丢失当前的联机redolog
这种情况一般会丢失数据,即使有备份,恢复的时候也是只能不完全恢复。有时候运气好,这段时间没有数据改变,估计不会丢失数据
(1)查找当前的联机redolog
SQL> select GROUP#, ARCHIVED,STATUS, FIRST_TIME from V$log;
GROUP# ARC STATUS FIRST_TIME
---------- --- ---------------- --------------
1 YES UNUSED 18-7月 -12
2 NO CURRENT 19-7月 -12
3 YES UNUSED
SQL> select group#,member from V$logfile;
GROUP# MEMBER
--------------------------------------------------------------------------------
3 D:\APP\ADMINISTRATOR\ORADATA\ORCL\REDO03.LOG
2 D:\APP\ADMINISTRATOR\ORADATA\ORCL\REDO02.LOG
1 D:\APP\ADMINISTRATOR\ORADATA\ORCL\REDO01.LOG
SQL>
(2)删除当前联机redolog
SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> host del D:\APP\ADMINISTRATOR\ORADATA\ORCL\REDO02.LOG
SQL> startup mount;
ORACLE 例程已经启动。
Total System Global Area 535662592 bytes
Fixed Size 1334380 bytes
Variable Size 209716116 bytes
Database Buffers 318767104 bytes
Redo Buffers 5844992 bytes
数据库装载完毕。
SQL> alter database open;
alter database open
*
第 1 行出现错误:
ORA-00313: 无法打开日志组 2 (用于线程 1) 的成员
ORA-00312: 联机日志 2 线程 1: 'D:\APP\ADMINISTRATOR\ORADATA\ORCL\REDO02.LOG'
SQL>
(3)尝试修复联机重做日志
SQL> alter database clear logfile group 2;
alter database clear logfile group 2
*
第 1 行出现错误:
ORA-00350: 日志 2 (实例 orcl 的日志, 线程 1) 需要归档
ORA-00312: 联机日志 2 线程 1: 'D:\APP\ADMINISTRATOR\ORADATA\ORCL\REDO02.LOG'
SQL>
看来用恢复非当前联机redolog那一招不管用
(4)执行不完全恢复
如果有备份并且是归档模式,可以尝试用过备份进行不完全恢复
RMAN> restore database;
启动 restore 于 19-7月 -12
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: SID=148 设备类型=DISK
通道 ORA_DISK_1: 正在开始还原数据文件备份集
通道 ORA_DISK_1: 正在指定从备份集还原的数据文件
通道 ORA_DISK_1: 将数据文件 00001 还原到 D:\APP\ADMINISTRATOR\ORADATA\ORCL\SYSTE
M01.DBF
通道 ORA_DISK_1: 将数据文件 00002 还原到 D:\APP\ADMINISTRATOR\ORADATA\ORCL\SYSAU
X01.DBF
通道 ORA_DISK_1: 将数据文件 00003 还原到 D:\APP\ADMINISTRATOR\ORADATA\ORCL\UNDOT
BS01.DBF
通道 ORA_DISK_1: 将数据文件 00004 还原到 D:\APP\ADMINISTRATOR\ORADATA\ORCL\USERS
01.DBF
通道 ORA_DISK_1: 将数据文件 00005 还原到 D:\APP\ADMINISTRATOR\ORADATA\ORCL\PRODU
CT.DBF
通道 ORA_DISK_1: 正在读取备份片段 D:\APP\ADMINISTRATOR\FLASH_RECOVERY_AREA\ORCL\
BACKUPSET\2012_07_19\O1_MF_NNNDF_TAG20120719T155846_80HHKQDP_.BKP
通道 ORA_DISK_1: 段句柄 = D:\APP\ADMINISTRATOR\FLASH_RECOVERY_AREA\ORCL\BACKUPSE
T\2012_07_19\O1_MF_NNNDF_TAG20120719T155846_80HHKQDP_.BKP 标记 = TAG20120719T155
846
通道 ORA_DISK_1: 已还原备份片段 1
通道 ORA_DISK_1: 还原完成, 用时: 00:00:45
完成 restore 于 19-7月 -12
RMAN> recover database;
启动 recover 于 19-7月 -12
使用通道 ORA_DISK_1
正在开始介质的恢复
无法恢复介质
DBGANY: Mismatched message length! [16:29:15.562] (krmiduem)
DBGANY: Mismatched message length! [16:29:15.562] (krmiduem)
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-00600: internal error, arguments [3045] [] [] [] []
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: recover 命令 (在 07/19/2012 16:29:15 上) 失败
ORA-00283: recovery session canceled due to errors
RMAN-11003: 在分析/执行 SQL 语句期间失败: alter database recover if needed
start
ORA-00283: 恢复会话因错误而取消
ORA-00313: 无法打开日志组 2 (用于线程 1) 的成员
ORA-00312: 联机日志 2 线程 1: 'D:\APP\ADMINISTRATOR\ORADATA\ORCL\REDO02.LOG'
ORA-27041: 无法打开文件
OSD-04002: 无法打开文件
O/S-Error: (OS 2) 系统找不到指定的文件。
修复失败了,只能强制恢复了。
SQL> alter system set "_allow_resetlogs_corruption"=true scope=spfile;
系统已更改。
SQL>
《这个隐藏的初始化参数是oracle在open的时候会跳过一些一致性检查》
SQL> recover database until cancel;
ORA-00279: 更改 1475265 (在 07/19/2012 15:58:47 生成) 对于线程 1 是必需的
ORA-00289: 建议:
D:\APP\ADMINISTRATOR\FLASH_RECOVERY_AREA\ORCL\ARCHIVELOG\2012_07_19\O1_MF_1_2_%U_.ARC
ORA-00280: 更改 1475265 (用于线程 1) 在序列 #2 中
指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
cancel
介质恢复已取消。
SQL> alter database open resetlogs;
数据库已更改。
SQL> select count(1) from scott.dept;
COUNT(1)
----------
6
SQL>
由于执行了强制恢复,导致可能有些数据丢失,需要手动录入一些数据