.模拟状态为active的日志损坏的数据恢复实验(不完全恢复)

首先我们先看看Active日志特点

Active:表示日志是活动的但不是当前正在使用的redologactive意味着checkpoint动作尚未完成(脏数据还没有完全刷到磁盘上)or 归档模式下该日志的内容还没有完全归档,这两种情况下都会让日志为active状态,在实例恢复时也会用到此日志文件,因此该日志文件不能被覆盖。

ActiveCurrentredolog日志有一个共同之处就是实例恢复时会用到这个日志文件 ,它们都是checkpoint检查点还没有完成时保护数据安全的最后屏障,如果它们损坏or勿删除了会导致数据的丢失,这是非常危险的,就算有RMAN备份也不能恢复current 状态的数据。

有的朋友会很奇怪不是说有全库备份就可以完事大吉了嘛!这是一种完美主义,没有一种四海皆准的备份,如果你在RMAN备份时候仔细查看了备份日志就会发现一个惊奇的秘密,RMAN是不会备份

Redolog的,但会备份archivelogredolog是用多路复用方式镜像备份的,因此如果删除了current 重做日志那么就会丢失数据,我们要警惕这种场景,做一名优秀的DBA

注:基本上,如果是当前在线日志受损坏,很难不丢数据。但最差的情况下是可以恢复到上一个可用的归档日志时间点的。

恢复方法:

A  使用镜像文件来恢复,不会丢失数据

B  隐含参数_allow_resetlogs_corruption=TRUE  进行不一致性恢复,会丢失数据

C  RMAN不完全恢复,有全备,有归档,可以保证数据的一致性,会丢失数据

###################################################################################


A   使用镜像文件来恢复,不会丢失数据

SQL> select group#,status,members from v$log;


GROUP# STATUS              MEMBERS
------ ---------------- ----------
     1 CURRENT                   2
     2 INACTIVE                  2

     3 ACTIVE                    2


SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。

ORACLE 例程已经关闭。                  


此时我们手动删除REDO003.LOG


SQL>
SQL> startup;                                            重新启动数据库
ORACLE 例程已经启动。


Total System Global Area  556584960 bytes
Fixed Size                  1375932 bytes
Variable Size             293601604 bytes
Database Buffers          255852544 bytes
Redo Buffers                5754880 bytes
数据库装载完毕。
数据库已经打开。                                     数据库并没有报错
SQL> select group#,status,members from v$log;


GROUP# STATUS              MEMBERS
------ ---------------- ----------
     1 CURRENT                   2                           
     2 INACTIVE                  2
     3 INACTIVE                  2


SQL> select group#,status,member from v$logfile;


GROUP# STATUS  MEMBER
------ ------- --------------------------------------------------
     3 INVALID C:\APP\ADMINISTRATOR\ORADATA\ORCL\REDO03.LOG                              
     2         C:\APP\ADMINISTRATOR\ORADATA\ORCL\REDO02.LOG
     1         C:\APP\ADMINISTRATOR\ORADATA\ORCL\REDO01.LOG
     1         C:\APP\ADMINISTRATOR\ORADATA\ORCL\REDO01_2.LOG
     2         C:\APP\ADMINISTRATOR\ORADATA\ORCL\REDO02_2.LOG
     3         C:\APP\ADMINISTRATOR\ORADATA\ORCL\REDO03_2.LOG


已选择6行。

原来第二组有2个成员互为镜像如果第一个成员不可用时oracle就会标记为invalid,把redo数据写入到redo02_b.log第二个成员中继续支持oracle正常运行

SQL> alter system switch logfile;

系统已更改。

SQL> select group#,status,members from v$log;                          

GROUP# STATUS              MEMBERS
------ ---------------- ----------
     1 ACTIVE                    2
     2 CURRENT                   2
     3 INACTIVE                  2

SQL> 

看还可以正常切换,正常使用,但目前只有一个成员可用,也是非常危险的,我们要恢复原状

SQL> alter database drop logfile member 'C:\APP\ADMINISTRATOR\ORADATA\ORCL\REDO0
3.LOG';

数据库已更改。

SQL> alter database add logfile member 'C:\APP\ADMINISTRATOR\ORADATA\ORCL\REDO03
.LOG' to group 3;

数据库已更改。

SQL> alter system switch logfile;

系统已更改。

SQL> select group#,status,member from v$logfile;

GROUP# STATUS  MEMBER
------ ------- --------------------------------------------------
     3         C:\APP\ADMINISTRATOR\ORADATA\ORCL\REDO03.LOG
     2         C:\APP\ADMINISTRATOR\ORADATA\ORCL\REDO02.LOG
     1         C:\APP\ADMINISTRATOR\ORADATA\ORCL\REDO01.LOG
     1         C:\APP\ADMINISTRATOR\ORADATA\ORCL\REDO01_2.LOG
     2         C:\APP\ADMINISTRATOR\ORADATA\ORCL\REDO02_2.LOG
     3         C:\APP\ADMINISTRATOR\ORADATA\ORCL\REDO03_2.LOG

已选择6行。


SQL>

小结:使用镜像文件来恢复,不会丢失数据,因为没有影响到oracle正常的运行

B  隐含参数_allow_resetlogs_corruption=true  进行不一致性恢复,会丢失数据,第二种方法,我把所有的active log全部改名,看看能否恢复

SQL> shutdown abort;              强制关闭数据库
ORACLE 例程已经关闭。
SQL> startup;
ORACLE 例程已经启动。

Total System Global Area  556584960 bytes
Fixed Size                  1375932 bytes
Variable Size             293601604 bytes
Database Buffers          255852544 bytes
Redo Buffers                5754880 bytes
数据库装载完毕。
ORA-00313: 无法打开日志组 1 (用于线程 1) 的成员                   打开redo日志失败
ORA-00312: 联机日志 1 线程 1: 'C:\APP\ADMINISTRATOR\ORADATA\ORCL\REDO01_2.LOG'          指明哪个日志
ORA-27041: 无法打开文件
OSD-04002: 无法打开文件
O/S-Error: (OS 2) 系统找不到指定的文件。
ORA-00312: 联机日志 1 线程 1: 'C:\APP\ADMINISTRATOR\ORADATA\ORCL\REDO01.LOG'            第一个成员找不到我们看看第二个成员有没有
ORA-27041: 无法打开文件
OSD-04002: 无法打开文件
O/S-Error: (OS 2) 系统找不到指定的文件。
SQL>

SQL> select status from v$instance;


STATUS
------------
MOUNTED                                                            目前数据库处于mount状态


SQL>

我们可以使用隐含参数_allow_resetlogs_corruption=true  进行不一致恢复,这是oracle给予我们提供的一种临时急救方法,一般不到万不得已不建议使用,因为这样会丢失数据的,而丢失数据是不能接受的。我们继续


SQL> alter system set "_allow_resetlogs_corruption"=true scope=spfile;

系统已更改。

SQL> shutdown immediate;
ORA-01109: 数据库未打开

已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup mount;
ORACLE 例程已经启动。

Total System Global Area  556584960 bytes
Fixed Size                  1375932 bytes
Variable Size             293601604 bytes
Database Buffers          255852544 bytes
Redo Buffers                5754880 bytes
数据库装载完毕。
SQL> recover database until cancel;
ORA-00279: 更改 2596652 (在 09/04/2013 03:14:41 生成) 对于线程 1 是必需的
ORA-00289: 建议:
C:\APP\ADMINISTRATOR\FLASH_RECOVERY_AREA\ORCL\ARCHIVELOG\2013_09_04\O1_MF_1_22_9


2DF9X7L_.ARC
ORA-00280: 更改 2596652 (用于线程 1) 在序列 #22 中

指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
cancel                                                                                                            手动输入 cancel
ORA-01547: 警告: RECOVER 成功但 OPEN RESETLOGS 将出现如下错误
ORA-01194: 文件 1 需要更多的恢复来保持一致性
ORA-01110: 数据文件 1: 'C:\APP\ADMINISTRATOR\ORADATA\ORCL\SYSTEM01.DBF'

ORA-01112: 未启动介质恢复

需要resetlogs方式开打数据库,也就是非一致性打开

Resetlogs做的几件事:

1)数据文件头scn号为准,同步控制文件和在线日志文件scn

2)重新创建redolog日志(创建一个空日志),重置为unused

3)重置归档日志序号从1开始编码

-rw-r----- 1oracle asmadmin   222720 Apr 26 21:051_1_813790699.dbf

-rw-r----- 1oracle asmadmin     7168 Apr 30 10:25 1_1_814098124.dbf

4)让数据库重新进入一个新的生命周期


SQL> alter database open resetlogs;

数据库已更改。

SQL> select status from v$instance;


STATUS
------------
OPEN


SQL> select group#,status,member from v$logfile;


    GROUP# STATUS  MEMBER
---------- ------- --------------------------------------------------
         3         C:\APP\ADMINISTRATOR\ORADATA\ORCL\REDO03.LOG
         2         C:\APP\ADMINISTRATOR\ORADATA\ORCL\REDO02.LOG
         1         C:\APP\ADMINISTRATOR\ORADATA\ORCL\REDO01.LOG
         1         C:\APP\ADMINISTRATOR\ORADATA\ORCL\REDO01_2.LOG
         2         C:\APP\ADMINISTRATOR\ORADATA\ORCL\REDO02_2.LOG
         3         C:\APP\ADMINISTRATOR\ORADATA\ORCL\REDO03_2.LOG


已选择6行。


SQL> select group#,status,members from v$log;


    GROUP# STATUS              MEMBERS
---------- ---------------- ----------
         1 CURRENT                   2
         2 UNUSED                    2
         3 UNUSED                    2

SQL>

SQL> alter system switch logfile;                                            多切换几次就可看到日志文件正常


系统已更改。


SQL> select group#,status,members from v$log;


    GROUP# STATUS              MEMBERS
---------- ---------------- ----------
         1 ACTIVE                    2
         2 CURRENT                   2
         3 UNUSED                    2


SQL> alter system switch logfile;


系统已更改。


SQL> select group#,status,members from v$log;


    GROUP# STATUS              MEMBERS
---------- ---------------- ----------
         1 ACTIVE                    2
         2 ACTIVE                    2
         3 CURRENT                   2


SQL>

小结:这种方式打开后的数据库要立刻全备一次,之前的备份已经无效,保证数据的安全性

C  RMAN不完全恢复,有全备,有归档,可以保证数据的一致性,会丢失数据。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值