当数据库当前的Redo Log都可用时(no matter 断电或者shutdown abort),可以通过
noresetlogs
参数重建控制文件,此时
Oracle能够从日志文件中读取Redo信息
(同样的,控制文件也能够从数据文件中获得详细的检查点信息),记录到控制文件中,由于Redo中记录的信息足以重演所有提交成功的事物,所以能够实现完全恢复,成功打开数据库,
这时的数据库就如同进行了一次断电之后的实例恢复,数据没有损失,重做日志可以继续向前写入
。
CREATE CONTROLFILE REUSE DATABASE "ORCL" NORESETLOGS NOARCHIVELOG
。。。。
转储新建的控制文件,可看到 LOG FILE #3是当前的日志文件,而且包含scn等信息。
alter session set events 'immediate trace name CONTROLF level 8'
***************************************************************************
LOG FILE RECORDS
***************************************************************************
(size = 72, compat size = 72, section max = 16, section in-use = 3,
last-recid= 0, old-recno = 0, last-recno = 0)
(extent = 1, blkno = 10, numrecs = 16)
LOG FILE #1:
name #5: E:\ORACLE\ORADATA\ORCL\ONLINELOG\O1_MF_1_G23756JL_.LOG
name #6: E:\ORACLE\FAST_RECOVERY_AREA\ORCL\ORCL\ONLINELOG\O1_MF_1_G2375PPY_.LOG
Thread 1 redo log links: forward: 2 backward: 0
siz: 0x64000 seq: 0x00000010 hws: 0x3 bsz: 512 nab: 0x16c flg: 0x0 dup: 2
Archive links: fwrd: 0 back: 0 Prev scn: 0x0000000000000000
Low scn: 0x000000000024df24 01/01/2019 17:09:28
Next scn: 0x000000000024e27c 01/01/2019 17:43:47
LOG FILE #2:
name #3: E:\ORACLE\ORADATA\ORCL\ONLINELOG\O1_MF_2_G23756JT_.LOG
name #4: E:\ORACLE\FAST_RECOVERY_AREA\ORCL\ORCL\ONLINELOG\O1_MF_2_G2375PQF_.LOG
Thread 1 redo log links: forward: 3 backward: 1
siz: 0x64000 seq: 0x00000011 hws: 0x4 bsz: 512 nab: 0x4e05 flg: 0x0 dup: 2
Archive links: fwrd: 0 back: 0 Prev scn: 0x000000000024df24
Low scn: 0x000000000024e27c 01/01/2019 17:43:47
Next scn: 0x0000000000267e7b 01/01/2019 20:59:36
LOG FILE #3:
name #1: E:\ORACLE\ORADATA\ORCL\ONLINELOG\O1_MF_3_G23756K3_.LOG
name #2: E:\ORACLE\FAST_RECOVERY_AREA\ORCL\ORCL\ONLINELOG\O1_MF_3_G2375PQ6_.LOG
Thread 1 redo log links: forward: 0 backward: 2
siz: 0x64000 seq: 0x00000012 hws: 0x2 bsz: 512 nab: 0xffffffff flg: 0xa dup: 2
Archive links: fwrd: 0 back: 0 Prev scn: 0x000000000024e27c
Low scn: 0x0000000000267e7b 01/01/2019 20:59:36
Next scn: 0xffffffffffffffff 01/01/1988 00:00:00
如果用resetlogs重建控制文件,在恢复时就需要 RECOVER DATABASE USING BACKUP CONTROLFILE
CREATE CONTROLFILE REUSE DATABASE "ORCL" RESETLOGS NOARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 1024
。。。。
这时查看转储的控制文件,scn是0
***************************************************************************
LOG FILE RECORDS
***************************************************************************
(size = 72, compat size = 72, section max = 16, section in-use = 3,
last-recid= 0, old-recno = 0, last-recno = 0)
(extent = 1, blkno = 10, numrecs = 16)
LOG FILE #1:
name #5: E:\ORACLE\ORADATA\ORCL\ONLINELOG\O1_MF_1_G23756JL_.LOG
name #6: E:\ORACLE\FAST_RECOVERY_AREA\ORCL\ORCL\ONLINELOG\O1_MF_1_G2375PPY_.LOG
Thread 1 redo log links: forward: 2 backward: 0
siz: 0x64000 seq: 0x00000000 hws: 0x0 bsz: 512 nab: 0x0 flg: 0x1 dup: 2
Archive links: fwrd: 0 back: 0 Prev scn: 0x0000000000000000
Low scn: 0x0000000000000000 01/01/1988 00:00:00
Next scn: 0x0000000000000000 01/01/1988 00:00:00
SQL> RECOVER DATABASE USING BACKUP CONTROLFILE UNTIL CANCEL ;
ORA-00279: ?? 2829520 (? 01/01/2019 22:22:52 ??) ???? 1 ????
ORA-00289: ??: E:\ORACLE\FAST_RECOVERY_AREA\ORCL\ORCL\ARCHIVELOG\2019_01_01\O1_MF_1_2_%U_.ARC
ORA-00280: ?? 2829520 (???? 1) ??? #2 ?
指定日志: {
E:\oracle\oradata\ORCL\ONLINELOG\O1_MF_2_G23756JT_.LOG
(如果当前redo日志在,不需要指定日志文件,选cancel会自动media recovery。 这里测试了把日志文件都移走,选cancel的话,
open resetlogs会出错,提示需要介质恢复。)
已应用的日志。
完成介质恢复。
SQL> alter database open resetlogs ;
数据库已更改。
再查看转储的控制文件,logfile2,3 scn是0,到v$log能看到状态是unused.
***************************************************************************
LOG FILE RECORDS
***************************************************************************
(size = 72, compat size = 72, section max = 16, section in-use = 3,
last-recid= 9, old-recno = 0, last-recno = 0)
(extent = 1, blkno = 10, numrecs = 16)
LOG FILE #1:
name #5: E:\ORACLE\ORADATA\ORCL\ONLINELOG\O1_MF_1_G23756JL_.LOG
name #6: E:\ORACLE\FAST_RECOVERY_AREA\ORCL\ORCL\ONLINELOG\O1_MF_1_G2375PPY_.LOG
Thread 1 redo log links: forward: 2 backward: 0
siz: 0x64000 seq: 0x00000001 hws: 0x3 bsz: 512 nab: 0xffffffff flg: 0x8 dup: 2
Archive links: fwrd: 0 back: 0 Prev scn: 0x0000000000000000
Low scn: 0x000000000029a3d3 01/01/2019 22:15:44
Next scn: 0xffffffffffffffff 01/01/1988 00:00:00
LOG FILE #2:
name #3: E:\ORACLE\ORADATA\ORCL\ONLINELOG\O1_MF_2_G23756JT_.LOG
name #4: E:\ORACLE\FAST_RECOVERY_AREA\ORCL\ORCL\ONLINELOG\O1_MF_2_G2375PQF_.LOG
Thread 1 redo log links: forward: 3 backward: 1
siz: 0x64000 seq: 0x00000000 hws: 0x2 bsz: 512 nab: 0x2 flg: 0x1 dup: 2
Archive links: fwrd: 0 back: 0 Prev scn: 0x0000000000000000
Low scn: 0x0000000000000000 01/01/1988 00:00:00
Next scn: 0x0000000000000000 01/01/1988 00:00:00
resetlogs重建控制文件恢复时,控制文件没有redo信息,rman怎么知道恢复到哪? 答案就在数据文件头的RBA(Redo Byte Address) ,RBA包含了日志文件的序列号(log sequence)
RBA就是重做日志块(redo log block)的地址,相当与数据文件中的ROWID, 通过这个地址来定位重做日志块 。RBA由三个部分组成:
- 日志文件序列号(4字节) ——根据这个找到对应的日志文件地址。
- 日志文件块编号(4字节) ——根据这个找到对应日志条目所在的日志文件块。
- 重做日志记录在日志块中的起始偏移字节数(2字节) ——找到对应的日志条目。