redo日志丢失情况种种(帖子不错,先转过来,以后需要时可参考一下)

平常心试验第一课:redo日志丢失情况种种

--试验环境 oracle10.2.0.4
--平常心 redo系列实验1(--现实中的可能:断电,redo日志组全部丢失。)
--步骤1:先创建一个表
create table newback03 as select * from v$log;
--步骤2:使得创建表的变化没有写入到数据文件中,只写在当前日志redo01.log文件中,并且redo01.log没有归档。模拟断电
shutdown abort
--步骤3:将redo01.log,redo02.log,redo02.log全部重命名(模拟redo全部丢失)
--步骤4:将数据库启动到mount状态,这个时候数据库是无法open的
startup mount
--步骤5:执行数据库恢复,数据文件处于不一致的状态,又无法从归档日志中恢复,那么建表语句就丢失了。
--数据库丢失了数据。你就哭吧。
recover database until cancel;

--试验模拟的结果
SQL> create table newback01 as select * from v$log;
表已创建。
SQL> shutdown abort
ORACLE 例程已经关闭。
SQL> startup mount;
ORACLE 例程已经启动。
Total System Global Area  167772160 bytes
Fixed Size                  1295632 bytes
Variable Size             104860400 bytes
Database Buffers           58720256 bytes
Redo Buffers                2895872 bytes
数据库装载完毕。
SQL> recover database until cancel;
ORA-00279: 更改 1152128 (在 11/02/2009 17:20:16 生成) 对于线程 1 是必需的
ORA-00289: 建议:
C:/ORACLE/PRODUCT/10.2.0/FLASH_RECOVERY_AREA/ORCL/ARCHIVELOG/2009_11_02/O1_MF_1_2_%U_.ARC
ORA-00280: 更改 1152128 (用于线程 1) 在序列 #2 中
指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
ORA-00308: 无法打开归档日志
'C:/ORACLE/PRODUCT/10.2.0/FLASH_RECOVERY_AREA/ORCL/ARCHIVELOG/2009_11_02/O1_MF_1
_2_%U_.ARC'
ORA-27041: 无法打开文件
OSD-04002: 无法打开文件
O/S-Error: (OS 2) 系统找不到指定的文件。
ORA-01547: 警告: RECOVER 成功但 OPEN RESETLOGS 将出现如下错误
ORA-01194: 文件 1 需要更多的恢复来保持一致性
ORA-01110: 数据文件 1: 'C:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/SYSTEM01.DBF'
SQL> alter database open resetlogs;
alter database open resetlogs
*
第 1 行出现错误:
ORA-01194: 文件 1 需要更多的恢复来保持一致性
ORA-01110: 数据文件 1: 'C:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/SYSTEM01.DBF'

教育我们:redo文件组需要创建多个组,建议至少3个,每个组至少2个文件,最好放在不同的硬盘上。
如果不幸发生了断电,并且所有的redo丢失。这是最糟糕的情况。
一般不会发生,如果发生了,你家祖坟就冒青烟了,你可以去买88倍投的彩票了。



--平常心 redo系列的实验2(--现实中的可能,数据库正常关闭,单位不爽你很久的某个人,趁你不注意,把你redo文件全部删除了)
--步骤1:先创建一个表
create table newback02 as select * from v$log;
--步骤2:使得创建表的变化写入到数据文件中。
shutdown immediate
--步骤3:将redo01.log,redo02.log,redo02.log全部重命名(模拟redo全部丢失)
--步骤4:将数据库启动到mount状态,这个时候数据库是无法open的
startup mount
--步骤5:执行数据库恢复,恢复正常。
recover database until cancel;
--步骤6:执行数据库打开,没有丢失任何数据
alter database open resetlogs;
--步骤7:立即用rman执行全库备份(备份的方法我就不在这里啰嗦了,但是我要强调resetlogs之后全库备份的重要性
--10g之前的版本中oracle是不能使用resetlogs之前的备份的。10g版本是可以穿越resetlogs进行恢复的,这个还得研究一下)

--试验模拟的结果
SQL> create table newback02 as select * from v$log;
表已创建。
SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup mount;
ORACLE 例程已经启动。
Total System Global Area  167772160 bytes
Fixed Size                  1295632 bytes
Variable Size             104860400 bytes
Database Buffers           58720256 bytes
Redo Buffers                2895872 bytes
数据库装载完毕。
SQL> recover database until cancel;
完成介质恢复。
SQL> alter database open resetlogs;
数据库已更改。
--结果:正常恢复数据库。数据没有丢失,坏人没有得逞。但是执行了resetlogs。这给备份恢复管理带来了很多麻烦,但是只能这样了。





--平常心 redo系列实验3(现实中的可能:你有3组文件 redo01,redo02,redo03。有一次数据库正常关闭后。丢失了redo02,redo03.当前组是redo01)
SQL> select group#,archived,status from v$log;
     GROUP# ARC STATUS
---------- --- ----------------
     1   NO    CURRENT
     2   YES   INACTIVE
     3   YES   INACTIVE
SQL> create table newback05 as select * from v$log;
表已创建。
SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup mount;
ORACLE 例程已经启动。
Total System Global Area  167772160 bytes
Fixed Size                  1295632 bytes
Variable Size             104860400 bytes
Database Buffers           58720256 bytes
Redo Buffers                2895872 bytes
数据库装载完毕。
SQL> alter database clear logfile group 2;
数据库已更改。
SQL> alter database clear logfile group 3;
数据库已更改。
SQL> alter database open;

--结果。一切正常,数据没有丢失,不用resetlogs。




--平常心 redo系列实验4(数据库正常关闭,当前日志redo01损坏)
select group#,archived,status from v$log;
1        1        NO        CURRENT
2        2        YES        ACTIVE
3        3        YES        ACTIVE
--第一步
shutdown immediate; 完成之后日志组2、3状态就是INACTIVE了。如果shutdown abort 就还是ACTIVE。断电很可怕啊
--第二步
startup mount;
--第三步 修改redo01的内容,用记事本打开,删掉部分乱码
--第四步:
SQL> alter database clear unarchived logfile group 1;
alter database clear unarchived logfile group 1
*
第 1 行出现错误:
ORA-00313: 无法打开日志组 1 (用于线程 1) 的成员
ORA-00312: 联机日志 1 线程 1:
'C:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/REDO01.LOG'
ORA-27046: 文件大小不是逻辑块大小的倍数
OSD-04012: 文件大小不匹配 (OS 52267343)
--注意:网络上有说用 alter database clear unarchived logfile group 1 恢复成功的,但是前提是有redo的备份。
SQL> recover database until cancel;
完成介质恢复。
SQL> alter database open resetlogs;
数据库已更改。



--平常心redo实验5(多个日志组,每个日志多个成员的好处)
--第一步:我们先看一下目前的状态
select group#,archived,status from v$log;
GROUP#        ARCHIVED        STATUS
1        1        YES        INACTIVE
2        3        NO        CURRENT
3        2        YES        INACTIVE
select * from v$logfile
GROUP#        STATUS        TYPE        MEMBER        IS_RECOVERY_DEST_FILE
3                            ONLINE        C:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/REDO03.LOG        NO
2                            ONLINE        C:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/REDO02.LOG        NO
1                            ONLINE        C:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/REDO01.LOG        NO
--第二步:
--每个组增加一个成员(注意:如果open状态增加,当前组需切换后才能增加)
alter database add logfile member 'C:/oracle/product/10.2.0/oradata/orcl/redo01b.log' to group 1;
alter database add logfile member 'C:/oracle/product/10.2.0/oradata/orcl/redo02b.log' to group 2;
alter database add logfile member 'C:/oracle/product/10.2.0/oradata/orcl/redo03b.log' to group 3;

--第三步:创建表
create table newback10 as select * from v$log;
--第四步:切换日志
alter system switch logfile;
alter system switch logfile;
alter system switch logfile;
--第五步:再看一下select * from v$logfile
GROUP#        STATUS        TYPE        MEMBER        IS_RECOVERY_DEST_FILE
3                            ONLINE        C:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/REDO03.LOG        NO
2                            ONLINE        C:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/REDO02.LOG        NO
1                            ONLINE        C:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/REDO01.LOG        NO
1                            ONLINE        C:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/REDO01B.LOG        NO
2                            ONLINE        C:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/REDO02B.LOG        NO
3                            ONLINE        C:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/REDO03B.LOG        NO
--第六步:shutdown abort 停电了
--第七步:每组坏掉一个日志B
--第八步:startup mount;
--第九步:alter database open;
--第十步:看一下数据库表desc newback10 正常
--第十一步:再看一下select * from v$logfile
GROUP#        STATUS        TYPE        MEMBER        IS_RECOVERY_DEST_FILE
        3            STALE          ONLINE        C:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/REDO03.LOG        NO
        2                          ONLINE        C:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/REDO02.LOG        NO
        1                          ONLINE        C:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/REDO01.LOG        NO
        1            INVALID        ONLINE        C:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/REDO01B.LOG        NO
        2            INVALID        ONLINE        C:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/REDO02B.LOG        NO
        3            INVALID        ONLINE        C:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/REDO03B.LOG        NO
--第十二步:切换一下日志
alter system switch logfile;
alter system switch logfile;
alter system switch logfile;
--第十三步:再看一下select * from v$logfile
GROUP#        STATUS        TYPE        MEMBER        IS_RECOVERY_DEST_FILE
        3                    ONLINE        C:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/REDO03.LOG        NO
        2                          ONLINE        C:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/REDO02.LOG        NO
        1                          ONLINE        C:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/REDO01.LOG        NO
        1            INVALID        ONLINE        C:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/REDO01B.LOG        NO
        2            INVALID        ONLINE        C:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/REDO02B.LOG        NO
        3            INVALID        ONLINE        C:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/REDO03B.LOG        NO
--第十四步:看来一切正常,我们再把丢失的文件加上去
ALTER DATABASE ADD LOGFILE 'C:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/REDO01B.LOG' size 50M;
ORA-01577无法添加日志文件,已存在。我们先要将无效的日志组成员删除,注意当前日志组需要切换后才能删除。
ALTER DATABASE DROP LOGFILE MEMBER 'C:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/REDO01B.LOG';
ALTER DATABASE DROP LOGFILE MEMBER 'C:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/REDO02B.LOG';
ALTER DATABASE DROP LOGFILE MEMBER 'C:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/REDO03B.LOG';
--最后。删除完成。再加上吧
alter database add logfile member 'C:/oracle/product/10.2.0/oradata/orcl/redo01b.log' to group 1;
alter database add logfile member 'C:/oracle/product/10.2.0/oradata/orcl/redo02b.log' to group 2;
alter database add logfile member 'C:/oracle/product/10.2.0/oradata/orcl/redo03b.log' to group 3;

--结果,oracle虽然只要求2个日志组,每组一个成员就可以工作,但是我们推荐至少3个日志组,每个组至少2个成员
--即使你丢失了每个组个一个成员,数据库也是可以做到不会丢失任何数据。



总结:情况一:
数据库正常关闭的情况下,所有的变化都已经写入到数据文件中了,数据不会有任何丢失,
即使所有redo都丢失了,也没有关系。可以使用recover database until cancel来恢复数据库。
如果丢失除current之外的已经归档了的redo,那么不用去recover也可以恢复。clear一下也就行了。
如果丢失的redo如果没有规档,也是要执行recover database unti cancel 来恢复。
情况二:
数据库不正常关闭的情况下,如果redo文件全部损坏,那肯定是要丢失数据的。
较好的情况是current没有坏,其它redo状态时INACTIVE并且已经归档了,但是丢失了。
最坏的情况,数据库不正常关闭,redo文件全部损坏,redo的状态是active和current,无法删除和创建redo文件
这种情况下只能做imcomplete恢复,如果没有备份,你的数据库可能就无法恢复了。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值