没有必胜的秘籍,没有方程式遵循~~ 要赢~~只有全身心的投入!

晶晶实验六自己动手构造CR块

上一篇 / 下一篇  2008-02-20 16:01:23 / 个人分类:晶晶oracle实验系列

查看( 1800 ) / 评论( 36 )
一、查询魔术ITPUB个人空间D[{0i1T1|$A;l t
步1:在会话17中发布如下声明:ITPUB个人空间 Qx)E4t,Ey C
17> var x refcursorITPUB个人空间J0R5rL8XGO
17> exec open :x for select substr(c,1,5),id from t8;ITPUB个人空间%skW&Z0hU ~
PL/SQL 过程已成功完成。
9L:r!vn1wqB0 步2:在会话13删除T8的所有记录且提交:
P O'`e~6WfLC5N*i%l0 13> delete t8 ;ITPUB个人空间2{^9Rf"rmh/H$N
已删除 10 行。
t8a,a+QU"t&vq0 13> commit;ITPUB个人空间ar AZ"Qx
提交完成。ITPUB个人空间/X te2{b
步3:在会话17中输出游标X的所有行:
|1pV+Y|J-u0 17> print xITPUB个人空间`q1~ k3]? c o.L
SUBSTR(C,1         IDITPUB个人空间ck:u&dtU
---------- ----------ITPUB个人空间H@C&VIq b"n
g                   7ITPUB个人空间J4x+ZRU)u.~/K
h                   8ITPUB个人空间+L&^o?x:O0{'~ h7IC+E
i                   9
%K%j]A m}0[ y0 J                  10ITPUB个人空间G'U4sho0qF
AA                  1
!\u$N4vf1G~nI0 B                   2ITPUB个人空间i_0BbG:]
C                   3
6y`;d{4Z1s(t1N8J0 D                   4ITPUB个人空间lm'kQtJy[[
E                   5ITPUB个人空间6[Y)Z#mHKo J
f                   6
3B!fZ9[d0B0 已选择10行。ITPUB个人空间ji?r-R
我们在会话13中已删除且已提交,但在会话17中还是显示出了T8中的所有行,这是为什么呢?
Y q S9^d)Y0W0 1) 在步1打开游标,但此时并没有执行、执取,在会话17的PGA中,将会开辟一块内存存贮此游标。在游标的相关信息中,有一条就是游标打开是的SCN,假若此ITPUB个人空间u2b}I i

qp'Z)N^6n0 时的SCN是1000。
gMq k!H;Y.K0 2) 在步2中对表T8进行了操作,并提交。Oracle每个数据块的头部,都记有此块当前的SCN值,此SCN值随着对块的更新而变化。假如,我们在步2更新T8表时,
4E1IjP#hR-M!E0 ITPUB个人空间:R"u`+t:j2z$@3i
SCN是1200,这个值将被记入块头部的SCN值。
&q7a*]n%nl"X;B:{D1a0 3) 在步3我们发布Print x声明,此声明将完成执行、抓取等步骤。在从T8表的相关块中抓取行时,Oracle会将打开游标时的SCN和块本身的SCN相比较,如果发现ITPUB个人空间)i8it)Ax#t-XI
ITPUB个人空间w6u S1W#X&zw D
后者大于前者,证明打开游标是在更新表之前进行的,Oracle将会在回滚段中寻找小于游标SCN的信息,构造一个在打开游标之前的块,这就是CR块了。如果回滚ITPUB个人空间S/T+BSgu UA:E

G;_:Vf A9CV+?"DG0 段中的T8表的信息已经被覆盖,将会报告一个ORA-01555 快照太老错误。ITPUB个人空间 ^7Z(qc#nc?G
        执行时间过长的查询,有时也会报出这个错误。
|CW.]%oF0R-O5LJu0 二、SCNITPUB个人空间` X;Qzi!r3ru-Bo1y,g
        SCN就是Oracle内部的一个记时机值,也就是Oracle的内部时钟。在9i之后,我们可以通过如下的方式获得当前的SCN号:ITPUB个人空间BEA-|2qQ
scott@MYTWO>
!`(W!X+}A'X0 select scn,to_char(scn,’xxxxxxx’) from (select dbms_flashback.get_system_change_number SCN from dual);
`?{!V]cr0    SCN   
? mo6mlD0hV0 ----------ITPUB个人空间 [6c^ }5] pd6I}
8727805ITPUB个人空间%a)?g[!P Q-}
在几乎所有的地方,你都能见到SCN。在事务表、回滚块中的回滚记录、数据块、日志文件等等,我们上面曾提到过,在游标中,记录的也有游标打开时的SCN。ITPUB个人空间SP j w v
(在eygle的深入浅出oracle中有关SCN号更详细的介绍,18页)ITPUB个人空间Z%YZ-{t
三、构造CR块ITPUB个人空间h#? S _ ^t
Oracle会在三种情况下去读回滚段构造CR块:
`2B_t8w`c$^/i0 1.  只要数据块上有锁,Oracle将会构造CR块。ITPUB个人空间kR&m0bR}/Hc
2.  游标的SCN小于块的SCN,证明块在游标打开之后又被修改过了,这就要去构造CR块。ITPUB个人空间]R.Q:sx#KjC
3.  闪回查询中,要求的SCN小于块的SCN,也要去构造CR块。ITPUB个人空间s8H w"V|gT.k

6@9PbN P7?eb9t0 构造CR块
rZ1Ru)m+{ @#Y0 步1:先观察表T8的行分布情况:
?zIMRa#k$`0 ROWID                  BLOCK# C                  IDITPUB个人空间!d^7^p\!~?G
------------------ ---------- ---------- ----------ITPUB个人空间2o$v$^K$y#^L
AAAB3LAAFAAAf/mAAA     131046 a                   1ITPUB个人空间,r;^ q5~*o-DV
AAAB3LAAFAAAf/mAAB     131046 b                   2ITPUB个人空间a.rqp&|%^&O
AAAB3LAAFAAAf/mAAC     131046 c                   3ITPUB个人空间rt9DZn:l4_ L^^
AAAB3LAAFAAAf/nAAA     131047 d                   4ITPUB个人空间2A"b A'\*D
AAAB3LAAFAAAf/nAAB     131047 e                   5ITPUB个人空间6q{e*IOM
AAAB3LAAFAAAf/nAAC     131047 f                   6
h:S^.Z FR"~Y0 AAAB3LAAFAAAf/oAAA     131048 g                   7ITPUB个人空间T"o_C+{"RjJ
AAAB3LAAFAAAf/oAAB     131048 h                   8ITPUB个人空间 f8hU ijoag}.k
AAAB3LAAFAAAf/oAAC     131048 i                   9ITPUB个人空间7b!pP7eQ{
AAAB3LAAFAAAf/pAAA     131049 j                  10ITPUB个人空间Cw2vm'N3puh
步2:发布更新命令ITPUB个人空间6c f!z'V {kL
13> update t8 set c=upper(c) where id<=2;ITPUB个人空间9lnG bEi)S
已更新2行。
bFR:f+rs0 13> commit;
+LeJzR^ L(J7H0 提交完成。ITPUB个人空间JH AS(L
13> update t8 set c='A1' where id<=1;
GO&@D|;E'{;k;|&q6G0 已更新 1 行。
A yQ}/~,H&i \0 13> update t8 set c='A2' where id<=2;ITPUB个人空间 |Z p8|{-Yj CY
已更新2行。
+HU!K4k)i,e0 13> update t8 set c='B2' where id<=2;ITPUB个人空间1Wll#T{` E:C s
已更新2行。
a xJ1iDp'q e0 13> commit;ITPUB个人空间l)VWtrW T{hZ
提交完成。ITPUB个人空间h)u R,I&L%\0az
换到其他会话,
Jw m+uZ7?cnE _0 17> update t8 set c='aa1' where id<=1;
ps-B5]s3M4~0 已更新 1 行。ITPUB个人空间f%_7~?_
17> update t8 set c='bb2' where id=2;
q?i2d j(? ]0 已更新 1 行。ITPUB个人空间 Q'x#M2]8P$\ {'O_
17> commit;ITPUB个人空间p,n? ],on
提交完成。
4wp7J:s:T;c/P3]zWk#g0 17> update t8 set c='aaa1' where id<=1;
"N)iyz3Si%Ya`&G0 已更新 1 行。ITPUB个人空间 f-UN Yrp"ai
17> update t8 set c='bbb2' where id=2;ITPUB个人空间&n[!rF$U6pxj9Co^
已更新 1 行。
s9Y Q5v2p@*h0 17> update t8 set c='aaaa1' where id<=1;ITPUB个人空间\JZa E Mz
已更新 1 行。ITPUB个人空间J*Li%~.],n^0x;t[%v
17> update t8 set c='bbbb2' where id=2;
u} u+g%p4T0 已更新 1 行。ITPUB个人空间E4_8YgX vwt
17> commit;
t ]ZE?2^(X0 提交完成。
,KH} Uqm4~0 再换个会话:ITPUB个人空间*ILU4v%R? G5c(W3a
10> update t8 set c='aaaaa10' where id=1;ITPUB个人空间t~g;JM6dI
已更新 1 行。
eBK(Q/K0 10> update t8 set c='bbbbb10' where id=2;
1V"j'E-GTpc*}L0 已更新 1 行。
5a"bWZ|#OcHV0 10> commit;
@z{nPe1{H0 提交完成。ITPUB个人空间2~Sa y-uuP
10> update t8 set c='az' where id=1;
$S"E^Q~-h V0 已更新 1 行。
-tH{J"{`0 10> update t8 set c='by' where id=2;ITPUB个人空间 \)Oh-K.g Xy
已更新 1 行。ITPUB个人空间{-W$oJ \jS^9gq
此时的SCN是
#wB.|NdP6d3X0 18> select dbms_flashback.get_system_change_number SCN from dual;ITPUB个人空间W;o/v8s H:a_L
   SCN
]:aT&}5WG K? Z,j0 ----------
5?+q?`vD8e9V0 8729612
5}Oz*PEdv P(x0 总结一下ITPUB个人空间J*uX(u#v0c c-A&`Q?U"p
行1的变化a->A->A1 A2 B2->aa1->aaa1  aaaa1->aaaaa10->az
lHKwH0 行2的变化b->B->B2       ->bb2->bbb2  bbbb2->bbbbb10->byITPUB个人空间Y xa6Esn
下面开始构造CR块,首先说一下末提交时CR块的构造:
E'Oi7? M0 步3:末提交时CR块的构造:ITPUB个人空间,a:c*h7I0i[Vh;J
接着上面的修改,如果我们在会话16发布查询T8表的声明:ITPUB个人空间9rv*B:Gd&L@
16> select * from t8 where id<=3;ITPUB个人空间4b5JW n^ A!?
由于最后一次修改没有提交,假如此时有其他会话访问行1或行2,就回发生回滚操作,从而构造一个CR块。让我们自己来回滚一下,感受一下Oracle的回滚操作
-q\Yos5c0o"z _p0
;QV.d0UrII0 到底做了什么:ITPUB个人空间Y*Pj^$e-rN
首先DUMP块131046:ITPUB个人空间_1hq;yj
alter system dump datafile 5 block 131046;
y#t.Xw]OZ0 在事务的头部,有一块这样的结构:
qtjv/X%w!X |Gx/q0 Itl           Xid                  Uba         Flag  Lck        Scn/FscITPUB个人空间u }-cmD1EP)uu$B
0x01   0x0018.008.0000001a  0x03800073.000e.02  ----    2  fsc 0x0000.00000000
*@d u)B*YI)FR0 0x02   0x0019.007.00000020  0x03800053.0037.01  C---    0  scn 0x0000.008533f6
{cfx`^0 它被叫做ITL,Interested Transaction List,相关事务列表。此表中每一行,按Oracle惯用的说法,又叫一个槽,SLOT。当有事务修改此块中的数据时,或者
9Z$R$@:v:X3I-v0 ITPUB个人空间.tv:xfs'w&z+B
说此块中有事务发生时,就在ITL中占用一个槽。下面我们了解一下ITL中的信息。
*_m ]O!mvB5Uu0 第一列,ITL编号,共有两个,分别是0x01,0x02,随着此块中事务的增多,槽数量也会增多。ITPUB个人空间G6};v'a @8My0@
第二列,Xid,事务Xid编号,Xid共分三段,我们在上文中已经讲过,回滚段编号.槽号.序列号。我们来看0x01事务,它占用24号回滚段的第8个槽,此槽的序列
G|L@2|/In"v0
:|#jA9?|0 号是26,即24.8.26。ITPUB个人空间Y%NF"P\ G
第三列,UBA,回滚块地址。也分三段,分别是回滚块地址,回滚块序列号,回滚链末记录号(即irb信息)。此处0x01事务占用14号文件,115号回滚块,块序列
5}*g@$m1N%MA hC]&F0
uM}{8b\'L3M0 号是14,回滚链的末记录在115的第2条记录处。
4W;f6_k*@%j3}In0 第四列,Flag,标志,共有四位,四位都是“----”,事务末提交,第一位是C,“C---”,事务已提交。ITPUB个人空间!NC~8DRs,X
第五列,Lck,事务所修改的行的数量。这些行,都算是被事务锁住的行。ITPUB个人空间4W\Ew8s
第六列,SCN/Fsc,是事务的SCN信息。0x01事务尚末提交,故此列为0。
-Lo"s;Dl0 通过上面ITL,我们可以了解到,此块中有一个末提交的事务,那么此事务影响了几行呢,或者说此事务修改了几行呢?在下面行信息中,有:
D^}o&GS2A0 tab 0, row 0, @0xba7ITPUB个人空间1d?"k'zk
tl: 1009 fb: --H-FL-- lb: 0x1  cc: 2
\ d${UP1k0 col  0: [1000]ITPUB个人空间7B%uY,G"Q ^ Rh
61 7a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
$Y^P9Qjk]5b0 这其中的lb: 0x1,就是指此行对应事务0x01,或说此行是事务0x01修改的行,或说事务0x01锁住了此行。它现在的值是61 7a,正是“az”。
gmepLql6L0         如果在其他会话上发布查询,Oracle首先检查ITL,一但发现某块上尚有末提交的事务,根据其UBA,马上开始构造其CR块,而不管会话所检索的行,是
5EMC`,ECT:n0
9yxYW%Te0 否是事务相关的。
CB4s;x,l.{Mn0         块131046上有末提交事务:ITPUB个人空间)FcAuIR&[$L
0x01   0x0018.008.0000001a  0x03800073.000e.02  ----    2  fsc 0x0000.00000000
5j$zo(j)PR0 其UBA是0x03800073.000e.02,即14号文件,115块,序列号14,第2条回滚记录。下面DUMP115块:
u Sgx|*w-M&x+yY0 alter system dump datafile 14 block 115;
U i!W4}@7c,v:t,^wH0 在DUMP文件中找到根据irb: 0x2,找到115块中第2条回滚记录,它对应131046第1行,前映像值为 62 62 62 62 62 31 30 ,即“bbbbb10”。再根据其rci:0x01ITPUB个人空间CX$je)x"c

B,a-e6f2pkK&|0 ,向上找到第一条回滚记录,它对应131046第0行,前映像值为 61 61 61 61 61 31 30,即“aaaaa10”。
~hmSKJ8~0pOK E0 131046块中当前值是:
(?3` q4`9]u n0 Slot 0(行1):61 7a         (“az”)          相关末提交事务0x1ITPUB个人空间$UFf!I+F Z&O's;Xkz
Slot 1(行2):62 79         (“by”)         相关末提交事务0x1
q2E W'GZ0 Slot 2(行3):63          (“c”)                 无相关事务
a:V},w%Y L2J0 通过读事务0x1的回滚块,将前映像信息写进131046,替换事务0x1对应的行,在内存中生成一个新的块:ITPUB个人空间T? iX5Q1S(Pp
Slot 0(行1):61 61 61 61 61 31 30         (“aaaaa10”)         相关末提交事务0x1ITPUB个人空间c!a^:xdh H
Slot 1(行2):62 62 62 62 62 31 30         (“bbbbb10”)        相关末提交事务0x1ITPUB个人空间'h?Ly#NS k~_
Slot 2(行3):63                                  (“c”)                        无相关事务ITPUB个人空间a&^]6u*v3zf$}7E8D
这个新生成的块,块的编号仍是131046,在内存中,它的HASH位置会和原来的131046处于同一HASH Cache Buffer Chain。它就是131046的CR块。CR块的构造到现ITPUB个人空间4J)G1\l ]

3z1Y\4F{l['@0 在还没有完成,我们用前像映像行值替换了当前的行值,我们最后一步所做的更新并仅仅修改了行的值,上面我们讲到,每个块头有一个ITL,它初始有两个槽,
'y;V9{ },Ht7IkQx0
'Jb2e;^ v.dFi0 每个末提交的事务,将占用一个槽,可以随事务增多而扩充。如果事务已提交,它占用的槽会被下一个事务覆盖。因此,我们最后在会话10中做的更新,将覆盖
%N7r#Bpe L2ye0
h y3f6c~tK0 131046的一个已提事务的ITL槽,这个被覆盖的ITL槽被记进事务回滚链头部块中,如下所示:
+s*G%Nr y;L0 op: L  itl: xid:  0x001a.010.00000011 uba: 0x03800085.000e.01
2X9b6Yu4Qx8S+\t`0                       flg: C---    lkc:  0     scn: 0x0000.00853185ITPUB个人空间w"P'a2l&c&l/guyM
我们应该用它替换131046中当前的0x01槽:
t5v4OW,T0 Itl           Xid                  Uba         Flag  Lck        Scn/FscITPUB个人空间u'^Dn-C
0x01   0x0018.008.0000001a  0x03800073.000e.02  ----    2  fsc 0x0000.00000000
"{&I$p`:F)g0 0x02   0x0019.007.00000020  0x03800053.0037.01  C---    0  scn 0x0000.008533f6ITPUB个人空间2e-S&Q9^3DdiNy8@
替换为:
"AoL q!~0G\9G0 Itl           Xid                  Uba         Flag  Lck        Scn/FscITPUB个人空间 y4iD4zQ;{/~
0x01   0x001a.010.00000011  0x03800085.000e.01  C---    0  fsc 0x0000.00853185ITPUB个人空间v'RA|[G l1UkI
0x02   0x0019.007.00000020  0x03800053.0037.01  C---    0  scn 0x0000.008533f6ITPUB个人空间r?L6Zh`#b
好了,到现在,我们终于构造了一个131046的CR块:ITPUB个人空间v Hvb$g*h7N
Itl           Xid                  Uba         Flag  Lck        Scn/FscITPUB个人空间e9_Yv]:L
0x01   0x001a.010.00000011  0x03800085.000e.01  C---    0  fsc 0x0000.00853185
\7n*Ao vH5u%U*pR0 0x02   0x0019.007.00000020  0x03800053.0037.01  C---    0  scn 0x0000.008533f6ITPUB个人空间GaHYEau8XV

:F[j6Ym*Ao$q#J0 Slot 0(行1):61 61 61 61 61 31 30         (“aaaaa10”)         相关末提交事务0x1
T'A/@ W,Ur!|#p0 Slot 1(行2):62 62 62 62 62 31 30         (“bbbbb10”)        相关末提交事务0x1ITPUB个人空间-Z*k'l#s6x ?
Slot 2(行3):63                                  (“c”)                        无相关事务
3N&Mu"n$[#p [0 现在,131046的CR块中的ITL中,所有事务都已提交,我们的回滚是否可以到此为止呢?ITPUB个人空间,tX&yS6p!A.J
还不行,Oracle还要对比一下查询游标打开时的SCN,如果大于上面CR块中ITL的最大提交SCN:8533f6,证明查询发生在事务结束之后,查询时的SCN大致是:
0M~Q%\5U`GV0 18> select scn,to_char(scn,'xxxxxxxxxx') from (select dbms_flashback.get_system_change_number SCN from dual);ITPUB个人空间x+zC5di'As)hk
SCN                 TO_CHAR(SCN
V/sL#kd0 ----------                 -----------
cJZ/VW5gr0 8734649      8547b9
)d[Y1Zj'K,i1k0 后于CR块ITL中最大提交SCN,好,到此为止,回滚结束。ITPUB个人空间} Ugd |Y5yn:}:a
如果游标的SCN前于ITL中最大提交SCN,Oracle仍要继续回滚。
w)@&h0g7bV k&S+Y0 步4:闪回查询时CR块的构造:ITPUB个人空间~_'zI&LF,~ ^6S0^
假如用户发布如下声明:
L-ish:hZ Cja}0 select substr(c,1,5),id from t8 as of scn 8728960 where id<=3;ITPUB个人空间k!p L D%So3v Y
此声明指定读取SCN为8728960时块中的行。这就是闪回查询。
XK G/^6n DN0 查询要求SCN:853180,前于步3时构造的CR块,因此,需要继续向前回滚。仍然根据ITL中的UBA信息,取出前映像,来构造另一个CR块。问题时,ITL有两个槽,ITPUB个人空间@o)M4S1\zz

6lYgr5F@0 我们该从哪个机槽的UBA回滚呢。最好的方法是从SCN最大的哪个。此处是槽0x02:
8jX6s$ctM7EU O0 Itl           Xid                  Uba         Flag  Lck        Scn/FscITPUB个人空间G3j8_|}P
0x02   0x0019.007.00000020  0x03800053.0037.01  C---    0  scn 0x0000.008533f6ITPUB个人空间*v%Wl&_^.u Z
UBA中显示,此事务的回滚链尾块在14号文件,83号块,中第1条记录,回滚块序列号是55。
/v P"U&O$Y9U0 alter system dump datafile 14 block 83;
~#E0B@*m-o8n0 打开DUMP文件,首先要检查一下,此回滚块是否已被别的事务覆盖,检查方法,非常简单,看此UnDo块的Seq值:
n B-JRI4k5U0 UNDO BLK:  
Bbj's W:I"p2Fj0 xid: 0x0019.008.00000021  seq: 0x37  cnt: 0x11  irb: 0x11  icl: 0x0   flg: 0x0000
F-d]O'L n9M%At lK0 仍是0x37,和UBA中所记的一样,证明此回滚块还末被覆盖。取出前映像,对应5号文件131046块的Slot 1(行2)的第0列: 62 62 62 62 32,即“bbbb2”。继ITPUB个人空间6eg eK]n M

5\s2e Sh7P7rj"dh0 续沿回滚链向上,根据rdba: 0x03800052,回滚链上一块在82块中,继续DUMP:
Udnl%C(aQ0 alter system dump datafile 14 block 82;
r,K s2a oPI.@T0 打开DUMP文件,检查块的Seq值,仍是37。取出前映像,对应5号文件131046块的Slot 0(行1)0列,值为:61 61 61 61 31,即“aaaa1”。ITPUB个人空间[:i6CK.Y6\,H
此回滚记录已是回滚链头,被覆盖的ITL槽是:ITPUB个人空间\3xXH"`@i9I6A*K
op: L  itl: xid:  0x0018.005.0000001a uba: 0x03800072.000e.08
BeN9m{"z#By4z!{Y0                       flg: C---    lkc:  0     scn: 0x0000.00853171ITPUB个人空间\0^`:i yN
构造一个新的CR块:
;k fez*bBf/t$Y%C0 Itl           Xid                  Uba         Flag  Lck        Scn/FscITPUB个人空间9D2?2UWAr*P#Tt kP
0x01   0x001a.010.00000011  0x03800085.000e.01  C---    0  fsc 0x0000.00853185
^Ba;d-sj%Lb1j0 0x02   0x0018.005.0000001a  0x03800072.000e.08  C---    0  scn 0x0000.00853171
2J-kF/_R `]H0 0x02   0x0019.007.00000020  0x03800053.0037.01  C---    0  scn 0x0000.008533f6ITPUB个人空间7f,U&v8H_W2G

m V `${ k2j0 Slot 0(行1):61 61 61 61 61 31 30         (“aaaaa10”)         相关末提交事务0x1ITPUB个人空间,CI.Fbq4G
Slot 1(行2):62 62 62 62 62 31 30         (“bbbbb10”)        相关末提交事务0x1    --红色字体为应该覆盖的信息ITPUB个人空间8Yu%y$]%rh {
Slot 0(行1):61 61 61 61 31         (“aaaa1”)         
n6r/i OV8SPc9a1M0 Slot 1(行2):62 62 62 62 32         (“bbbb2”)        ITPUB个人空间gz3U2e E[
Slot 2(行3):63                                  (“c”)                        ITPUB个人空间(u3j(qZex2P ^/O+z
如果你发布如下声明:ITPUB个人空间NH'b5ka%[o
select substr(c,1,5),id from t8 as of scn 8728960 where id<=3;ITPUB个人空间:@5eZR\"Ft
这将会先构造步3时的CR块,再构造此步中的CR块,这两个CR块都是131046的CR块,因此,步4时的CR块会覆盖步3时的CR块。也就是说,在一次查询中,Oracle对ITPUB个人空间R3@KY8D7g1F8?
ITPUB个人空间&}l7j2U'GM
应一个数据块,只会在内存创建一个CR块。
M N sq7~9k!J2oY0 好了,我们的查询到此可以为止了吗,对比SCN,查询SCN:853180,ITL中最大SCN:853185。ITL中最大SCN仍后于查询SCN。继续回滚:ITPUB个人空间w;X o tW'v3W'i0P
步5:继续回滚:ITPUB个人空间_0[&Y]q'G
根据ITL中最大SCN槽的Uba,
EO5Oc JR0 Itl           Xid                  Uba         Flag  Lck        Scn/Fsc
:[^;Iu [Mju0 0x01   0x001a.010.00000011  0x03800085.000e.01  C---    0  fsc 0x0000.00853185
d HY"I.F$?"h0w0 回滚链尾块在14号文件,133回滚块,第1条回滚记录,序列号是14。DUMP133块:
+@6Z"[ E2UW0u0 alter system dump datafile 14 block 133;
&q @"RD9_6]&g M*l0 打开DUMP文件,检查块的Seq值,仍是0xe。取出前映像,对应5号文件131046块的Slot 1(行2)0列,值为:62 62 62 32,即“bbb2”。回滚链上一块在rdba:
#W6hU%r ]u4r\6]-S0 ITPUB个人空间i#~C}6qT
0x03800084,132块中:
y_l*D)DQ z0 alter system dump datafile 14 block 132;ITPUB个人空间8L Q,WMu
找到最后一条回滚记录,它的前映像对应5号文件131046块的Slot 0(行1)0列,值为 61 61 61 31,即“aaa1”,但它并是回滚链头,根据它的Rci  0x02,继
P Yt#^ L\7y$D5l] uT0
:CS.u4h-x`0 续向上,找到0x02条回滚记录, 它对应对应5号文件131046块的Slot 1(行2)0列,62 62 32,即“bb2”,还没完,再向上,是131046块中Slot 0(行1)0列, ITPUB个人空间Fv ^afM(gB\

snHd4_o\U0 61 61 31,即“aa1”,此条回滚记录的Rci已经是0了,已经到了回滚链头,被覆盖的ITL槽是:
Im2R2a^&Ox|0 op: L  itl: xid:  0x0017.003.00000045 uba: 0x03800021.0021.03ITPUB个人空间!jtUW8RW[ M*`,l
                      flg: C---    lkc:  0     scn: 0x0000.008530fd
~N*o't~;X6P6L0 Itl           Xid                  Uba         Flag  Lck        Scn/FscITPUB个人空间:Y+f4G&^0Oj-H
0x01   0x001a.010.00000011  0x03800085.000e.01  C---    0  fsc 0x0000.00853185
v z.vf(R$] rF0
0x01   0x0017.003.00000045  0x03800021.0021.03  C---    0  fsc 0x0000.008530fdITPUB个人空间-_6x;T} j^3Y
0x02   0x0018.005.0000001a  0x03800072.000e.08  C---    0  scn 0x0000.00853171
0O-R4D6@[0

,i&I'rR&ya0 Slot 0(行1):61 61 61 61 31         (“aaaa1”)       ITPUB个人空间a-}Zpx#zs
Slot 1(行2):62 62 62 62 32         (“bbbb2”)
        
:i&k%n lBB0 Slot 0(行1):61 61 31         (“aa1”)         
u f!^r+C%l)@/Les S0 Slot 1(行2):62 62 32         (“bb2”)        
#e&y6jlf F6D}-f\0 Slot 2(行3):63                  (“c”)               
Z}a NP1xH0 查询的SCN是853180,ITL中最大SCN是853171,查询SCN大于ITL中的SCN,说明查询发生在事务后,好了,到此,我们这一次CR块构造完毕。此次生成的131046的
,@7b-mybE.?_%X:G0 ITPUB个人空间 h ~R!y4W1JJ-U
CR块会覆盖步4时生成的,一个块,在一次查询中,只会产生一个CR块。ITPUB个人空间&jybB x.@}&g
根据我们的操作顺序:ITPUB个人空间a {i&nR
a->A->A1 A2 B2->aa1->aaa1  aaaa1->aaaaa10->azITPUB个人空间~(Rj}#[;z
b->B->B2       ->bb2->bbb2  bbbb2->bbbbb10->by
Mph4B6uH0                      ↑ITPUB个人空间 w(\_.M-U&hc
我们已经回到了箭头所指处。我们可以一直向前回塑,直到T8的行被插入131046时,或者,回滚段被覆盖时。假若我们又向前回塑,但回滚块的Seq和我们要求的
.k ~d&x.@Y@0 ITPUB个人空间KQa3] K.UGf3T$^uo
不一样,证明此块被覆盖了,此时Oracle会报告Ora-01555错误。我们只需让回滚段的区足够多,这样它每次绕回的时间必然加长。这样,回滚段必然可更长时间
F(ZY3R x8~m5px/T0 ITPUB个人空间1c-Ov*Hse$Q:g
的保持已提交事务的回滚信息。
1A?0F,FB;x#HO0 在X$BH视图中上,有一个CR_SCN_BAS列,显示CR块的最大SCN:
RNY1B `ys0 18> select file# ,DBABLK,state, tch ,cr_scn_bas,to_char(cr_scn_bas,'xxxxxxxx') SCN from x$bh
dMZ Q!d8b0 where file#=5 and dbablk=131046;ITPUB个人空间-zK.|4h-t
     FILE#     DBABLK      STATE      TCH CR_SCN_BAS SCN   
l3d"o7l%w o/`1k0 ---------- ---------- ---------- ---------- ---------- --------- -------------------- ---------- ITPUB个人空间0G_&bc4|NYFS
         5     131046          3          0    8728964    853184 ITPUB个人空间*h"b*B-Y#o]
上面的0x853184就是咯。旁边的8728964是他的10进制值.

TAG:

netbbs发布于2008-02-20 16:02:35
小妹的沙发。
蚊子窝 foxmile 发布于2008-02-20 16:42:30
关于读一致性,我了解的不多,buffer cache的一个功能就是构造CR块,从而提供读一直性吧,这个构造是oracle自己呢?还是手工?ITPUB个人空间
x Cq2~hS

如果是oracle自己,手工构造的意义有多大。
)N|l(c4AI1``ITPUB个人空间k:M(~:a'H$[rC
在坛子看到一篇老文章,很不错。
a6e!W6h`)Q@#`http://www.itpub.net/viewthread. ... p;extra=&page=1
bluemoon0083发布于2008-02-20 16:50:00
up
晶晶小妹的个人空间 晶晶小妹 发布于2008-02-20 16:50:09

QUOTE:

原帖由 foxmile 于 2008-2-20 16:42 发表
8s/utTuN,LsT"@关于读一致性,我了解的不多,buffer cache的一个功能就是构造CR块,从而提供读一直性吧,这个构造是oracle自己呢?还是手工?
Y7b7L j4}ITPUB个人空间如果是oracle自己,手工构造的意义有多大。
!y8D&pT        Pwg2a@s4` dtK{%n
在坛子看到一篇老文章,很不错。
bD$j0H'Z-L'cCITPUB个人空间http://www.itpub.net/viewthread. ... p;extra=&page=1
ITPUB个人空间Dq?SH[

|!bTV^/utD m
\Joracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net
ITPUB个人空间.KA4C1D%O^M%D"fGV
自己跟踪一次,能更清楚的明白为什么会有01555错误.
蚊子窝 foxmile 发布于2008-02-20 16:58:40
ok。多谢!
晶晶小妹的个人空间 晶晶小妹 发布于2008-02-20 16:59:40
其实通过自己动手做一次实验,就清楚了当select一个有事务的块时,oracle在内部为我们做了什么操作.
jBU;r`/R9LUyoracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net我喜欢这种明白的感觉,也想让坛友分享我的感觉.v/E-z4c@i7sg
^_^
蚊子窝 foxmile 发布于2008-02-20 17:06:34

QUOTE:

原帖由 晶晶小妹 于 2008-2-20 16:59 发表
0D'G,ahg4I1BJ7aLM其实通过自己动手做一次实验,就清楚了当select一个有事务的块时,oracle在内部为我们做了什么操作.
O4w@&Gqc
b%K

我喜欢这种明白的感觉,也想让坛友分享我的感觉.6|
VSlp

^_^
E\R1_TH
B4[
有道理。实践是最好的老师
烟囱的个人空间 烟囱 发布于2008-02-20 17:42:02
今晚按照小妹的实验重复一次.space.itpub.netwUb3Ud7p_

8\6Y0o
x ]Tboracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net
谢谢了啊~
蚊子窝 foxmile 发布于2008-02-20 17:46:02
今天在看书,等看完书,自己动手做一下。
shiri512003的个人空间 shiri512003 发布于2008-02-20 18:19:00
绝知此事要躬行
m.g,O6u5Loracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net支持一把
玉面飞龙发布于2008-02-20 18:43:19
Li Hai
Alienovo的个人空间 Alienovo 发布于2008-02-20 21:50:58
支持原创!
西瓜 BTxigua 发布于2008-02-20 21:59:12
小妹越来越牛了。
bosonmaster的个人空间 bosonmaster 发布于2008-02-20 23:54:14
不错,第一次试了下构造CR块
蒙昭良的个人空间 mengzhaoliang 发布于2008-02-21 01:28:35
楼主很强啊,看过,有很多不懂。等明天做个实验!
wabjtam123的个人空间 wabjtam123 发布于2008-02-21 08:07:57
大鼻子大眼睛美女晶,真棒!
Zhao Yu of Oracle Life 赵宇 发布于2008-02-21 08:42:39
基础很强,也很深入,值得学习
football8675的个人空间 football8675 发布于2008-02-21 09:03:28
差距太遠;~uX]*F'Js
要學的好多啊
bosonmaster的个人空间 bosonmaster 发布于2008-02-21 09:48:12
楼上的那么多福,送我个
晶晶小妹的个人空间 晶晶小妹 发布于2008-02-21 11:42:00

QUOTE:

原帖由 wabjtam123 于 2008-2-21 08:07 发表 space.itpub.net+G*m&N/E0M:T*c@
大鼻子大眼睛美女晶,真棒!

iVIi        xO1\Z3cspace.itpub.net

PLmq/{"[2X0k#A
%I ~7\H(Qz俺那疙瘩人都说:大鼻子有福!哈哈
r!qf$_zc\(V)zvH:[
g;y5eZL


bartfj的个人空间 bartfj 发布于2008-02-21 11:59:57
太牛了
晶晶小妹的个人空间 晶晶小妹 发布于2008-02-21 18:05:46
大家的支持 就是俺 最大的动力.
A0w s:Q5P/Dspace.itpub.net0H#ux$t1x YD
请大家的支持来的更猛烈些吧 g5M(U'`sF\j

*??!B7LU)p3{c+LG哈哈
SingleLove的个人空间 SingleLove 发布于2008-02-21 18:40:49
强。。不得不服
maclean的个人空间 maclean 发布于2008-02-21 21:36:10
请问 cr中index是怎么样的?
晶晶小妹的个人空间 晶晶小妹 发布于2008-02-21 21:44:18

QUOTE:

原帖由 maclean 于 2008-2-21 21:36 发表
ZD{*CqITPUB个人空间请问 cr中index是怎么样的?
c:G{\:Y4s-Uj

$Nj7|/gI
us?
space.itpub.netn\ej'o+pio$aU
你想了解什么?索引的CR块的格式??还是有索引时什么时候会产生CR块?
hanjs的个人空间 hanjs 发布于2008-02-22 09:41:51
佩服!
wa0362的个人空间 wa0362 发布于2008-02-22 10:26:45
DSI
solearn的个人空间 solearn 发布于2008-02-28 10:28:12
我们最后在会话10中做的更新,将覆盖131046的一个已提事务的ITL槽,这个被覆盖的ITL槽被记进事务回滚链头部块中,如下所示:
)GjA{6SD|3C3?5^.Joracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.netop: L  itl: xid:  0x001a.010.00000011 uba: 0x03800085.000e.01
"Uc
R f^#I
                      flg: C---    lkc:  0     scn: 0x0000.00853185space.itpub.net/l*y1b4@JI
J `1Iw

-------------------------------------------------------------------------------------------------------------------------------SQRvp1m0a(nr
BF3G_Xp[ q's
请教楼主:
HV/h3b-C!?Yu g在哪里找到被覆盖的ITL槽信息?
[`bG1c;W

在回滚段头块里,没有类似的entry。所谓“事务回滚链头部块”指的是什么呢?
晶晶小妹的个人空间 晶晶小妹 发布于2008-03-01 23:52:12

QUOTE:

原帖由 solearn 于 2008-2-28 10:28 发表 space.itpub.net,`.S-bfW
我们最后在会话10中做的更新,将覆盖131046的一个已提事务的ITL槽,这个被覆盖的ITL槽被记进事务回滚链头部块中,如下所示:
w;PG3UeEop: L  itl: xid:  0x001a.010.00000011 uba: 0x03800085.000e.01
5l7x5v#~F+W2w                      flg: C---    lkc:  0     scn: 0x0000.00853185
YcU+JT)Oe-------------------------------------------------------------------------------------------------------------------------------space.itpub.net2YD G;K9nS
I5X$A ^\

ITPUB个人空间1}4It+MXb6mn
请教楼主:
?h1G}f$c5Cp2p(cO Woracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net在哪里找到被覆盖的ITL槽信息? oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.netE*Lb _Co
在回滚段头块里,没有类似的entry。所谓“事务回滚链头部块”指的是什么呢?
ITPUB个人空间K4^$kt-VW^

J'F*H6Y jl  可以在块所对应的回滚块中找到被覆盖的ITL槽信息.比如说我修改了A块中的某一行,回滚信息被记录在U块中.那么在U块中就可以找到A块被覆盖的ITL槽信息.
anycall2010的个人空间 anycall2010 发布于2008-03-02 14:15:35
近段比较忙,很久没有发言了,这段时间有时候也关注关注,可爱的晶晶小妹妹,无论大家怎样评论,但是这种钻研的精神值得学习
我来说两句

(可选)

日历

« 2012-02-10  
   1234
567891011
12131415161718
19202122232425
26272829   

数据统计

  • 访问量: 105674
  • 日志数: 32
  • 图片数: 4
  • 建立时间: 2008-02-15
  • 更新时间: 2008-05-29

RSS订阅

Open Toolbar