深入了解SCN

2.10. 深入了解SCN 005.gif
2.10.1. SCN的概念
SCN是顺序递增的一个数字,在 中用来标识 的每一次改动,及其先后顺序。SCN的最大值是0xffff.ffffffff。
"qT z Byr02.10.2. SCN的 方式 ITPUB个人空间9j}b KO_&Z O/c7q;O
Oracle对SCN的管理,分为单节点和 RAC两种方式。 ITPUB个人空间;^ x]5s-Zk
单节点的instance中
Bo4A6q6A'o1mu0单节点的instance中,SCN值存在SGA区,由system commit number latch保护。任何进程要得到当前的SCN值,都要先得到这个latch。 ITPUB个人空间f:dR$P-kv-}
RAC/OPS环境中
)u/I!Pt K!d1c8L0Oracle通过排队机制(Enqueue)实现SCN在各并行节点之间的顺序增长。具体有两种方法: ITPUB个人空间 O)cRW+SRj4A
Lamport算法:又称面包房算法,先来先服务算法。跟很多银行采用的排队机制一样。客户到了银行,先领取一个服务号。一旦某个窗口出现空闲,拥有最小服务号的客户就可以去空闲窗口办理业务。
0l+U"?9Sl#p3h0Commit广播算法:一有commit完成,最新的SCN就广播到所有节点中。 ITPUB个人空间E|;P$E3Pe hG
上述两种算法可以通过调整初始化参数max_commit_propagation_delay来切换。在多数系统 (除了Compaq Tur64 Unix)中,该参数的默认值都是700厘秒(centisecond),采用Lamport算法。如果该值小于100厘秒,Oracle就采用广播算法,并且记录在alert.log文件中。 ITPUB个人空间i5h5Y8w#f6r0R0`"p5V3~
2.10.3. 几种重要的SCN ITPUB个人空间1L-o]D+U*e
Commit SCN ITPUB个人空间~7ogzj%]
当用户提交commit命令后,系统将当前scn赋给该transaction。这些信息都反映在redo buffer中,并马上更新到redo log 文件里。
u0P/~CL#K-m0y0Offline SCN ITPUB个人空间5N"JFCd\
除了System tablespace以外的任何表 空间,当我们执行SQL>alter tablespace … offline normal命令时,就会触发一个checkpoint,将内存中的dirty buffer写入磁盘文件中。Checkpoint完成后,数据文件头会更新checkpoint scn和offline normal scn值。其中数据库文件头的checkpoint scn值可通过查询列x$kccfe.fecps得到。 ITPUB个人空间J$|r.w2z3L
如果执行SQL>alter tablespace …offline命令时采用 temporary或 immediate选项,而不用normal选项时,offline normal scn会被设成0。这样当数据库重启后通过resetlog方式打开时,该表空间就无法再改回在线状态。
2~saq%sC0Checkpoint SCN ITPUB个人空间8V)xdbq8f*^
当数据库内存的脏数据块(dirty blocks)写到各数据文件中时,就发生一次checkpoint。数据库的当前checkpoint scn值存在x$kccdi.discn中。Checkpoint scn在数据库 恢复中起着至关重要的作用。无论你用何种办法恢复数据库,只有当各个数据库文件的checkpoint scn都相同时,数据库才能打开。
Rg ~ic5]O+q0虽然参数“_allow_resetlogs_corruption”可以在checkpoint scn不一致时强制打开数据库,但是这样的数据库在open后必须马上作全库的export,然后重建数据库并import数据。 ITPUB个人空间@.y ]!G w6?
Resetlog SCN ITPUB个人空间D%Z:O jT1IYO'E`[ u
数据库不完全恢复时,在指定时间点后的scn都无法再应用到数据库中。Resetlog时的scn就被设成当前数据库scn,redo log也会被重新设置。 ITPUB个人空间$W;txu9V
Stop SCN ITPUB个人空间D\e/wUA k J
Stop scn记录在数据文件头上。当数据库处在打开状态时,stop scn被设成最大值0xffff.ffffffff。在数据库正常关闭过程中,stop scn被设置成当前系统的最大scn值。在数据库打开过程中,Oracle会比较各文件的stop scn和checkpoint scn,如果值不一致,表明数据库先前没有正常关闭,需要做恢复。 ITPUB个人空间!_-Frk1q2Ctu
High and Low SCN ITPUB个人空间%psx.\;_4pS
Oracle的Redo log会顺序纪录数据库的各个变化。一组redo log文件写满后,会自动切换到下一组redo log文件。则上一组redo log的high scn就是下一组redo log的low scn。 ITPUB个人空间tEuK2h R u s!M
在视图v$log_history中,sequence#代表redo log的序列号,first_change#表示当前redo log的low scn,列next_change#表示当前redo log的high scn。 ITPUB个人空间^2lY:X"[\d
SQL> col recid format 9999
}(y,Q5gk`;e0SQL> col requence# format 9999 ITPUB个人空间I G%?bC5|n8q$mG
SQL> col first_change# format 9,999,999,999,999 ITPUB个人空间P}zY\C8{6u J-]
SQL> col next_change# format 9,999,999,999,999 ITPUB个人空间 s XHS a5gZ)I;o3W/n
SQL> select recid,sequence#,first_change#,next_change# from v$log_history where rownum<6; ITPUB个人空间1}M,_-|FWDE
RECID SEQUENCE# FIRST_CHANGE# NEXT_CHANGE# ITPUB个人空间 ^ ]-\$[s'm.nR7u'RL{f
----- ---------- ------------------ ------------------ ITPUB个人空间(x&z*P8h$a(Jk*OI
484 484 1,928,645,840,091 1,928,645,840,436
pR$c`aC*Aj9Y0485 485 1,928,645,840,436 1,928,645,840,636
D9S1]D6@ h3gq0486 486 1,928,645,840,636 1,928,778,045,209
t$_T(_ u.?3Q+sy#G `0487 487 1,928,778,045,209 1,929,255,480,725
A:h7n2}-]$f2JFT4O0488 488 1,929,255,480,725 1,930,752,214,033
)gD.T\[/k})s1B02.10.4. SCN号与oracle数据库恢复的关系 ITPUB个人空间;aLKY*V-SKT
SCN号与oracle数据库恢复过程有着密切的关系,只有很好地理解了这层关系,才能深刻地理解恢复的原理,从而才能很好地解决这方面的问题。
kg ZX(R4c W)` m0SCN与CHECKPOINT
;u(laZwY7E0CKPT进程在checkpoint发生时,将当时的SCN号写入数据文件头和控制文件,同时通知DBWR进程将数据块写到数据文件。 ITPUB个人空间)j-|M+SGe?:J*a
CKPT进程也会在控制文件中记录RBA(redo block address),以标志Recovery需要从日志中哪个地方开始。与checkpoint相关的SCN号有四个,其中三个存在控制文件中,一个存放在数据文件头中。 ITPUB个人空间g2Cp+s1_+W E)l
这四个分别是: ITPUB个人空间R1A]}8m1Kel ?
1.System Checkpoint SCN
(C]!p;_ndU IuP Y0当checkpoint完成后,ORACLE将System Checkpoint SCN号存放在控制文件中。我们可以通过下面 语句查询:
,K%sR B-G/w3V/z|0select checkpoint_change# from v$database; ITPUB个人空间CG jTNgsH&]!k B"A
2.Datafile Checkpoint SCN ITPUB个人空间)CUTP3U
ITPUB个人空间~%s x#q }4y i7`/b)b
当checkpoint完成后,ORACLE将Datafile Checkpoint SCN号存放在控制文件中。我们可以通过下面SQL语句查询所有数据文件的Datafile Checkpoinnt SCN号。
0e"[$I"a}.GYA0select name,checkpoint_change# from v$datafile; ITPUB个人空间D&f;BT r#],Y
3.Start SCN号
G S;Ub6l0ORACLE将Start SCN号存放在数据文件头中。
`G"|I M5S3f IZ0这个SCN用于检查数据库启动过程是否需要做media recovery.
1` AJ6Y5A0我们可以通过以下SQL语句查询: ITPUB个人空间.h7FI9[ncB:j
select name,checkpoint_change# from v$datafile_header; ITPUB个人空间1Nc Sj g\
4.End SCN号
hh r&u#XJs0ORACLE将End SCN号存放在控制文件中。 ITPUB个人空间 |,J S?I V;`h U+fL
这个SCN号用于检查数据库启动过程是否需要做instance recovery. ITPUB个人空间'\r$q/? z7_ Tl}
我们可以通过以下SQL语句查询: ITPUB个人空间'lhOK$`B.e9j
select name,last_change# from v$datafile; ITPUB个人空间+Q Ry!BM6y
在数据库正常运行的情况下,对可读写的,online的数据文件,该SCN号为NULL. ITPUB个人空间#v UTs"N+aj?
我们作个小的试验,内容如下: ITPUB个人空间3l$E]3j-A#JZ
在执行检查点进程之前SCN号如下:
@Zj/C1~dff0System Checkpoint SCN 4609061
lYPH*s$~e0--select checkpoint_change# from v$database;
^Q*I&ztGlQ s-?0Datafile Checkpoint SCN 4609061
$b[&K~L0--select name,checkpoint_change# from v$datafile;
JU/b$o]o-[Qd9lt0Start SCN 4609061 ITPUB个人空间9A+H3Vp*Cb!v;A
--select name,checkpoint_change# from v$datafile_header; ITPUB个人空间p1VvC3Az'c/d1mq
End SCN 空 ITPUB个人空间0rH8wRm#U
--select name,last_change# from v$datafile; ITPUB个人空间,B0J6@brR,BJ,bg
执行alter system checkpoint。后的SCN号如下:
4M ]&N8m4V.}[0System Checkpoint SCN 4609630
(x)Dg\"_1xI2f e0--select checkpoint_change# from v$database; ITPUB个人空间e@*K)u2M
Datafile Checkpoint SCN 4609630
[W xY}*AC%u0--select name,checkpoint_change# from v$datafile; ITPUB个人空间 VW0GeQC`!ON
Start SCN 4609630
0y9_ ^1]u5q-O(bu0--select name,checkpoint_change# from v$datafile_header; ITPUB个人空间i_yna%c%g._c0Sr
End SC 空
]FBu^*F'gy0--select name,last_change# from v$datafile;
2U"K+mi0u.U0@|^0SCN不连续原因可能如下: ITPUB个人空间nhm x"\J
1.当发生日志组切换的时候
0B;O0aW3[5s_02.当符合LOG_CHECKPOINT_TIMEOUT,LOG_CHECKPOINT_INTERVAL,fast_start_io_target,fast_start_mttr_target参数设置的时候
c*?;Yr6c03.当运行ALTER SYSTEM SWITCH LOGFILE的时候 ITPUB个人空间)T{P]/S
4.当运行ALTER SYSTEM CHECKPOINT的时候
2SQ1d lF [bEV05.当运行alter tablespace XXX begin backup,end backup的时候
O&Vm%U4F!k*pS)vb06.当运行alter tablespace ,datafile offline的时候;
.|9g#JLSb02.10.4.1. SCN号与数据库启动
5a$dacDc+}%S0在数据库启动过程中,当System Checkpoint SCN、Datafile Checkpoint SCN和Start SCN号都相同时,数据库可以正常启动,不需要做media recovery.三者当中有一个不同时,则需要做media recovery。如果在启动的过程中,End SCN号为NULL,则需要做instance recovery。ORACLE在启动过程中首先检查是否需要media recovery,然后再检查是否需要instance recovery。
Q4jR:a,n _,]02.10.4.2. SCN号与数据库关闭 ITPUB个人空间x#e1c|4w ^
如果数据库的正常关闭的话,将会触发一个checkpoint,同时将数据文件的END SCN号设置为相应数据文件的Start SCN号。 ITPUB个人空间tt E%p5[,]8Pg
当数据库启动时,发现它们是一致的,则不需要做instance recovery。在数据库正常启动后,ORACLE会将END SCN号设置为NULL。如果数据库异常关闭的话,则END SCN号将为NULL. ITPUB个人空间c2?x"bs!z
2.10.4.3. 为什么需要System checkpoint SCN号与Datafile Checkpoint SCN号 ITPUB个人空间X,k ^1m_Q'G$[ g Z
为什么ORACLE会在控制文件中记录System checkpoint SCN号的同时,还需要为每个数据文件记录 ITPUB个人空间*OF(T c.w
Datafile Checkpoint SCN号? ITPUB个人空间(Y7_ ?!rx)Y,h%C;`
原因有二:
nRV8}-d/a01.对只读表空间,其数据文件的Datafile Checkpoint SCN、Start SCN和END SCN号均相同。 ITPUB个人空间!y/S2fK'OE
这三个SCN在表空间处于只读期间都将被冻结。
1jah6n/t h3x X M6V02.如果控制文件不是当前的控制文件,则System checkpoint会小于Start SCN或END SCN号。记录这些SCN号,可以区分控制文件是否是当前的控制文件。 ITPUB个人空间`?(QQb9j/M R C8gb
2.10.4.4. Recovery databaseusing backup controlfile ITPUB个人空间.E7U#yj3\1m
当有一个Start SCN号超过了System Checkpoit SCN号时,则说明控制文件不是当前的控制文件,因此在做recovery时需要采用using backup controlfile。这是为什么需要记录SystemCheckpoint SCN的原因之一。
c,e ~I6_0这里需要一提的是,当重建控制文件的时候,System Checkpoint SCN为0,Datafile Checkpoint SCN的数据来自于Start SCN。根据上述的描述,此时需要采用using backup controlfile做recovery。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/14465197/viewspace-429505/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/14465197/viewspace-429505/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值