四个SCN 和 using backup controlfile

上一篇 / 下一篇  2007-10-26 00:00:00 / 个人分类:Oracle

From: http://logzgh.itpub.net/post/3185/42513

scn号与oracle数据库恢复过程有着密切的关系,只有很好地理解了这层关系,才能深刻地理解恢复的原理,从而才能很好地解决这方面的问题。

一。SCN与CHECKPOINTITPUB个人空间@uQv!w,S0yFc
CKPT进程在checkpoint发生时,将当时的SCN号写入数据文件头和控制文件,同时通知DBWR进程将数据块写到ITPUB个人空间BX'y/i0?\
数据文件。
PV'~ fm0CKPT进程也会在控制文件中记录RBA(redo block address),以标志Recovery需要从日志中哪个地方开始。

与checkpoint相关的SCN号有四个,其中三个存在控制文件中,一个存放在数据文件头中。
'gA jlh5q7{"R0这四个分别是:
S$Eu1C3z3b01.System Checkpoint SCNITPUB个人空间OTj a,x'a0wnn!W
当checkpoint完成后,ORACLE将System Checkpoint SCN号存放在控制文件中。
;o/[]'Xw%R+O0我们可以通过下面SQL语句查询:ITPUB个人空间ow@ e(r1H
select checkpoint_change# from v$database;

2.Datafile Checkpoint SCNITPUB个人空间 T }M$v{^;S6E
当checkpoint完成后,ORACLE将Datafile Checkpoint SCN号存放在控制文件中。
yQ)s)k%UE0我们可以通过下面SQL语句查询所有数据文件的Datafile Checkpoinnt SCN号。ITPUB个人空间"cI2q&mv
select name,checkpoint_change# from v$datafile;

3.Start SCN号
$N;L"I8?~0ORACLE将Start SCN号存放在数据文件头中。
cZPrh0这个SCN用于检查数据库启动过程是否需要做media recovery.ITPUB个人空间Sm)e+h1s!O$m
我们可以通过以下SQL语句查询:ITPUB个人空间_W)}Cn6E~D
select name,checkpoint_change# from v$datafile_header;

4.End SCN号ITPUB个人空间KMiCqv
ORACLE将End SCN号存放在控制文件中。
{I,k.rF p-a.c0这个SCN号用于检查数据库启动过程是否需要做instance recovery.ITPUB个人空间wF7shh;cK@t1K
我们可以通过以下SQL语句查询:ITPUB个人空间a&qoxih
select name,last_change# from v$datafile;

在数据库正常运行的情况下,对可读写的,online的数据文件,该SCN号为NULL.


W"AQB E-?0

ITPUB个人空间5^&L8wjkl{
二。SCN号与数据库启动
VV \ e~*F*^0在数据库启动过程中,当System Checkpoint SCN、Datafile Checkpoint SCN和
HL z6X)XO d ~ F0Start SCN号都相同时,数据库可以正常启动,不需要做media recovery.三者当中有ITPUB个人空间-M-Jo @N^'y
一个不同时,则需要做media recovery.ITPUB个人空间B!m+| BY S T,E
ITPUB个人空间0N;P\r | @eLcS
如果在启动的过程中,End SCN号为NULL,则需要做instance recovery.ITPUB个人空间`${ dF8YH ~Y_
ORACLE在启动过程中首先检查是否需要media recovery,然后再检查是否需要instance recovery.

三。SCN号与数据库关闭
y;U/g/uj"zc e0如果数据库的正常关闭的话,将会触发一个checkpoint,同时将数据文件的END SCN号设置为相应
/j+_?N_t)aj4j0数据文件的Start SCN号。ITPUB个人空间/M?FMk'tY!} m)_KmO)F

\_@vH8MN#Y0当数据库启动时,发现它们是一致的,则不需要做instance recovery。在数据库正常启动后,ORACLE
!} MD%Y9^"?[A0y]A0会将END SCN号设置为NULL.

如果数据库异常关闭的话,则END SCN号将为NULL.

四。为什么需要System checkpoint SCN号与Datafile Checkpoint SCN号
lr.~M4~0为什么ORACLE会在控制文件中记录System checkpoint SCN号的同时,还需要为每个数据文件记录ITPUB个人空间 l ?9yV ~)]
Datafile Checkpoint SCN号?

原因有二:
e])g7T EP:{a;Eg01.对只读表空间,其数据文件的Datafile Checkpoint SCN、Start SCN和END SCN号均相同。
Qu$CGp3JlCo:Q0这三个SCN在表空间处于只读期间都将被冻结。
m%^1or"d0i&Ix5b02.如果控制文件不是当前的控制文件,则System checkpoint会小于Start SCN或END SCN号。
zz6d^%G a8j C,y1X0记录这些SCN号,可以区分控制文件是否是当前的控制文件。

五。Recovery database using backup controlfileITPUB个人空间"vAt K+m ^
当有一个Start SCN号超过了System Checkpoit SCN号时,则说明控制文件不是当前的控制
-r^r(yf"Jn g5~Y/_0文件,因此在做recovery时需要采用using backup controlfile。这是为什么需要记录SystemITPUB个人空间O F2^'S Ku)wj%J
Checkpoint SCN的原因之一。

这里需要一提的是,当重建控制文件的时候,System Checkpoint SCN为0,Datafile Checkpoint SCN
K5AQ^my,P0的数据来自于Start SCN。根据上述的描述,此时需要采用using backup controlfile做recovery.

(摘者注:重建控制文件分resetlogs和noresetlogs两种,使用resetlogs选项,重建控制文件的System Checkpoint SCN =0 ,Datafile Checkpoint SCN则会从备份数据文件的读取 即:Datafile Checkpoint SCN = Start SCN。 此时System Checkpoint SCN=0 < Start SCN,故恢复时必须加using backup controlfile子句;

使用noresetlogs选项,则必须要有online redo log,因为会从其中读取最后一checkpoint scn, 即System Checkpoint SCN = Datafile Checkpoint SCN =Lastest Checkpoint SCN in online redo log 。此时重建的控制文件在恢复中的作用跟最新的控制文件类似,System Checkpoint SCN>Start SCN ,恢复时不需要加using backup controlfile子句

关于backup controlfile的补充:backup controlfile只有备份时刻的archive log信息,并没有DB crash时刻的archive log信息,所以并不会自动应用online redo log,而是提示找不到序号为Lastest Archive log sequence + 1 的archive log,尽管你可以手动指定online redo log来实现完全恢复,但因为一旦使用了using backup controlfile子句,Oracle就视为不完全恢复,必须open resetlogs! 实际上,假如你有旧的控制文件又不想resetlogs,那很简单,使用旧的控制文件mount然后 backup to trace ,然后手工创建控制文件,使用 reuse database ... noresetlogs .这样就可以 recover database 自动恢复并open database 而不用 resetlogs 了ITPUB个人空间 I ^%hYTh{m J
完)

六。示例ITPUB个人空间],pj1vLI L,C"UR+C
例子背景:
l Gd h:^;t5R0oracle 8iITPUB个人空间 i @D5y(z#fA
windowsITPUB个人空间m^)RDHi8S r
采用rman做热备,在备份期间,做不少事务,同时做alter system checkpoint.

RMAN> run {ITPUB个人空间1w/_Dm#mf @
2> allocate channel c1 type disk;
T:}bv v G} l;O03> backup database filesperset 3 format 'e:/full_%p_%t.bak';ITPUB个人空间r0sJ/L.l[3x
4> }

(这里需要一提的是,在这个备份角本里面我们加了filesperset 3。这样将整个数据库分成ITPUB个人空间)u.r!^1x@vB?Y
两个备份集。这样还原出来的数据文件其checkpoint_change#将不一样。
{:K QiMX0否则由于数据库数据文件不多,都将包含在一个备份集中,这样即使在备份中做insert操作和alter system
G.f_,[-[y di0checkpoint也不会产生不同的checkpoint_change#。因为rman备份是将一个备份集中的文件同时备份的。ITPUB个人空间;Jo&LR/U%F!G!?m
而checkpoint_change#是存放在数据文件头部的,这样备份这些数据文件的头部的时间将是很快的。)

然后ITPUB个人空间"mY&Z;lX;S,@$w W,t
RMAN> run{
7v yg([-s9AL-E2gZo0T02> allocate channel c1 type disk;ITPUB个人空间]h.`)Ca"x#Lm+d-J
3> restore database;ITPUB个人空间 xav`Umy:X
4> }


'dP%k2yw*dW'_0SQL> select checkpoint_change# from v$database;

CHECKPOINT_CHANGE#
$[ly3r8SyY}Y0------------------ITPUB个人空间v Z4x#f0D~0f
2156662354

SQL> select file#,checkpoint_change# from v$datafile;

FILE# CHECKPOINT_CHANGE#
q#vz`G.L0---------- ------------------ITPUB个人空间5aI-OoV#J,^
1 2156662355ITPUB个人空间"fq?;G.w
2 2156662354
:H P:wK1t03 2156662322ITPUB个人空间1u1J Y?Q7M8Jj
4 2156662354
D/zYUD05 2156662354
q d:Mq+O*{N9{C06 2156662354

SQL> select file#,checkpoint_change# from v$datafile_header;

FILE# CHECKPOINT_CHANGE# LAST_CHANGE#
(N7m`Yu_.X'YO0---------- ------------------ -------------
p~(^nO6l3s E'wV01 2156662355
Y@ R:[+A1b ~02 2156662349
Th-^Q3U3\1aVy03 2156662322ITPUB个人空间0y&T"w*OU:u$@:E
4 2156662342ITPUB个人空间#e(^Ho0I8v3W
5 2156662349ITPUB个人空间1@6`hOB)B4S#H)O1?
6 2156662342

从这里可以看出,显然是需要做media recovery的。正常情况下,还需要做instance recovery.
A*K.y6F!K,Ip#T L0当然由于没有在线日志,所以只能做resetlogs。

1.有归档日志存

若有归档日志在,则只需要做一个recover database until cancel;ITPUB个人空间` Y#dwu4Zr
然后即可alter database open resetlogs;

ITPUB个人空间O x/\!V"bsVi:qn
SQL> recover database until cancel (using backup controlfile);
%e-\;N1n$]#u"Ac0ORA-00279: change 2156621770 generated at 10/07/2005 14:30:06 needed for thread 1ITPUB个人空间!\ p N-X$U9@B
ORA-00289: suggestion : D:ORACLE8IRDBMSA


TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

日历

« 2008-12-05  
 123456
78910111213
14151617181920
21222324252627
28293031   

数据统计

  • 访问量: 6960
  • 日志数: 481
  • 图片数: 3
  • 文件数: 1
  • 建立时间: 2008-01-05
  • 更新时间: 2008-11-20

RSS订阅

Open Toolbar