环境: windows XP Pro + oracle 9.2.0.4
一、redologfile group的删除
为了模拟日志故障,需要手工删除一些日志组,下面介绍如何删除日志组,以及影响:
logfile group的状态有3种current、active、inactive。
其中active和inactive的都可以删除。在数据库open状态或其他状态都可以。这里所说的删除是用操作系统的删除。如果用alter database drop logfile group * 的话,则只能删除inactive状态的logfile group。
其中删除active状态的logfile group后,最好alter system checkpoint,因为,这时如果不手工发出检查点的话,一旦数据库出现问题(abort,由于instance recovery需要active的logfile group),将不能正常恢复。
当前(current)日志组不能在open状态下删除。原因显而易见,至于删除之后如何恢复,下面将予以介绍。
二、丢失非活动的日志组
1、系统是noarchivelog
SQL> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS
---------- ---------- ---------- ---------- ---------- --- ----------------
FIRST_CHANGE# FIRST_TIME
------------- ----------
1 1 22 104857600 1 NO INACTIVE
243099 26-8月 -06
2 1 23 104857600 1 NO CURRENT
243170 26-8月 -06
3 1 21 104857600 1 NO INACTIVE
243097 26-8月 -06
现在在系统中删除 group 3,这时系统是open状态。
手工switch logfile后,例程马上崩溃;
SQL> alter system switch logfile;
alter system switch logfile
*
ERROR 位于第 1 行:
ORA-03113: 通信通道的文件结束
恢复方法有两种:
(1) drop相应的logfile group,添加新的logfile group。
将数据库mount状态
SQL> startup mount
ORACLE 例程已经启动。
Total System Global Area 135339844 bytes
Fixed Size 454468 bytes
Variable Size 109051904 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
数据库装载完毕。
SQL> alter database open;
alter database open
*
ERROR 位于第 1 行:
ORA-00313: 无法打开日志组 3 (线程 1) 的成员
ORA-00312: 联机日志 3 线程 1: 'E:\ORACLE\ORADATA\FOX\REDO03.LOG'
alter database drop logfile group 3;
SQL> alter database drop logfile group 3;
数据库已更改。
SQL> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS
---------- ---------- ---------- ---------- ---------- --- ----------------
FIRST_CHANGE# FIRST_TIME
------------- ----------
1 1 22 104857600 1 NO INACTIVE
243099 26-8月 -06
2 1 23 104857600 1 NO INVALIDATED
243170 26-8月 -06
SQL> select * from v$logfile;
GROUP# STATUS TYPE
---------- ------- -------
MEMBER
----------------------------------
1 ONLINE
E:\ORACLE\ORADATA\FOX\REDO01.LOG
2 STALE ONLINE
E:\ORACLE\ORADATA\FOX\REDO02.LOG
此时,group 2变成INVALIDATED,是因为,发生日志切换过程中,数据库crash,所以group 2变成INVALIDATED,REDO02.LOG变成了stale(stale经常出现在上一次操作失败后,下一次成功操作后会恢复正常)
alter database add logfile group 3
('e:\oracle\oradata\fox\redo03.log') size 100M;
SQL> alter database add logfile group 3
2 ('e:\oracle\oradata\fox\redo03.log')
3 size 100M;
数据库已更改。
SQL> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS
---------- ---------- ---------- ---------- ---------- --- ----------------
FIRST_CHANGE# FIRST_TIME
------------- ----------
1 1 22 104857600 1 NO INACTIVE
243099 26-8月 -06
2 1 23 104857600 1 NO INVALIDATED
243170 26-8月 -06
3 1 0 104857600 1 YES UNUSED
alter database open;
SQL> alter database open;
数据库已更改。
SQL> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS
---------- ---------- ---------- ---------- ---------- --- ----------------
FIRST_CHANGE# FIRST_TIME
------------- ----------
1 1 22 104857600 1 NO INACTIVE
243099 26-8月 -06
2 1 23 104857600 1 NO INACTIVE
243170 26-8月 -06
3 1 24 104857600 1 NO CURRENT
263663 26-8月 -06
注意,打开数据库后,group 2 inactive状态,日志自动切换到group 3。
(2) alter database clear logfile group *的方法
上面试验到数据库mount状态后,运行
SQL> alter database clear logfile group 3;
数据库已更改。
SQL>
SQL> alter database open;
记住,alter database clear logfile group 3这种方法,数据库会自动重建redo03.log日志文件。
2、系统是archivelog的
(1)删除的为已经archive的group
数据库日志状态为:
SQL> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS
---------- ---------- ---------- ---------- ---------- --- ----------------
FIRST_CHANGE# FIRST_TIME
------------- ----------
1 1 26 104857600 1 NO CURRENT
2012333 26-8月 -06
2 1 24 104857600 1 YES INACTIVE
765483 24-8月 -06
3 1 25 104857600 1 YES INACTIVE
1987398 24-8月 -06
在系统中删除 redo02.log后,手工switch logfile,instance立即崩溃。
SQL> alter system switch logfile;
alter system switch logfile
*
ERROR 位于第 1 行:
ORA-03113: 通信通道的文件结束
重启数据库:
SQL> startup mount
ORACLE 例程已经启动。
Total System Global Area 135339844 bytes
Fixed Size 454468 bytes
Variable Size 109051904 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
数据库装载完毕。
SQL>
SQL> alter database open;
alter database open
*
ERROR 位于第 1 行:
ORA-00313: 无法打开日志组 2 (线程 1) 的成员
ORA-00312: 联机日志 2 线程 1: 'E:\ORACLE\ORADATA\MYDB\REDO02.LOG'
对redo02进行恢复:
SQL> alter database clear logfile group 2;
数据库已更改。
SQL>
SQL> alter database open;
数据库已更改。
当然,也可以通过 drop掉 group 2,然后再添加的方法恢复group 2 了。
(2)如果删除的inactive日志还没归档的话
则使用 alter database unarchived logfile group * 来恢复,恢复后系统以前的备份无效,需要重新进行数据库全备。
1、在丢失之前系统正常关闭的状态下
由于,关闭前系统已经完成了检查点,此种情况对于8i可以对当前日志进行 clear,对于9i可以进行until cancel恢复。然后open resetlogs打开数据库。
2、在丢失之前系统异常关闭
此时,对于noarchivelog模式下,只能从数据库全备中恢复了
对于archivelog模式,可以找到最近一次的数据库备份,然后作基于cancel的恢复。