我是靠谱客的博主 善良果汁,最近开发中收集的这篇文章主要介绍oracle 控制文件 scn,数据库控制文件中的SCN详解,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

在的启动和关闭数据库的时候控制文件起着重要的作用,从官方文档中我们可以知道控制 文件中保存着下列的信息:

数据库的名称及数据库创建时间等

所有的数据文件、重做日志文件的名称和位置信息。

表空间的信息。

Offline数据文件的信息。

重做日志及归档日志的信息。

备份集及备份文件的信息

检查点及SCN信息等。

正常关闭数据库时,控制文件中的SCN值

在控制文件的数据文件信息部分,对于每一个数据文件都有一个Checkpoint SCN和Stop SCN,在数据库启动时要对其进行校验。

我们知道数据库在一致性关闭的时候控制文件中的SCN是怎样的呢?

1.一致性关闭数据库。Dump控制文件

SYS@ENMOEDU > shutdown immediate

SYS@ENMOEDU > startup mount

Database mounted.

SYS@ENMOEDU >  oradebug setmypid;

Statement processed.

SYS@ENMOEDU > oradebug dump controlf 3;

Statement processed.

2.数据库的相关信息,上次数据库成功完成检查点的信息

***************************************************************************

DATABASE ENTRY

***************************************************************************

(size = 316, compat size = 316, section max = 1, section in-use = 1,

last-recid= 0, old-recno = 0, last-recno = 0)

(extent = 1, blkno = 1, numrecs = 1)

01/13/2014 16:13:27

DB Name "ENMOEDU"

Database flags = 0x00404001 0x00001000

Controlfile Creation Timestamp  01/13/2014 16:13:28

Incmplt recovery scn: 0x0000.00000000

Resetlogs scn: 0x0000.000fc451 Resetlogs Timestamp  02/05/2014 15:44:46

Prior resetlogs scn: 0x0000.000fa657 Prior resetlogs Timestamp  02/05/2014 14:15:27

Redo Version: compatible=0xb200000

#Data files = 6, #Online files = 6

Database checkpoint: Thread=1 scn: 0x0000.0011b73b

Threads: #Enabled=1, #Open=0, Head=0, Tail=0

3.检查点进程记录。Low cache rba是恢复的起点,此时是fffffff说明数据库不需要恢复。On disk rba是恢复的终点。

***************************************************************************

CHECKPOINT PROGRESS RECORDS

***************************************************************************

(size = 8180, compat size = 8180, section max = 11, section in-use = 0,

last-recid= 0, old-recno = 0, last-recno = 0)

(extent = 1, blkno = 2, numrecs = 11)

THREAD #1 - status:0x1 flags:0x0 dirty:0

low cache rba:(0xffffffff.ffffffff.ffff) on disk rba:(0x6.6f7.0)

on disk scn: 0x0000.0011b58f 02/19/2014 21:58:48

resetlogs scn: 0x0000.000fc451 02/05/2014 15:44:46

heartbeat: 839919586 mount id: 99161229

Flashback log tail log# 2 thread# 1 seq 2 block 5337 byte 0

4.Redo线程记录中记录了检查点的信息,与数据库的检查点一样

***************************************************************************

REDO THREAD RECORDS

***************************************************************************

(size = 256, compat size = 256, section max = 8, section in-use = 1,

last-recid= 0, old-recno = 0, last-recno = 0)

(extent = 1, blkno = 9, numrecs = 8)

THREAD #1 - status:0xbe thread links forward:0 back:0

#logs:3 first:1 last:3 current:3 last used seq#:0x6

enabled at scn: 0x0000.000fc451 02/05/2014 15:44:46

disabled at scn: 0x0000.00000000 01/01/1988 00:00:00

opened at 02/19/2014 21:57:43 by instance ENMOEDU

Checkpointed at scn:  0x0000.0011b73b 02/19/2014 21:58:52

5.数据文件中记录的检查点信息与DATABASE ENTRY记录的一样

***************************************************************************

DATA FILE RECORDS

***************************************************************************

DATA FILE #6:

name #13: /u01/app/oracle/oradata/ENMOEDU/sample01.dbf

creation size=12800 block size=8192 status=0xe head=13 tail=13 dup=1

tablespace 7, index=7 krfil=6 prev_file=0

unrecoverable scn: 0x0000.001143f4 02/10/2014 15:34:23

Checkpoint cnt:7 scn: 0x0000.0011b73b 02/19/2014 21:58:52

Stop scn: 0x0000.0011b73b 02/19/2014 21:58:52

Creation Checkpointed at scn:  0x0000.00111736 02/10/2014 15:28:26

thread:1 rba:(0x4.1f5.10)

enabled  threads:  01000000 00000000 00000000 00000000 00000000 00000000

由于数据库是一致性关闭,数据文件中的Checkpoint scn与Stop scn,database scn和redo中记录的scn值都一样,所以在下次启动数据库的时候可以直接启动,不用进行恢复。

数据库异常关闭的时候的SCN的值。

1.如果数据库异常关闭,则不会执行任何的检查点。通过shutdown abort可以模拟一次异常,当使用shutdown abort方式关闭数据库时,此时的SCN值是怎么样的。

SYS@ENMOEDU > shutdown abort

ORACLE instance shut down.

SYS@ENMOEDU > startup mount

Database mounted.

SYS@ENMOEDU >  oradebug setmypid;

Statement processed.

SYS@ENMOEDU > oradebug dump controlf 3;

Statement processed.

2.在DATABASE ENTRY中我们可以看到数据库thread checkpoint信息。

***************************************************************************

DATABASE ENTRY

***************************************************************************

(size = 316, compat size = 316, section max = 1, section in-use = 1,

last-recid= 0, old-recno = 0, last-recno = 0)

(extent = 1, blkno = 1, numrecs = 1)

01/13/2014 16:13:27

DB Name "ENMOEDU"

Database flags = 0x00404001 0x00001200

Controlfile Creation Timestamp  01/13/2014 16:13:28

Incmplt recovery scn: 0x0000.00000000

Resetlogs scn: 0x0000.000fc451 Resetlogs Timestamp  02/05/2014 15:44:46

Prior resetlogs scn: 0x0000.000fa657 Prior resetlogs Timestamp  02/05/2014 14:15:27

Redo Version: compatible=0xb200000

#Data files = 6, #Online files = 6

Database checkpoint: Thread=1 scn: 0x0000.0011b73e

Threads: #Enabled=1, #Open=1, Head=1, Tail=1

3. 检查点信息其中包含low chache rba和on disk ora信息。low cache rba(recovery block address)是恢复的起点,on disk rba(确定已经写到磁盘上的重做值)是恢复的终点,

***************************************************************************

CHECKPOINT PROGRESS RECORDS

***************************************************************************

(size = 8180, compat size = 8180, section max = 11, section in-use = 0,

last-recid= 0, old-recno = 0, last-recno = 0)

(extent = 1, blkno = 2, numrecs = 11)

THREAD #1 - status:0x2 flags:0x0 dirty:510

low cache rba:(0x6.18e2.0) on disk rba:(0x6.ca99.0)

on disk scn: 0x0000.0011e785 02/19/2014 22:55:08

resetlogs scn: 0x0000.000fc451 02/05/2014 15:44:46

heartbeat: 839992040 mount id: 99202971

Flashback log tail log# 3 thread# 1 seq 3 block 2244 byte 0

4. Redo线程的记录。

***************************************************************************

REDO THREAD RECORDS

***************************************************************************

(size = 256, compat size = 256, section max = 8, section in-use = 1,

last-recid= 0, old-recno = 0, last-recno = 0)

(extent = 1, blkno = 9, numrecs = 8)

THREAD #1 - status:0xbf thread links forward:0 back:0

#logs:3 first:1 last:3 current:3 last used seq#:0x6

enabled at scn: 0x0000.000fc451 02/05/2014 15:44:46

disabled at scn: 0x0000.00000000 01/01/1988 00:00:00

opened at 02/19/2014 22:49:27 by instance ENMOEDU

Checkpointed at scn:  0x0000.0011b73e 02/19/2014 22:49:27

thread:1 rba:(0x6.9ce.10)

enabled  threads:  01000000 00000000 00000000 00000000 00000000 00000000

5. 数据文件的检查点信息;

DATA FILE #6:

name #13: /u01/app/oracle/oradata/ENMOEDU/sample01.dbf

creation size=12800 block size=8192 status=0xe head=13 tail=13 dup=1

tablespace 7, index=7 krfil=6 prev_file=0

unrecoverable scn: 0x0000.001143f4 02/10/2014 15:34:23

Checkpoint cnt:8 scn: 0x0000.0011b73e 02/19/2014 22:49:27

Stop scn: 0xffff.ffffffff 02/19/2014 21:58:52

Creation Checkpointed at scn:  0x0000.00111736 02/10/2014 15:28:26

thread:1 rba:(0x4.1f5.10)

enabled  threads:  01000000 00000000 00000000 00000000 00000000 00000000

可以看出由于是异常关闭数据库,数据库没有完成最后的检查点,数据库文件的stop scn仍然设定为最大的ffffffff。由以上信息可以看出,各部分的checkpoint scn都是一样的,但是数据文件的stop scn不等于checkpoint scn,意味着数据库的上一次的关闭没有执行完全检查点,是异常关闭数据库,此时启动数据库需要进行完全恢复。

在进行恢复的时候,从检查点信息中读取low cache rba的值确定日志文件的地址。再读取日志,从最后的检查点开始,应用所有的重做记录,这个过程叫做前滚。数据库可以被打开提供访问和使用,但是此时数据库中包含已提交的和没有提交的事务,使用undo段回滚。

再对数据库进行实例恢复的时候,我们从alert日志中可以看到的信息。

alter database open

Beginning crash recovery of 1 threads

parallel recovery started with 2 processes

Started redo scan

Completed redo scan

read 22747 KB redo, 510 data blocks need recovery

Started redo application at

Thread 1: logseq 6, block 6370

Recovery of Online Redo Log: Thread 1 Group 3 Seq 6 Reading mem 0

Mem# 0: /u01/app/oracle/oradata/ENMOEDU/redo03.log

Completed redo application of 3.07MB

Wed Feb 19 23:13:55 2014

Completed crash recovery at

Thread 1: logseq 6, block 51865, scn 1193381

510 data blocks read, 493 data blocks written, 22747 redo k-bytes read

Wed Feb 19 23:13:55 2014

在实例恢复的时候。 Alter中的logseq 6, block 6370就是日志中的检查点中记录的low cache rba:(0x6.18e2.0)。恢复完成时的logseq 6, block 51865就是on disk rba:(0x6.ca99.0)。把十六进制的数换成十进制。

总结:当一致性关闭数据库的时候,关闭数据库之前数据库会执行一个检查点动作,每个数据文件的你Stop SCN会被设置为Checkpoint SCN。数据库不需要恢复。当数据库是异常关闭的时候,Stop SCN来不及设置为Checkpoint SCN会是无穷大,在重启数据库的时候需要恢复

最后

以上就是善良果汁为你收集整理的oracle 控制文件 scn,数据库控制文件中的SCN详解的全部内容,希望文章能够帮你解决oracle 控制文件 scn,数据库控制文件中的SCN详解所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(49)

评论列表共有 0 条评论

立即
投稿
返回
顶部