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

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

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

查看( 721 ) / 评论( 35 )
一、查询魔术ITPUB个人空间1H^{ax
步1:在会话17中发布如下声明:ITPUB个人空间&S#U9iL(vg_ p
17> var x refcursor
cxgV|{?l0 17> exec open :x for select substr(c,1,5),id from t8;ITPUB个人空间!X W3zVDQ;l#d6t
PL/SQL 过程已成功完成。ITPUB个人空间!CS(y"H+@h
步2:在会话13删除T8的所有记录且提交:
Mm ^)tA$BZ0 13> delete t8 ;
3m&NZ6AD0 已删除 10 行。ITPUB个人空间 A"ZV}%C z$o c ?|k
13> commit;
~.IDt'y-k]$eK+V0 提交完成。
cw|]DHgLv0 步3:在会话17中输出游标X的所有行:ITPUB个人空间EbM8\!ZK
17> print xITPUB个人空间"f;|$M+pGE s.|#V X
SUBSTR(C,1         IDITPUB个人空间TRq-[|6L;lk6k
---------- ----------
!a ?\.`@VI7}0 g                   7
c @zP c0 h                   8ITPUB个人空间v#tF,bUu
i                   9
*L,pj M-\0 J                  10ITPUB个人空间;Wkb$Sl2m C
AA                  1ITPUB个人空间.nUHv nR
B                   2ITPUB个人空间!Wp Ti&Er!\!\:i
C                   3
]X;i9[a%zugUn0 D                   4ITPUB个人空间Gl wv(OdYWby"K
E                   5ITPUB个人空间!z%Q,p MndD
f                   6ITPUB个人空间QO V"J4LdM4x&\)k
已选择10行。ITPUB个人空间-B(bT,z1p8f"V As;f
我们在会话13中已删除且已提交,但在会话17中还是显示出了T8中的所有行,这是为什么呢?
tw)pCjz8c(Q0 1) 在步1打开游标,但此时并没有执行、执取,在会话17的PGA中,将会开辟一块内存存贮此游标。在游标的相关信息中,有一条就是游标打开是的SCN,假若此
;h} FW!Y0 ITPUB个人空间]1fq#S&Yu
时的SCN是1000。
Ahi2H;O"^yS/Q0 2) 在步2中对表T8进行了操作,并提交。Oracle每个数据块的头部,都记有此块当前的SCN值,此SCN值随着对块的更新而变化。假如,我们在步2更新T8表时,ITPUB个人空间1o8kv;F @+b iq!o5M?
ITPUB个人空间4s,hx f.K0Whvq%z4A'\
SCN是1200,这个值将被记入块头部的SCN值。
`'OL#N2lF)D&]]2U$Rq0 3) 在步3我们发布Print x声明,此声明将完成执行、抓取等步骤。在从T8表的相关块中抓取行时,Oracle会将打开游标时的SCN和块本身的SCN相比较,如果发现ITPUB个人空间$[x0Acp6H8~4xF/XP

6qT:s(H1F!KY0 后者大于前者,证明打开游标是在更新表之前进行的,Oracle将会在回滚段中寻找小于游标SCN的信息,构造一个在打开游标之前的块,这就是CR块了。如果回滚ITPUB个人空间0x_ j#[];ZCS8w3n`

.]u:fI*X*U2s^a0 段中的T8表的信息已经被覆盖,将会报告一个ORA-01555 快照太老错误。ITPUB个人空间JX^QBoI2v8u.g
        执行时间过长的查询,有时也会报出这个错误。ITPUB个人空间:uJ$qt7u
二、SCN
Z(g;F6FL'X/|0         SCN就是Oracle内部的一个记时机值,也就是Oracle的内部时钟。在9i之后,我们可以通过如下的方式获得当前的SCN号:
1J2C[ss,f0 scott@MYTWO>
JqFZ8J4K1Id0d'pI0 select scn,to_char(scn,’xxxxxxx’) from (select dbms_flashback.get_system_change_number SCN from dual);ITPUB个人空间7a8RZ a*UEw7r
   SCN   ITPUB个人空间|6jP:Pmf i [{y a
----------ITPUB个人空间K;p;L+l9L _&U-J o%A
8727805
j$~1w3Z!y$fqW"S0 在几乎所有的地方,你都能见到SCN。在事务表、回滚块中的回滚记录、数据块、日志文件等等,我们上面曾提到过,在游标中,记录的也有游标打开时的SCN。ITPUB个人空间2V+y7df*N1uy Pp
(在eygle的深入浅出oracle中有关SCN号更详细的介绍,18页)
!F;v)S%R%VDRu1Ey0 三、构造CR块
v{*Cn%H7rZ {0 Oracle会在三种情况下去读回滚段构造CR块:
(X(Cg+@|d0 1.  只要数据块上有锁,Oracle将会构造CR块。
9eS5O*}F1W0 2.  游标的SCN小于块的SCN,证明块在游标打开之后又被修改过了,这就要去构造CR块。
$^r*R@w8Epz9W0 3.  闪回查询中,要求的SCN小于块的SCN,也要去构造CR块。
q)Mg6E.G4~A0 ITPUB个人空间;l/u)_ juMqJE8x
构造CR块ITPUB个人空间/X9wz gf'z"F c(e-RQ
步1:先观察表T8的行分布情况:
lu9fV"?g6x2n0 ROWID                  BLOCK# C                  ID
M ?DyDtp J0 ------------------ ---------- ---------- ----------ITPUB个人空间6j+F]%\f'Z4i2Q
AAAB3LAAFAAAf/mAAA     131046 a                   1ITPUB个人空间4l;C!q8TM$b U&?q#d9~
AAAB3LAAFAAAf/mAAB     131046 b                   2
WY9H] DRM0 AAAB3LAAFAAAf/mAAC     131046 c                   3ITPUB个人空间&j x1LM1};}d$dm
AAAB3LAAFAAAf/nAAA     131047 d                   4
A`3By"rOP,y0 AAAB3LAAFAAAf/nAAB     131047 e                   5
R,ln#\!r&DF,|0 AAAB3LAAFAAAf/nAAC     131047 f                   6
#QIj/CTS Vy0 AAAB3LAAFAAAf/oAAA     131048 g                   7ITPUB个人空间,H,{C$tC3i2_2cZ
AAAB3LAAFAAAf/oAAB     131048 h                   8ITPUB个人空间RI~[ }L0s7i
AAAB3LAAFAAAf/oAAC     131048 i                   9
#rOw!@?;Z(I0 AAAB3LAAFAAAf/pAAA     131049 j                  10ITPUB个人空间&YZb R!`
步2:发布更新命令ITPUB个人空间[5j"}P1FG1m
13> update t8 set c=upper(c) where id<=2;
LY'DL:\0 已更新2行。
vx)t3_O h)O+\f0 13> commit;
uY_7rQ2S m0 提交完成。ITPUB个人空间 Y0f0a&\}r9JU
13> update t8 set c='A1' where id<=1;
X [mKn f ]5o/H!q.H!S0 已更新 1 行。
7] @4oAk }Z0 13> update t8 set c='A2' where id<=2;ITPUB个人空间x&oA:o#Z s^
已更新2行。
*h/h*hKBH]#t1c"]0c0 13> update t8 set c='B2' where id<=2;ITPUB个人空间'x2vY!^ [,q
已更新2行。ITPUB个人空间t8d/q5Ez3{Bf"U\
13> commit;
7A2v7m3o;d4j4L0 提交完成。
u!Ng5I&qJ}8Qu9J0 换到其他会话,
2_7p,a+^6P&p[(l f(G0 17> update t8 set c='aa1' where id<=1;
'y;S4sJar1wa"CAA _0 已更新 1 行。ITPUB个人空间S o4f vT1}`
17> update t8 set c='bb2' where id=2;
e} re_&p3Lh2[ g#o0 已更新 1 行。ITPUB个人空间3N(Hr'jh1p}
17> commit;ITPUB个人空间[k-` s2n'l7W
提交完成。ITPUB个人空间5v'[ L8uHaX
17> update t8 set c='aaa1' where id<=1;
u["hfZ_&E1v0 已更新 1 行。ITPUB个人空间5d Xv9B9zk_3]
17> update t8 set c='bbb2' where id=2;
-G,Gs0d~-WzCwA0 已更新 1 行。
sU,C%@u_KO6ca0 17> update t8 set c='aaaa1' where id<=1;
3XT7@9cO't:J`0 已更新 1 行。
*r*BE Um%aT3bo+Q"j~0 17> update t8 set c='bbbb2' where id=2;
RGZ#uHER+{0 已更新 1 行。ITPUB个人空间$u)b'jTJ$q
17> commit;
]8}V6B/dqot-p0h0 提交完成。
4tVu.qxZ0V w|0 再换个会话:ITPUB个人空间 RGe S y5b
10> update t8 set c='aaaaa10' where id=1;ITPUB个人空间.Ne3} CXvU
已更新 1 行。ITPUB个人空间:ks5U1Pth4p@'r"S E
10> update t8 set c='bbbbb10' where id=2;ITPUB个人空间m.A8u q8t;D
已更新 1 行。
!j1[f eD R$\k/D0 10> commit;
E-?!xA:~#g7Il0 提交完成。
Py*Z0\o4}J(e0 10> update t8 set c='az' where id=1;ITPUB个人空间1aQ'_y7_;eT/A U
已更新 1 行。
v8nV#T+oy1s0 10> update t8 set c='by' where id=2;
EpTzmu0 已更新 1 行。ITPUB个人空间 }N/S%AZ }@B
此时的SCN是
3?u;G-up XAn0 18> select dbms_flashback.get_system_change_number SCN from dual;ITPUB个人空间D1Qs Z1pal
   SCN
4M RP(I*qV&u0 ----------
y7Fl,Gk4v;JV0 8729612
x1F9@ L sLLf0 总结一下ITPUB个人空间R\%^ MTI q
行1的变化a->A->A1 A2 B2->aa1->aaa1  aaaa1->aaaaa10->azITPUB个人空间5Mi3{!d*ga%}\&z
行2的变化b->B->B2       ->bb2->bbb2  bbbb2->bbbbb10->by
R#c'_'|)`2w7R l&[0 下面开始构造CR块,首先说一下末提交时CR块的构造:
Hpp FL:m0 步3:末提交时CR块的构造:
r*\z[[@ E1qo0 接着上面的修改,如果我们在会话16发布查询T8表的声明:
!|n fEi6BH3m@0 16> select * from t8 where id<=3;
d8MU@#MrS0 由于最后一次修改没有提交,假如此时有其他会话访问行1或行2,就回发生回滚操作,从而构造一个CR块。让我们自己来回滚一下,感受一下Oracle的回滚操作
+L5vC6pd1p0
[5X | R0Hw+l*N0 到底做了什么:ITPUB个人空间"d|"w#j!Tx
首先DUMP块131046:
6^8Q1y8t{-j.D0 alter system dump datafile 5 block 131046;
J8hNzLI!vXY%{/x0 在事务的头部,有一块这样的结构:
g z Y e1Z_ hyAv0 Itl           Xid                  Uba         Flag  Lck        Scn/Fsc
w`OQo;VI0 0x01   0x0018.008.0000001a  0x03800073.000e.02  ----    2  fsc 0x0000.00000000ITPUB个人空间Lio1Zj3@,t
0x02   0x0019.007.00000020  0x03800053.0037.01  C---    0  scn 0x0000.008533f6ITPUB个人空间:kH.u-d K x&l'S
它被叫做ITL,Interested Transaction List,相关事务列表。此表中每一行,按Oracle惯用的说法,又叫一个槽,SLOT。当有事务修改此块中的数据时,或者ITPUB个人空间q_E-vgva
ITPUB个人空间O*wZNl8^cMd*h
说此块中有事务发生时,就在ITL中占用一个槽。下面我们了解一下ITL中的信息。
!ztg'Qe#]&Y+{0 第一列,ITL编号,共有两个,分别是0x01,0x02,随着此块中事务的增多,槽数量也会增多。ITPUB个人空间"GT,rN&j[-H5q
第二列,Xid,事务Xid编号,Xid共分三段,我们在上文中已经讲过,回滚段编号.槽号.序列号。我们来看0x01事务,它占用24号回滚段的第8个槽,此槽的序列
mH6pdB$q'[U){W0
[~ BDb0 号是26,即24.8.26。
j3}5IX#A8Z0 第三列,UBA,回滚块地址。也分三段,分别是回滚块地址,回滚块序列号,回滚链末记录号(即irb信息)。此处0x01事务占用14号文件,115号回滚块,块序列
HC Zw$oOi X&C0
/Z+~j o9[!O,X/D0 号是14,回滚链的末记录在115的第2条记录处。ITPUB个人空间ih.yC@0r!t bce0S
第四列,Flag,标志,共有四位,四位都是“----”,事务末提交,第一位是C,“C---”,事务已提交。
V5cE~ c8gYPl~ G0 第五列,Lck,事务所修改的行的数量。这些行,都算是被事务锁住的行。ITPUB个人空间NnVf;~`h!U
第六列,SCN/Fsc,是事务的SCN信息。0x01事务尚末提交,故此列为0。ITPUB个人空间];qV"i4r_hP/S7i6k[J
通过上面ITL,我们可以了解到,此块中有一个末提交的事务,那么此事务影响了几行呢,或者说此事务修改了几行呢?在下面行信息中,有:
I,ak3L,N5g-d"P%US0 tab 0, row 0, @0xba7ITPUB个人空间O8N%xV$l]:Fl4b
tl: 1009 fb: --H-FL-- lb: 0x1  cc: 2ITPUB个人空间lx)cfS'CO7h2}
col  0: [1000]ITPUB个人空间*p5[['K]!Td
61 7a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20ITPUB个人空间 V&Mx/|T)z(a
这其中的lb: 0x1,就是指此行对应事务0x01,或说此行是事务0x01修改的行,或说事务0x01锁住了此行。它现在的值是61 7a,正是“az”。ITPUB个人空间@at*~ {8T3P/i
        如果在其他会话上发布查询,Oracle首先检查ITL,一但发现某块上尚有末提交的事务,根据其UBA,马上开始构造其CR块,而不管会话所检索的行,是ITPUB个人空间5E%E}JN B&A;{
ITPUB个人空间3t'lKt8~6|
否是事务相关的。
l@4we'hX%L IFW0         块131046上有末提交事务:
-S4t;S+@%GQ qj0 0x01   0x0018.008.0000001a  0x03800073.000e.02  ----    2  fsc 0x0000.00000000
D2p F'N F%T0 其UBA是0x03800073.000e.02,即14号文件,115块,序列号14,第2条回滚记录。下面DUMP115块:
&AE:Bp-M2_&Z| t0 alter system dump datafile 14 block 115;ITPUB个人空间} y]3B(?:xr
在DUMP文件中找到根据irb: 0x2,找到115块中第2条回滚记录,它对应131046第1行,前映像值为 62 62 62 62 62 31 30 ,即“bbbbb10”。再根据其rci:0x01
.TSH4}-U3E'G+@0 ITPUB个人空间.d(R[Sha]#t9\zcp o.a
,向上找到第一条回滚记录,它对应131046第0行,前映像值为 61 61 61 61 61 31 30,即“aaaaa10”。ITPUB个人空间Q!I/{u$@R
131046块中当前值是:ITPUB个人空间8W(Wt-B6mX,R
Slot 0(行1):61 7a         (“az”)          相关末提交事务0x1
?&g,b^A%J!L0 Slot 1(行2):62 79         (“by”)         相关末提交事务0x1ITPUB个人空间-x!P7P3Sp'v^ TV
Slot 2(行3):63          (“c”)                 无相关事务ITPUB个人空间fh3Y HoK/j
通过读事务0x1的回滚块,将前映像信息写进131046,替换事务0x1对应的行,在内存中生成一个新的块:
6l Qf#VsC t_#R0 Slot 0(行1):61 61 61 61 61 31 30         (“aaaaa10”)         相关末提交事务0x1
f'f0da[s l0 Slot 1(行2):62 62 62 62 62 31 30         (“bbbbb10”)        相关末提交事务0x1
.N-PwtJj rV0 Slot 2(行3):63                                  (“c”)                        无相关事务ITPUB个人空间)c8|^p IX/t+c
这个新生成的块,块的编号仍是131046,在内存中,它的HASH位置会和原来的131046处于同一HASH Cache Buffer Chain。它就是131046的CR块。CR块的构造到现
0iVD b-?!O0 ITPUB个人空间 c#~C7l7X"U&A3}
在还没有完成,我们用前像映像行值替换了当前的行值,我们最后一步所做的更新并仅仅修改了行的值,上面我们讲到,每个块头有一个ITL,它初始有两个槽,
_}r^NP-TH0Jw0 ITPUB个人空间CM4ZT+S^;v)I:z
每个末提交的事务,将占用一个槽,可以随事务增多而扩充。如果事务已提交,它占用的槽会被下一个事务覆盖。因此,我们最后在会话10中做的更新,将覆盖ITPUB个人空间+X7q{bb$hP

m-T y Y1M:M P(N!u`_0 131046的一个已提事务的ITL槽,这个被覆盖的ITL槽被记进事务回滚链头部块中,如下所示:
dd3Em,cP)M0 op: L  itl: xid:  0x001a.010.00000011 uba: 0x03800085.000e.01
9O4IE0GZ^0                       flg: C---    lkc:  0     scn: 0x0000.00853185ITPUB个人空间M'l WM P
我们应该用它替换131046中当前的0x01槽:
P9LR6uYO(s3{%z a0 Itl           Xid                  Uba         Flag  Lck        Scn/Fsc
gd$t)Sjiri4j)Q1A%~ p0 0x01   0x0018.008.0000001a  0x03800073.000e.02  ----    2  fsc 0x0000.00000000
e8Nmp8h*T7\0 0x02   0x0019.007.00000020  0x03800053.0037.01  C---    0  scn 0x0000.008533f6
*Pc@U2g4fo0 替换为:ITPUB个人空间`-Wsc.t;QL
Itl           Xid                  Uba         Flag  Lck        Scn/FscITPUB个人空间.Mb Q,W!Hp*G
0x01   0x001a.010.00000011  0x03800085.000e.01  C---    0  fsc 0x0000.00853185
3}Z'Hr.IJ |0 0x02   0x0019.007.00000020  0x03800053.0037.01  C---    0  scn 0x0000.008533f6ITPUB个人空间;tg"v9r q9yrIA
好了,到现在,我们终于构造了一个131046的CR块:ITPUB个人空间Nj[ L0X
Itl           Xid                  Uba         Flag  Lck        Scn/Fsc
#Dm"{gw8T&}V0 0x01   0x001a.010.00000011  0x03800085.000e.01  C---    0  fsc 0x0000.00853185
I+@jW0^ X0 0x02   0x0019.007.00000020  0x03800053.0037.01  C---    0  scn 0x0000.008533f6ITPUB个人空间0p].t&V5[m0e I

6L7[O.LfRt!a-H0 Slot 0(行1):61 61 61 61 61 31 30         (“aaaaa10”)         相关末提交事务0x1
,l{6{ro/tZ Zt0 Slot 1(行2):62 62 62 62 62 31 30         (“bbbbb10”)        相关末提交事务0x1ITPUB个人空间#u,sSN{K
Slot 2(行3):63                                  (“c”)                        无相关事务
%F-Q wG0J[5D0 现在,131046的CR块中的ITL中,所有事务都已提交,我们的回滚是否可以到此为止呢?ITPUB个人空间.O#EVf?(Z!C4De H
还不行,Oracle还要对比一下查询游标打开时的SCN,如果大于上面CR块中ITL的最大提交SCN:8533f6,证明查询发生在事务结束之后,查询时的SCN大致是:ITPUB个人空间\:} RA)GH}"wD%m
18> select scn,to_char(scn,'xxxxxxxxxx') from (select dbms_flashback.get_system_change_number SCN from dual);
{0i-A0g'fOz+J0 SCN                 TO_CHAR(SCNITPUB个人空间 kI~E1?H R
----------                 -----------
Ol$R%Yau]"}8j0 8734649      8547b9ITPUB个人空间l)@ONZm)u
后于CR块ITL中最大提交SCN,好,到此为止,回滚结束。
Np_,As|0t0 如果游标的SCN前于ITL中最大提交SCN,Oracle仍要继续回滚。ITPUB个人空间xJ S4t R3D
步4:闪回查询时CR块的构造:ITPUB个人空间^7G5NM}%n6e
假如用户发布如下声明:
d8C1t:QSq.^ H0 select substr(c,1,5),id from t8 as of scn 8728960 where id<=3;
"Ai f Xw;V_0 此声明指定读取SCN为8728960时块中的行。这就是闪回查询。
b u{t~ Wcv@0 查询要求SCN:853180,前于步3时构造的CR块,因此,需要继续向前回滚。仍然根据ITL中的UBA信息,取出前映像,来构造另一个CR块。问题时,ITL有两个槽,
8R:r a+f5NwJ^4FKP/fS0
-H8mG)b2\bd*I0 我们该从哪个机槽的UBA回滚呢。最好的方法是从SCN最大的哪个。此处是槽0x02:ITPUB个人空间%Q;sW4s+|1Z3Drg
Itl           Xid                  Uba         Flag  Lck        Scn/FscITPUB个人空间CDYTtn0b
0x02   0x0019.007.00000020  0x03800053.0037.01  C---    0  scn 0x0000.008533f6ITPUB个人空间mL6kS5J4YzPW8vY I
UBA中显示,此事务的回滚链尾块在14号文件,83号块,中第1条记录,回滚块序列号是55。ITPUB个人空间~!c vOL0hy)I$^
alter system dump datafile 14 block 83;
,d]e `)U!Ad AA@0 打开DUMP文件,首先要检查一下,此回滚块是否已被别的事务覆盖,检查方法,非常简单,看此UnDo块的Seq值:ITPUB个人空间B]d}p
UNDO BLK:  
p@ S/[g }0 xid: 0x0019.008.00000021  seq: 0x37  cnt: 0x11  irb: 0x11  icl: 0x0   flg: 0x0000
;G{iR'J^6v0 仍是0x37,和UBA中所记的一样,证明此回滚块还末被覆盖。取出前映像,对应5号文件131046块的Slot 1(行2)的第0列: 62 62 62 62 32,即“bbbb2”。继ITPUB个人空间 @U,B ty3I {D.F(n,w

U~B5A-yba0 续沿回滚链向上,根据rdba: 0x03800052,回滚链上一块在82块中,继续DUMP:
+k9Z9T O6I ]6j'pD0 alter system dump datafile 14 block 82;ITPUB个人空间!tX~ s6])R
打开DUMP文件,检查块的Seq值,仍是37。取出前映像,对应5号文件131046块的Slot 0(行1)0列,值为:61 61 61 61 31,即“aaaa1”。ITPUB个人空间N$D7~I&|V2e
此回滚记录已是回滚链头,被覆盖的ITL槽是:
;E3X`\'^0 op: L  itl: xid:  0x0018.005.0000001a uba: 0x03800072.000e.08ITPUB个人空间h`Qs3gf#e
                      flg: C---    lkc:  0     scn: 0x0000.00853171ITPUB个人空间P1a;OIt dEy
构造一个新的CR块:
p BF;~EK0 Itl           Xid                  Uba         Flag  Lck        Scn/Fsc
WHJbh0 0x01   0x001a.010.00000011  0x03800085.000e.01  C---    0  fsc 0x0000.00853185
Q^a \f0 0x02   0x0018.005.0000001a  0x03800072.000e.08  C---    0  scn 0x0000.00853171
,M!o,ADC0 0x02   0x0019.007.00000020  0x03800053.0037.01  C---    0  scn 0x0000.008533f6
\M4f:c)Q0
8UHy)Pc0 Slot 0(行1):61 61 61 61 61 31 30         (“aaaaa10”)         相关末提交事务0x1
I^3YD b&{!d1fywho0 Slot 1(行2):62 62 62 62 62 31 30         (“bbbbb10”)        相关末提交事务0x1    --红色字体为应该覆盖的信息ITPUB个人空间R#L(cd)c Q Z y#pb
Slot 0(行1):61 61 61 61 31         (“aaaa1”)         ITPUB个人空间?PWE7lKr!~#S3pa
Slot 1(行2):62 62 62 62 32         (“bbbb2”)        
X;_-^1^C2y3A7X0 Slot 2(行3):63                                  (“c”)                        
&dy&t Z*o3|'{-G0 如果你发布如下声明:
;us'n ?#k l0 select substr(c,1,5),id from t8 as of scn 8728960 where id<=3;
q6M Go7]0 这将会先构造步3时的CR块,再构造此步中的CR块,这两个CR块都是131046的CR块,因此,步4时的CR块会覆盖步3时的CR块。也就是说,在一次查询中,Oracle对ITPUB个人空间h V#]d:z`"y O

)V+B$fmlC}#Ik$Q/P0 应一个数据块,只会在内存创建一个CR块。ITPUB个人空间^8`2? ]9F+]K4WY
好了,我们的查询到此可以为止了吗,对比SCN,查询SCN:853180,ITL中最大SCN:853185。ITL中最大SCN仍后于查询SCN。继续回滚:ITPUB个人空间#WMnuW'V(r
步5:继续回滚:
U.q |W VJ(^0O0 根据ITL中最大SCN槽的Uba,
Vb0Z$erHP(O:TM0 Itl           Xid                  Uba         Flag  Lck        Scn/FscITPUB个人空间*tq(lPc\7IA
0x01   0x001a.010.00000011  0x03800085.000e.01  C---    0  fsc 0x0000.00853185ITPUB个人空间)C3w7a&Ky
回滚链尾块在14号文件,133回滚块,第1条回滚记录,序列号是14。DUMP133块:ITPUB个人空间F-d3BI*V
alter system dump datafile 14 block 133;ITPUB个人空间M\L~#Fs/Lm`
打开DUMP文件,检查块的Seq值,仍是0xe。取出前映像,对应5号文件131046块的Slot 1(行2)0列,值为:62 62 62 32,即“bbb2”。回滚链上一块在rdba:
A]1\.Q4Y W1~0 ITPUB个人空间v5D7D0h$EI8s'x8c
0x03800084,132块中:
o6\ z$M1op0 alter system dump datafile 14 block 132;
2BfV5~ r&Ah0 找到最后一条回滚记录,它的前映像对应5号文件131046块的Slot 0(行1)0列,值为 61 61 61 31,即“aaa1”,但它并是回滚链头,根据它的Rci  0x02,继ITPUB个人空间1B1vf.OlF;aC
ITPUB个人空间v%{"KW|t
续向上,找到0x02条回滚记录, 它对应对应5号文件131046块的Slot 1(行2)0列,62 62 32,即“bb2”,还没完,再向上,是131046块中Slot 0(行1)0列,
&_1e_g DT b6b-v9l0 ITPUB个人空间cnJ\:\\j1?U
61 61 31,即“aa1”,此条回滚记录的Rci已经是0了,已经到了回滚链头,被覆盖的ITL槽是:
#Js6dzEf5{0 op: L  itl: xid:  0x0017.003.00000045 uba: 0x03800021.0021.03
-iz+wQ:Bh0                       flg: C---    lkc:  0     scn: 0x0000.008530fdITPUB个人空间{jh S;?El
Itl           Xid                  Uba         Flag  Lck        Scn/FscITPUB个人空间'A.?;r(r)s,?/]
0x01   0x001a.010.00000011  0x03800085.000e.01  C---    0  fsc 0x0000.00853185ITPUB个人空间-sF4?,lW"mB
0x01   0x0017.003.00000045  0x03800021.0021.03  C---    0  fsc 0x0000.008530fdITPUB个人空间hS)uO;Z
0x02   0x0018.005.0000001a  0x03800072.000e.08  C---    0  scn 0x0000.00853171ITPUB个人空间Sn4`DvXo OJ r'F*P
ITPUB个人空间k o!s,] c`~
Slot 0(行1):61 61 61 61 31         (“aaaa1”)      
o,z%[m.Bc)R0 Slot 1(行2):62 62 62 62 32         (“bbbb2”)
        
sd(RA*s-{JA0 Slot 0(行1):61 61 31         (“aa1”)         ITPUB个人空间d/dt-H?dbe
Slot 1(行2):62 62 32         (“bb2”)        
0Dv0[(d}8H0 Slot 2(行3):63                  (“c”)               
!sA F1Uiw0 查询的SCN是853180,ITL中最大SCN是853171,查询SCN大于ITL中的SCN,说明查询发生在事务后,好了,到此,我们这一次CR块构造完毕。此次生成的131046的
'|*\!L lX)fT1h'E+]0
J5b1AHE S0 CR块会覆盖步4时生成的,一个块,在一次查询中,只会产生一个CR块。
WU{t(Z1O6u0 根据我们的操作顺序:
9k6W I%a,}#Y&E5?4N0 a->A->A1 A2 B2->aa1->aaa1  aaaa1->aaaaa10->az
6bc5rU%Dc#gRs0 b->B->B2       ->bb2->bbb2  bbbb2->bbbbb10->by
/P"`H*`$Au{XF%y*x0                      ↑
]J5f:e k9p,`0 我们已经回到了箭头所指处。我们可以一直向前回塑,直到T8的行被插入131046时,或者,回滚段被覆盖时。假若我们又向前回塑,但回滚块的Seq和我们要求的
B p`.KA:`XC+]P0 ITPUB个人空间0M_@)Y+r:w$|&HWE
不一样,证明此块被覆盖了,此时Oracle会报告Ora-01555错误。我们只需让回滚段的区足够多,这样它每次绕回的时间必然加长。这样,回滚段必然可更长时间ITPUB个人空间w(X6G!H{ s0fB$\

L-q.C%t C B'e;Bj0 的保持已提交事务的回滚信息。
EEiu:^s Bd0 在X$BH视图中上,有一个CR_SCN_BAS列,显示CR块的最大SCN:ITPUB个人空间.|J3NY^&s
18> select file# ,DBABLK,state, tch ,cr_scn_bas,to_char(cr_scn_bas,'xxxxxxxx') SCN from x$bh ITPUB个人空间/MPx~1v3K
where file#=5 and dbablk=131046;
3A@%SV%w0      FILE#     DBABLK      STATE      TCH CR_SCN_BAS SCN   ITPUB个人空间4N ^Q8mj[)x*lz
---------- ---------- ---------- ---------- ---------- --------- -------------------- ----------
i%` d4n I TS.gX0          5     131046          3          0    8728964    853184 ITPUB个人空间([8s_+I$y7S0g
上面的0x853184就是咯。旁边的8728964是他的10进制值.

TAG:

netbbs发布于2008-02-20 16:02:35
小妹的沙发。
蚊子窝 foxmile 发布于2008-02-20 16:42:30
关于读一致性,我了解的不多,buffer cache的一个功能就是构造CR块,从而提供读一直性吧,这个构造是oracle自己呢?还是手工?ITPUB个人空间1[(b0{D Q _.Pp)o
如果是oracle自己,手工构造的意义有多大。
)KV1jM/U4J2{Y5hITPUB个人空间
:@i
i
X_$\~
在坛子看到一篇老文章,很不错。
gI"S'Bi.@f3Vehttp://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 发表
3q3e0l(m.XCworacle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net关于读一致性,我了解的不多,buffer cache的一个功能就是构造CR块,从而提供读一直性吧,这个构造是oracle自己呢?还是手工?space.itpub.net        h;e6X&n%s
如果是oracle自己,手工构造的意义有多大。0cJ
R,MP.o8h)qpt

'u`M-N/]
d

在坛子看到一篇老文章,很不错。
uBo |owkO$\Zspace.itpub.nethttp://www.itpub.net/viewthread. ... p;extra=&page=1
;N;n5SpP`ITPUB个人空间

B!@L'r]q:Zec/k

gXuB)c&C_IQ自己跟踪一次,能更清楚的明白为什么会有01555错误.
蚊子窝 foxmile 发布于2008-02-20 16:58:40
ok。多谢!
晶晶小妹的个人空间 晶晶小妹 发布于2008-02-20 16:59:40
其实通过自己动手做一次实验,就清楚了当select一个有事务的块时,oracle在内部为我们做了什么操作.
)zs/YVLporacle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net我喜欢这种明白的感觉,也想让坛友分享我的感觉.oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.netu2N
{%E;Z+];w

^_^
蚊子窝 foxmile 发布于2008-02-20 17:06:34

QUOTE:

原帖由 晶晶小妹 于 2008-2-20 16:59 发表 YM,ciw7C
其实通过自己动手做一次实验,就清楚了当select一个有事务的块时,oracle在内部为我们做了什么操作."Rz;R"ps9un3jgR
我喜欢这种明白的感觉,也想让坛友分享我的感觉.n$K)aE0t]'H
^_^
)C~u0ZK BWr有道理。实践是最好的老师
烟囱的个人空间 烟囱 发布于2008-02-20 17:42:02
今晚按照小妹的实验重复一次.
"Sd9AD-E1Z4n9o

P'lr {
iP`#baDITPUB个人空间
谢谢了啊~
蚊子窝 foxmile 发布于2008-02-20 17:46:02
今天在看书,等看完书,自己动手做一下。
shiri512003发布于2008-02-20 18:19:00
绝知此事要躬行
6M ~+hc6a2z支持一把
玉面飞龙发布于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
大鼻子大眼睛美女晶,真棒!
赵宇的DBA记事本 赵宇 发布于2008-02-21 08:42:39
基础很强,也很深入,值得学习
football8675的个人空间 football8675 发布于2008-02-21 09:03:28
差距太遠
h\wb%J要學的好多啊
bosonmaster的个人空间 bosonmaster 发布于2008-02-21 09:48:12
楼上的那么多福,送我个
晶晶小妹的个人空间 晶晶小妹 发布于2008-02-21 11:42:00

QUOTE:

原帖由 wabjtam123 于 2008-2-21 08:07 发表 oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net)QAD}\V'U)^
大鼻子大眼睛美女晶,真棒!
space.itpub.net2qtR&{uDu

?F-APY)Lh
!G!ekB~5\
~/p6Mspace.itpub.net
俺那疙瘩人都说:大鼻子有福!哈哈

j0{:t`i"d2`
space.itpub.netHz`x/M:N

bartfj的个人空间 bartfj 发布于2008-02-21 11:59:57
太牛了
晶晶小妹的个人空间 晶晶小妹 发布于2008-02-21 18:05:46
大家的支持 就是俺 最大的动力.oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net-I nZN?l?a

+FfcgV5l&dIs请大家的支持来的更猛烈些吧
5K5|7{p9\nITPUB个人空间)iL$H6l
U3X4[v~

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

QUOTE:

原帖由 maclean 于 2008-2-21 21:36 发表
7I8@OU"O&Auspace.itpub.net请问 cr中index是怎么样的?
VW-q(D8mm7`

;m|0^cU_E:sWPoracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.netct!z-{7A
h

你想了解什么?索引的CR块的格式??还是有索引时什么时候会产生CR块?
hanjs发布于2008-02-22 09:41:51
佩服!
wa0362发布于2008-02-22 10:26:45
DSI
solearn的个人空间 solearn 发布于2008-02-28 10:28:12
我们最后在会话10中做的更新,将覆盖131046的一个已提事务的ITL槽,这个被覆盖的ITL槽被记进事务回滚链头部块中,如下所示:
'nG~
];T%z.WH4Q3F Z
[space.itpub.net
op: L  itl: xid:  0x001a.010.00000011 uba: 0x03800085.000e.016Gwcke;AHoV
                      flg: C---    lkc:  0     scn: 0x0000.008531858JwF E3g~
-------------------------------------------------------------------------------------------------------------------------------
7dtp*Z"ZK'S0soracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net
%S|
` `q#hsITPUB个人空间
请教楼主:ITPUB个人空间(SG8z!n7A:w8],D,a
在哪里找到被覆盖的ITL槽信息?
PM } \co8Ld1Lspace.itpub.net在回滚段头块里,没有类似的entry。所谓“事务回滚链头部块”指的是什么呢?
晶晶小妹的个人空间 晶晶小妹 发布于2008-03-01 23:52:12

QUOTE:

原帖由 solearn 于 2008-2-28 10:28 发表

l,AE&^Y-x;{#i
我们最后在会话10中做的更新,将覆盖131046的一个已提事务的ITL槽,这个被覆盖的ITL槽被记进事务回滚链头部块中,如下所示:oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.neti&b*Gvf;}+}K'\q
op: L  itl: xid:  0x001a.010.00000011 uba: 0x03800085.000e.01
/Q?r6r'x:u$_Sspace.itpub.net                      flg: C---    lkc:  0     scn: 0x0000.00853185j!s k\6ci;c]
Z

-------------------------------------------------------------------------------------------------------------------------------oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.netK_Hbt
kz as B!})L[![
请教楼主:4v(Yk3s:x,o
在哪里找到被覆盖的ITL槽信息? /b4Hy6F E
在回滚段头块里,没有类似的entry。所谓“事务回滚链头部块”指的是什么呢?

O&w*d+}1wU~
e*S@*m
Q;?

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

(可选)

日历

« 2008-10-14  
   1234
567891011
12131415161718
19202122232425
262728293031 

数据统计

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

RSS订阅

Open Toolbar