首先我们先看看Active日志特点
Active:表示日志是活动的但不是当前正在使用的redolog,active意味着checkpoint动作尚未完成(脏数据还没有完全刷到磁盘上)or 归档模式下该日志的内容还没有完全归档,这两种情况下都会让日志为active状态,在实例恢复时也会用到此日志文件,因此该日志文件不能被覆盖。
Active和Currentredolog日志有一个共同之处就是实例恢复时会用到这个日志文件 ,它们都是checkpoint检查点还没有完成时保护数据安全的最后屏障,如果它们损坏or勿删除了会导致数据的丢失,这是非常危险的,就算有RMAN备份也不能恢复current 状态的数据。
有的朋友会很奇怪不是说有全库备份就可以完事大吉了嘛!这是一种完美主义,没有一种四海皆准的备份,如果你在RMAN备份时候仔细查看了备份日志就会发现一个惊奇的秘密,RMAN是不会备份
Redolog的,但会备份archivelog,redolog是用多路复用方式镜像备份的,因此如果删除了current 重做日志那么就会丢失数据,我们要警惕这种场景,做一名优秀的DBA!
注:基本上,如果是当前在线日志受损坏,很难不丢数据。但最差的情况下是可以恢复到上一个可用的归档日志时间点的。
恢复方法:
A 使用镜像文件来恢复,不会丢失数据
B 隐含参数_allow_resetlogs_corruption=TRUE 进行不一致性恢复,会丢失数据
C RMAN不完全恢复,有全备,有归档,可以保证数据的一致性,会丢失数据
###################################################################################
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> 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不完全恢复,有全备,有归档,可以保证数据的一致性,会丢失数据。