今天一个开发库启动不了了,发过来报错一看是日志文件损坏了(见下图),接着说了一下前因后果。说是年前服务器掉电了,然后就再没有启动起来过。今天有人用才想到要处理。
先说一下大体的思路,如果损坏的redo log是INACTIVE状态的,也就是实例崩溃恢复用不到的redo log,那处理起来比较容易,直接alter database clear logfile group #;或alter database clear unarchived logfile group #;重建日志组就行了。建议重建日志文件级后对数据库做一个全库备份,特别是强制clear后,造成的归档日志文件断层。在如果损坏的redo log是ACTIVE或CURRENT状态的,也就是实例崩溃恢复需要用到的redo log,那处理起来就比较麻烦了,损坏这种redo log就意味着丢失数据。
redo log的三种状态:
INACTIVE:日志对应的修改已经被写入硬盘
ACTIVE:日志对应的修改还没有被写入硬盘
CURRENT:实例正在使用的日志文件
由于这个开发库有种种的问题,恢复起来遇到了各种情况,这里用一个虚拟机上的数据库演示如果CURRENT或ACTIVE状态的日志文件损坏的情况下如何恢复。
1、构造场景
删除一张表的数据但不提交,然后在另一个会话中把数据库shutdown abort。再删除所有的redo log文件。
#session1
sys@ORCL>deletefromzx;
2858rowsdeleted.
#session2
sys@ORCL>selectgroup#,statusfromv$log;
GROUP#STATUS
----------------------------------------------------------
1INACTIVE
2ACTIVE
3CURRENT
sys@ORCL>shutdownabort;
ORACLEinstanceshutdown.
#删除redolog文件
[oracle@rhel6~]$cd/u02/app/oracle/oradata/orcl/
[oracle@rhel6orcl]$ls-l
total19449