Controlfile 重建控制文件 noresetlogs, resetlogs..

当数据库当前的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 ?


指定日志: {=suggested | filename | AUTO | CANCEL}

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由三个部分组成:

  1. 日志文件序列号(4字节)  ——根据这个找到对应的日志文件地址。
  2. 日志文件块编号(4字节)  ——根据这个找到对应日志条目所在的日志文件块。
  3. 重做日志记录在日志块中的起始偏移字节数(2字节)  ——找到对应的日志条目。




请使用浏览器的分享功能分享到微信等