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

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

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

查看( 1280 ) / 评论( 35 )
一、查询魔术
*PqPycP0 步1:在会话17中发布如下声明:
mp h3g.^0 17> var x refcursorITPUB个人空间 m_/qx9g1y
17> exec open :x for select substr(c,1,5),id from t8;
4w TPZL o0 PL/SQL 过程已成功完成。
:^#X Q Y3m'`0 步2:在会话13删除T8的所有记录且提交:
9TWb2K { m`0 13> delete t8 ;
z]m-F%Wo5q0 已删除 10 行。
y#k|!AA_8E6b0 13> commit;ITPUB个人空间%P7]-CB WBm
提交完成。
(_.Z^G:c Gr0 步3:在会话17中输出游标X的所有行:
O/h:}Lfi;?*]C;N0 17> print xITPUB个人空间g6nBN4}~ x1b _{I
SUBSTR(C,1         IDITPUB个人空间k6vP/No
---------- ----------
'E4vs ` k3I]i0 g                   7ITPUB个人空间g'hl].`9JW+@,sp:_8p
h                   8ITPUB个人空间:K4E xk,S,`
i                   9ITPUB个人空间(y/l]n9G Asd.O [
J                  10
/_)p_9x$z y$m0 AA                  1
z1]f!CmyOO i0 B                   2
rBy$vV MJxT"E0 C                   3
oI _|cu0 D                   4
;n2n~,b5KB ]y0 E                   5
Q*^{r!O R8?0 f                   6ITPUB个人空间6u/n*k%]"S _
已选择10行。
L0ID(JFd s-Q8{`0 我们在会话13中已删除且已提交,但在会话17中还是显示出了T8中的所有行,这是为什么呢?
yqkuQ3?3s%He0 1) 在步1打开游标,但此时并没有执行、执取,在会话17的PGA中,将会开辟一块内存存贮此游标。在游标的相关信息中,有一条就是游标打开是的SCN,假若此
&`4^ v2X? C4E[Ll0
X/_%No,yu9i0 时的SCN是1000。ITPUB个人空间S nxBE2T9O8`*m6]&dD
2) 在步2中对表T8进行了操作,并提交。Oracle每个数据块的头部,都记有此块当前的SCN值,此SCN值随着对块的更新而变化。假如,我们在步2更新T8表时,ITPUB个人空间5]zs"V}?LK2s1@
ITPUB个人空间0ddI(o?q.W0UUE
SCN是1200,这个值将被记入块头部的SCN值。ITPUB个人空间S$Y MB0SPK
3) 在步3我们发布Print x声明,此声明将完成执行、抓取等步骤。在从T8表的相关块中抓取行时,Oracle会将打开游标时的SCN和块本身的SCN相比较,如果发现
"Da`!q$d7X7}?0
y e;j9A:if5@-^;{0 后者大于前者,证明打开游标是在更新表之前进行的,Oracle将会在回滚段中寻找小于游标SCN的信息,构造一个在打开游标之前的块,这就是CR块了。如果回滚ITPUB个人空间?yr(D @E o Vx
ITPUB个人空间er/c YDp| ?
段中的T8表的信息已经被覆盖,将会报告一个ORA-01555 快照太老错误。ITPUB个人空间g#]4fA-`$d
        执行时间过长的查询,有时也会报出这个错误。ITPUB个人空间Ik%EU~4r
二、SCN
q'N.t?/IVlFM0         SCN就是Oracle内部的一个记时机值,也就是Oracle的内部时钟。在9i之后,我们可以通过如下的方式获得当前的SCN号:ITPUB个人空间(u)gO(w0M9SKcQ1|l F
scott@MYTWO> ITPUB个人空间,\!o|}m
select scn,to_char(scn,’xxxxxxx’) from (select dbms_flashback.get_system_change_number SCN from dual);ITPUB个人空间%RT&S1X#o }AV
   SCN   
6r7abcZU0 ----------
a A8KN/O w^#RF0 8727805ITPUB个人空间 [6Yl C OE'r,x:tb
在几乎所有的地方,你都能见到SCN。在事务表、回滚块中的回滚记录、数据块、日志文件等等,我们上面曾提到过,在游标中,记录的也有游标打开时的SCN。
6Q{.Il(S,_ z0 (在eygle的深入浅出oracle中有关SCN号更详细的介绍,18页)
%\OePf1~ o/RR0 三、构造CR块
[{'vv0|+rE]5O!j0 Oracle会在三种情况下去读回滚段构造CR块:
,~sy0x}%@0 1.  只要数据块上有锁,Oracle将会构造CR块。
E'bt IL$Jn@q#`0 2.  游标的SCN小于块的SCN,证明块在游标打开之后又被修改过了,这就要去构造CR块。ITPUB个人空间Y4r9A:q5`+JF_&n4\6SoE
3.  闪回查询中,要求的SCN小于块的SCN,也要去构造CR块。
H$Oa&Y0mE cs0 ITPUB个人空间zZq E&yx#?
构造CR块
0p0Hl.E_\ZI'F0 步1:先观察表T8的行分布情况:ITPUB个人空间 rTM}Mt
ROWID                  BLOCK# C                  IDITPUB个人空间)gU$rM7K"E7EF
------------------ ---------- ---------- ----------ITPUB个人空间&FE9D!s?
AAAB3LAAFAAAf/mAAA     131046 a                   1
)@'~ly2arW|)T0 AAAB3LAAFAAAf/mAAB     131046 b                   2ITPUB个人空间,y?6HVDq-X{
AAAB3LAAFAAAf/mAAC     131046 c                   3
9p9j8Y/p_V6|Z0 AAAB3LAAFAAAf/nAAA     131047 d                   4
1o1y f;N/s*M?9J0 AAAB3LAAFAAAf/nAAB     131047 e                   5ITPUB个人空间.y};C ?|'_B
AAAB3LAAFAAAf/nAAC     131047 f                   6
f)d3aF8q7k:C$I?:[%v0 AAAB3LAAFAAAf/oAAA     131048 g                   7
do7W6Ow*wz6P0 AAAB3LAAFAAAf/oAAB     131048 h                   8
H)Lh(`6f P] M0 AAAB3LAAFAAAf/oAAC     131048 i                   9ITPUB个人空间7u,Rv+ls5R
AAAB3LAAFAAAf/pAAA     131049 j                  10ITPUB个人空间5~;g%@ g*I H
步2:发布更新命令ITPUB个人空间"d5NC"^&p
13> update t8 set c=upper(c) where id<=2;
*g_sKZ2]s#a0 已更新2行。ITPUB个人空间p"?0^0VID1E
13> commit;ITPUB个人空间8Y(@5BF&{O0j$E
提交完成。
'd6v/ha+L K4o.o0 13> update t8 set c='A1' where id<=1;ITPUB个人空间%B_(dT4Z
已更新 1 行。
2s*GR u:G0 13> update t8 set c='A2' where id<=2;
*I$tD|-`2O r"_0 已更新2行。
bo h8_fW:TN0 13> update t8 set c='B2' where id<=2;
lM`VZ0 已更新2行。ITPUB个人空间MF-P(L]IM!m
13> commit;ITPUB个人空间r,N7D*Q C
提交完成。
B Sp$[#x ~3wdr4V0 换到其他会话,ITPUB个人空间E1\S0E6wF'^0L|
17> update t8 set c='aa1' where id<=1;ITPUB个人空间L!v A([5@
已更新 1 行。ITPUB个人空间x)k-R5o8mC9[-?v
17> update t8 set c='bb2' where id=2;
$T#S'?$G$~O0 已更新 1 行。ITPUB个人空间#h\VD%w(}7C mk
17> commit;
E!Q6if$w9O%yE%[0 提交完成。
%N @5_RnB*Z;KX0 17> update t8 set c='aaa1' where id<=1;ITPUB个人空间^I p(~ j(kv$|
已更新 1 行。ITPUB个人空间4lYU LX[j ^r
17> update t8 set c='bbb2' where id=2;
6u V Id`:Tp L0 已更新 1 行。
7mxX%@%aQBcHt0 17> update t8 set c='aaaa1' where id<=1;ITPUB个人空间3d-M5C-o.@7jv-vF)P
已更新 1 行。ITPUB个人空间5Bfz\V/X#V5q
17> update t8 set c='bbbb2' where id=2;
W}cl?6@!c3T0 已更新 1 行。ITPUB个人空间 ?9D&N hR
17> commit;
n'K I9G0l^mW0 提交完成。ITPUB个人空间K7njm.Nm8rZ3} w
再换个会话:ITPUB个人空间3X[{s}G0E/E3?o
10> update t8 set c='aaaaa10' where id=1;ITPUB个人空间e%wfE/k!oPj&n
已更新 1 行。
LO:` P bB y L'e0 10> update t8 set c='bbbbb10' where id=2;
7pm3e4e@5I4d0 已更新 1 行。ITPUB个人空间#kr.jyq7k.@
10> commit;
-m5_r5v KY0 提交完成。
[ x+D%Xy+g%\5d0 10> update t8 set c='az' where id=1;
/^ ~ KFm4q2zY0 已更新 1 行。
"_b }H` ~ p0 10> update t8 set c='by' where id=2;ITPUB个人空间:P;Vm0v3o4d&kk
已更新 1 行。ITPUB个人空间3|)[Z i,z B"s.I7C`1]
此时的SCN是
B"N0N!XV Y/SEF.J+N0 18> select dbms_flashback.get_system_change_number SCN from dual;ITPUB个人空间1bY8B3jT
   SCNITPUB个人空间.N\:E%]@d4H
----------ITPUB个人空间/t!IGo|z ~5u6W r
8729612ITPUB个人空间5J%`D i)p7X0lr
总结一下ITPUB个人空间w KN7u/Xu!l
行1的变化a->A->A1 A2 B2->aa1->aaa1  aaaa1->aaaaa10->az
:K`-R-@&[Yb0 行2的变化b->B->B2       ->bb2->bbb2  bbbb2->bbbbb10->byITPUB个人空间Ah*g2|!v G9_@
下面开始构造CR块,首先说一下末提交时CR块的构造:
0Ku:p w%ogy2W~0 步3:末提交时CR块的构造:ITPUB个人空间M'F^,AY#v\%Wi@R
接着上面的修改,如果我们在会话16发布查询T8表的声明:
/W0n*W+{R5Kh0M0 16> select * from t8 where id<=3;
"tt/C2~#cva1O%O0 由于最后一次修改没有提交,假如此时有其他会话访问行1或行2,就回发生回滚操作,从而构造一个CR块。让我们自己来回滚一下,感受一下Oracle的回滚操作
\:g&v.o CG;G!}^d0 ITPUB个人空间Mh9V5s9B5Gt4^*C
到底做了什么:ITPUB个人空间E ZeN9ZRW
首先DUMP块131046:
2s:q2g mC^D9R!B0 alter system dump datafile 5 block 131046;
%@5V K&n0|(g|R0 在事务的头部,有一块这样的结构:ITPUB个人空间a8_"C.~^&k
Itl           Xid                  Uba         Flag  Lck        Scn/FscITPUB个人空间/ho?w2_g
0x01   0x0018.008.0000001a  0x03800073.000e.02  ----    2  fsc 0x0000.00000000
'\U-['MQ#n0 0x02   0x0019.007.00000020  0x03800053.0037.01  C---    0  scn 0x0000.008533f6
K!wm r)M_0 它被叫做ITL,Interested Transaction List,相关事务列表。此表中每一行,按Oracle惯用的说法,又叫一个槽,SLOT。当有事务修改此块中的数据时,或者ITPUB个人空间-f)Z(C-v%H9M'Y4fs

k3n7bfO?0 说此块中有事务发生时,就在ITL中占用一个槽。下面我们了解一下ITL中的信息。
g7zP z|6CNU0 第一列,ITL编号,共有两个,分别是0x01,0x02,随着此块中事务的增多,槽数量也会增多。ITPUB个人空间 ?*bc"V$z6SnmsW
第二列,Xid,事务Xid编号,Xid共分三段,我们在上文中已经讲过,回滚段编号.槽号.序列号。我们来看0x01事务,它占用24号回滚段的第8个槽,此槽的序列
)C@n:wT:q"jc`;n3y0 ITPUB个人空间#E1\nX(j)WK
号是26,即24.8.26。ITPUB个人空间!{"uYN9R Mv
第三列,UBA,回滚块地址。也分三段,分别是回滚块地址,回滚块序列号,回滚链末记录号(即irb信息)。此处0x01事务占用14号文件,115号回滚块,块序列ITPUB个人空间W Z%U*?kL @E
ITPUB个人空间V&o'Y8X0X
号是14,回滚链的末记录在115的第2条记录处。ITPUB个人空间9h1l w|&I9PGaL
第四列,Flag,标志,共有四位,四位都是“----”,事务末提交,第一位是C,“C---”,事务已提交。
9a ])v5t#{Y {;o-gB0 第五列,Lck,事务所修改的行的数量。这些行,都算是被事务锁住的行。ITPUB个人空间5q+xfC(Q~(h
第六列,SCN/Fsc,是事务的SCN信息。0x01事务尚末提交,故此列为0。
1_6x3_}.Y0 通过上面ITL,我们可以了解到,此块中有一个末提交的事务,那么此事务影响了几行呢,或者说此事务修改了几行呢?在下面行信息中,有:
FZ o8t7~_!g0 tab 0, row 0, @0xba7ITPUB个人空间5w;svuW'M{
tl: 1009 fb: --H-FL-- lb: 0x1  cc: 2
{E$Q%z\v:Y0 col  0: [1000]
,}_,?%c8[SP0 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
\8m&{(r C E0 这其中的lb: 0x1,就是指此行对应事务0x01,或说此行是事务0x01修改的行,或说事务0x01锁住了此行。它现在的值是61 7a,正是“az”。
Ht%de*d$l~n]0         如果在其他会话上发布查询,Oracle首先检查ITL,一但发现某块上尚有末提交的事务,根据其UBA,马上开始构造其CR块,而不管会话所检索的行,是
j `.E%p'XKm.|F0
j-^2cK-D;~0 否是事务相关的。
6yf]#@%fO'N0         块131046上有末提交事务:
2a1r#U [.b!h/[5f0 0x01   0x0018.008.0000001a  0x03800073.000e.02  ----    2  fsc 0x0000.00000000
p0dZ/z&W BM0 其UBA是0x03800073.000e.02,即14号文件,115块,序列号14,第2条回滚记录。下面DUMP115块:ITPUB个人空间!yB{em:C
alter system dump datafile 14 block 115;ITPUB个人空间.m.pw&^j e
在DUMP文件中找到根据irb: 0x2,找到115块中第2条回滚记录,它对应131046第1行,前映像值为 62 62 62 62 62 31 30 ,即“bbbbb10”。再根据其rci:0x01ITPUB个人空间!xXx3tu6|

~8v:ITBc"Ps0 ,向上找到第一条回滚记录,它对应131046第0行,前映像值为 61 61 61 61 61 31 30,即“aaaaa10”。
gpQ W)M"|.U0 131046块中当前值是:
A[m)w/N}0 Slot 0(行1):61 7a         (“az”)          相关末提交事务0x1
P|!Zo7C4Y0 Slot 1(行2):62 79         (“by”)         相关末提交事务0x1ITPUB个人空间"S4L!DbTc
Slot 2(行3):63          (“c”)                 无相关事务ITPUB个人空间[5p(LI`%vm
通过读事务0x1的回滚块,将前映像信息写进131046,替换事务0x1对应的行,在内存中生成一个新的块:
'~)Taq3e\0 Slot 0(行1):61 61 61 61 61 31 30         (“aaaaa10”)         相关末提交事务0x1ITPUB个人空间(y Re V3^,kE
Slot 1(行2):62 62 62 62 62 31 30         (“bbbbb10”)        相关末提交事务0x1
6a%gL0gfk `0nr.S0 Slot 2(行3):63                                  (“c”)                        无相关事务ITPUB个人空间c p6X/` u Y/}*y
这个新生成的块,块的编号仍是131046,在内存中,它的HASH位置会和原来的131046处于同一HASH Cache Buffer Chain。它就是131046的CR块。CR块的构造到现
ln\&oRo0 ITPUB个人空间.xn$g r`4d
在还没有完成,我们用前像映像行值替换了当前的行值,我们最后一步所做的更新并仅仅修改了行的值,上面我们讲到,每个块头有一个ITL,它初始有两个槽,ITPUB个人空间Hx4bb`
ITPUB个人空间!x+b1z1rQ6}%Q
每个末提交的事务,将占用一个槽,可以随事务增多而扩充。如果事务已提交,它占用的槽会被下一个事务覆盖。因此,我们最后在会话10中做的更新,将覆盖ITPUB个人空间$v!y u `XWZj

B6~ ^1J+aC0 131046的一个已提事务的ITL槽,这个被覆盖的ITL槽被记进事务回滚链头部块中,如下所示:
l6uoih/}0 op: L  itl: xid:  0x001a.010.00000011 uba: 0x03800085.000e.01
8GD,r*Y E2s*A0                       flg: C---    lkc:  0     scn: 0x0000.00853185
X aOp#Bdr0 我们应该用它替换131046中当前的0x01槽:ITPUB个人空间&T j:N g/{E
Itl           Xid                  Uba         Flag  Lck        Scn/FscITPUB个人空间3S j2y"v6@8QdSg'WF e
0x01   0x0018.008.0000001a  0x03800073.000e.02  ----    2  fsc 0x0000.00000000ITPUB个人空间a:D%R&D-R*OC
0x02   0x0019.007.00000020  0x03800053.0037.01  C---    0  scn 0x0000.008533f6ITPUB个人空间Jn-bVkq {-]
替换为:
9J0g6A'F0q Y'@0 Itl           Xid                  Uba         Flag  Lck        Scn/Fsc
A#lF0B3BPY0 0x01   0x001a.010.00000011  0x03800085.000e.01  C---    0  fsc 0x0000.00853185ITPUB个人空间NG(X;m},j/W5};[
0x02   0x0019.007.00000020  0x03800053.0037.01  C---    0  scn 0x0000.008533f6ITPUB个人空间,Mp+x JI&z%ve6M
好了,到现在,我们终于构造了一个131046的CR块:ITPUB个人空间Zk6VQ@du n
Itl           Xid                  Uba         Flag  Lck        Scn/FscITPUB个人空间7C"o:PL#U%]:\3|"B
0x01   0x001a.010.00000011  0x03800085.000e.01  C---    0  fsc 0x0000.00853185
t6naLts d0 0x02   0x0019.007.00000020  0x03800053.0037.01  C---    0  scn 0x0000.008533f6
zz^\'S.EB6W7D0 ITPUB个人空间^+Q x({(pc
Slot 0(行1):61 61 61 61 61 31 30         (“aaaaa10”)         相关末提交事务0x1ITPUB个人空间6D,Z'R!a-fD
Slot 1(行2):62 62 62 62 62 31 30         (“bbbbb10”)        相关末提交事务0x1ITPUB个人空间#b3hdy@[!OG"@'|
Slot 2(行3):63                                  (“c”)                        无相关事务ITPUB个人空间/gbS/i2JH
现在,131046的CR块中的ITL中,所有事务都已提交,我们的回滚是否可以到此为止呢?ITPUB个人空间y/Yh2nF{I6s
还不行,Oracle还要对比一下查询游标打开时的SCN,如果大于上面CR块中ITL的最大提交SCN:8533f6,证明查询发生在事务结束之后,查询时的SCN大致是:
%n#Lj"L3lD0 18> select scn,to_char(scn,'xxxxxxxxxx') from (select dbms_flashback.get_system_change_number SCN from dual);ITPUB个人空间r3s3[*tAW#j/m,g
SCN                 TO_CHAR(SCN
(K"d4^G1FR#dh0 ----------                 -----------
1H\b0M#z0Yk%]v1VU6E0 8734649      8547b9ITPUB个人空间cpw u1N}`#N
后于CR块ITL中最大提交SCN,好,到此为止,回滚结束。ITPUB个人空间 e!M B;~,AB:JK
如果游标的SCN前于ITL中最大提交SCN,Oracle仍要继续回滚。ITPUB个人空间VW@cr
步4:闪回查询时CR块的构造:ITPUB个人空间hZh h\9] d
假如用户发布如下声明:
-x ab6k;k3C~ U0 select substr(c,1,5),id from t8 as of scn 8728960 where id<=3;ITPUB个人空间0b%N1oE'u
此声明指定读取SCN为8728960时块中的行。这就是闪回查询。
S8WO'w0Vc0 查询要求SCN:853180,前于步3时构造的CR块,因此,需要继续向前回滚。仍然根据ITL中的UBA信息,取出前映像,来构造另一个CR块。问题时,ITL有两个槽,
8{XSyC0
)tW!@3au|0 我们该从哪个机槽的UBA回滚呢。最好的方法是从SCN最大的哪个。此处是槽0x02:ITPUB个人空间\*@| f'Y.E G6Bb
Itl           Xid                  Uba         Flag  Lck        Scn/FscITPUB个人空间)O/x"v.r?
0x02   0x0019.007.00000020  0x03800053.0037.01  C---    0  scn 0x0000.008533f6ITPUB个人空间0\T$}/J`.@%ixc.v;ae
UBA中显示,此事务的回滚链尾块在14号文件,83号块,中第1条记录,回滚块序列号是55。ITPUB个人空间}mbs,M:Uk
alter system dump datafile 14 block 83;
OQGx|o;x4e0 打开DUMP文件,首先要检查一下,此回滚块是否已被别的事务覆盖,检查方法,非常简单,看此UnDo块的Seq值:
1f*zePS*i0 UNDO BLK:  
!U0u1x#W-E7J)k+S X0 xid: 0x0019.008.00000021  seq: 0x37  cnt: 0x11  irb: 0x11  icl: 0x0   flg: 0x0000ITPUB个人空间,W `v/II6EU {![
仍是0x37,和UBA中所记的一样,证明此回滚块还末被覆盖。取出前映像,对应5号文件131046块的Slot 1(行2)的第0列: 62 62 62 62 32,即“bbbb2”。继ITPUB个人空间\6l.e$U+g X)f

|l#P/GPy1i bw0 续沿回滚链向上,根据rdba: 0x03800052,回滚链上一块在82块中,继续DUMP:
,x;vvcE9hEbGC x X0 alter system dump datafile 14 block 82;
+W"}f+u})J!E W:n0 打开DUMP文件,检查块的Seq值,仍是37。取出前映像,对应5号文件131046块的Slot 0(行1)0列,值为:61 61 61 61 31,即“aaaa1”。
!|klH&Rn%K%`;}0 此回滚记录已是回滚链头,被覆盖的ITL槽是:ITPUB个人空间y4C ]-@r*Aa3lv
op: L  itl: xid:  0x0018.005.0000001a uba: 0x03800072.000e.08ITPUB个人空间|h-ef#_!Db
                      flg: C---    lkc:  0     scn: 0x0000.00853171
tEbxYQu0 构造一个新的CR块:ITPUB个人空间"~ GP#j4}N1u5V
Itl           Xid                  Uba         Flag  Lck        Scn/FscITPUB个人空间 |0k/C*x#Aa/A
0x01   0x001a.010.00000011  0x03800085.000e.01  C---    0  fsc 0x0000.00853185
7Pd-]'e `M'uP4V0 0x02   0x0018.005.0000001a  0x03800072.000e.08  C---    0  scn 0x0000.00853171ITPUB个人空间]` _;NK*_8[
0x02   0x0019.007.00000020  0x03800053.0037.01  C---    0  scn 0x0000.008533f6
_ {:|)L7\8\:W0 ITPUB个人空间-T&T.^1NxjH)W
Slot 0(行1):61 61 61 61 61 31 30         (“aaaaa10”)         相关末提交事务0x1ITPUB个人空间yc9I5f6mD
Slot 1(行2):62 62 62 62 62 31 30         (“bbbbb10”)        相关末提交事务0x1    --红色字体为应该覆盖的信息
b1[F SPBP0
Slot 0(行1):61 61 61 61 31         (“aaaa1”)         ITPUB个人空间+x X nezqy
Slot 1(行2):62 62 62 62 32         (“bbbb2”)        
/^A}(`&V*Y.x0 Slot 2(行3):63                                  (“c”)                        
^%|;|/F(H{i;GF0 如果你发布如下声明:
2}Q{6D:d`0T~0 select substr(c,1,5),id from t8 as of scn 8728960 where id<=3;
I_ S8\O3R0 这将会先构造步3时的CR块,再构造此步中的CR块,这两个CR块都是131046的CR块,因此,步4时的CR块会覆盖步3时的CR块。也就是说,在一次查询中,Oracle对ITPUB个人空间*nTg8i9|:x*u

V)w9V_Y_O] J]0 应一个数据块,只会在内存创建一个CR块。ITPUB个人空间%Yb"{pwEiu
好了,我们的查询到此可以为止了吗,对比SCN,查询SCN:853180,ITL中最大SCN:853185。ITL中最大SCN仍后于查询SCN。继续回滚:ITPUB个人空间&w_Xh1rOfb
步5:继续回滚:ITPUB个人空间+`V$K4x L*XC
根据ITL中最大SCN槽的Uba,ITPUB个人空间GC8iX vX:c
Itl           Xid                  Uba         Flag  Lck        Scn/FscITPUB个人空间L(ouJ6zs'`!l1R
0x01   0x001a.010.00000011  0x03800085.000e.01  C---    0  fsc 0x0000.00853185ITPUB个人空间G)gn9T1?6L
回滚链尾块在14号文件,133回滚块,第1条回滚记录,序列号是14。DUMP133块:
` ]R&SuK_!V5n&e0 alter system dump datafile 14 block 133;
8i@ Y lF/eRw {AVk0 打开DUMP文件,检查块的Seq值,仍是0xe。取出前映像,对应5号文件131046块的Slot 1(行2)0列,值为:62 62 62 32,即“bbb2”。回滚链上一块在rdba: ITPUB个人空间8P$|(v D#W$y
ITPUB个人空间`|*~hFe3r;yYg:^
0x03800084,132块中:ITPUB个人空间ws5f W]Agl+a
alter system dump datafile 14 block 132;ITPUB个人空间7L#}.FjS B
找到最后一条回滚记录,它的前映像对应5号文件131046块的Slot 0(行1)0列,值为 61 61 61 31,即“aaa1”,但它并是回滚链头,根据它的Rci  0x02,继ITPUB个人空间}qpO4v

6\dL] o }0 续向上,找到0x02条回滚记录, 它对应对应5号文件131046块的Slot 1(行2)0列,62 62 32,即“bb2”,还没完,再向上,是131046块中Slot 0(行1)0列,
0lzB'Tb3h:`f"T L0 ITPUB个人空间pz:G;I q [(O8EV"}+t/B
61 61 31,即“aa1”,此条回滚记录的Rci已经是0了,已经到了回滚链头,被覆盖的ITL槽是:
P k|L&M0 op: L  itl: xid:  0x0017.003.00000045 uba: 0x03800021.0021.03ITPUB个人空间sF6v:xF
                      flg: C---    lkc:  0     scn: 0x0000.008530fd
9ij Mc7K&v$@)M!pf9aR0 Itl           Xid                  Uba         Flag  Lck        Scn/Fsc
${u3c:E+d3FZ0 0x01   0x001a.010.00000011  0x03800085.000e.01  C---    0  fsc 0x0000.00853185
qL r'I#dN.P0
0x01   0x0017.003.00000045  0x03800021.0021.03  C---    0  fsc 0x0000.008530fd
#R3UC^#b"o0qD9n0 0x02   0x0018.005.0000001a  0x03800072.000e.08  C---    0  scn 0x0000.00853171
+m!FAu)f0
ITPUB个人空间Vt&ica`.YC
Slot 0(行1):61 61 61 61 31         (“aaaa1”)       ITPUB个人空间f e&b~~ GS
Slot 1(行2):62 62 62 62 32         (“bbbb2”)
        ITPUB个人空间"sf2}bu
Slot 0(行1):61 61 31         (“aa1”)         ITPUB个人空间%|/r[b8\;l$M
Slot 1(行2):62 62 32         (“bb2”)        
1p2H4A9[!{0 Slot 2(行3):63                  (“c”)                ITPUB个人空间(v7P2f |w"H:N#Z
查询的SCN是853180,ITL中最大SCN是853171,查询SCN大于ITL中的SCN,说明查询发生在事务后,好了,到此,我们这一次CR块构造完毕。此次生成的131046的
2X)Z.A#[ ij d;o b0 ITPUB个人空间;Q^ `;e E {Y:X
CR块会覆盖步4时生成的,一个块,在一次查询中,只会产生一个CR块。ITPUB个人空间 h7[t|:TSF9XG
根据我们的操作顺序:
6m,y8W [W\k:y0 a->A->A1 A2 B2->aa1->aaa1  aaaa1->aaaaa10->az
3U4uG4w9V f:Sk v^ [ U^0 b->B->B2       ->bb2->bbb2  bbbb2->bbbbb10->byITPUB个人空间W!po u;q#F
                     ↑
e(R2@@3S k s z"GA3P0 我们已经回到了箭头所指处。我们可以一直向前回塑,直到T8的行被插入131046时,或者,回滚段被覆盖时。假若我们又向前回塑,但回滚块的Seq和我们要求的
.GLoB\#K yTE0
])Q*J"w(o)[5B9z0 不一样,证明此块被覆盖了,此时Oracle会报告Ora-01555错误。我们只需让回滚段的区足够多,这样它每次绕回的时间必然加长。这样,回滚段必然可更长时间
G._0q4` d r{0 ITPUB个人空间qaH#JJ
的保持已提交事务的回滚信息。
D+J8}-QYS+uI)F3B0 在X$BH视图中上,有一个CR_SCN_BAS列,显示CR块的最大SCN:ITPUB个人空间+S'^z:Bb
18> select file# ,DBABLK,state, tch ,cr_scn_bas,to_char(cr_scn_bas,'xxxxxxxx') SCN from x$bh ITPUB个人空间UPC"Q{K^
where file#=5 and dbablk=131046;
pW#o&IK3G0      FILE#     DBABLK      STATE      TCH CR_SCN_BAS SCN   
uH\.`8^;] zmY?0 ---------- ---------- ---------- ---------- ---------- --------- -------------------- ---------- ITPUB个人空间a\0yy\bj0G
         5     131046          3          0    8728964    853184 ITPUB个人空间'qX-h;M[T2{y
上面的0x853184就是咯。旁边的8728964是他的10进制值.

TAG:

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

如果是oracle自己,手工构造的意义有多大。
,vT#PDH Ld$vITPUB个人空间
4j/Wq]M_"G^\Xoracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net在坛子看到一篇老文章,很不错。ITPUB个人空间g3^&x/y7Lt&L
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 发表
$J)k
S2Dk%Vx
fITPUB个人空间
关于读一致性,我了解的不多,buffer cache的一个功能就是构造CR块,从而提供读一直性吧,这个构造是oracle自己呢?还是手工?
BDt        e%}6F:joracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net如果是oracle自己,手工构造的意义有多大。
&r$|`+ZhhBITPUB个人空间ZW0TZXK{C
在坛子看到一篇老文章,很不错。
,Y2p@4X,n&kU7x"xspace.itpub.nethttp://www.itpub.net/viewthread. ... p;extra=&page=1
j$v3nOLB6qoracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net8})U6b{3b!@H8z
space.itpub.net
U O8r&_2c2xP[

自己跟踪一次,能更清楚的明白为什么会有01555错误.
蚊子窝 foxmile 发布于2008-02-20 16:58:40
ok。多谢!
晶晶小妹的个人空间 晶晶小妹 发布于2008-02-20 16:59:40
其实通过自己动手做一次实验,就清楚了当select一个有事务的块时,oracle在内部为我们做了什么操作.space.itpub.net$VenF4W(K
我喜欢这种明白的感觉,也想让坛友分享我的感觉.space.itpub.net5akn:Pd \        |
^_^
蚊子窝 foxmile 发布于2008-02-20 17:06:34

QUOTE:

原帖由 晶晶小妹 于 2008-2-20 16:59 发表
F!agn#cD;nspace.itpub.net其实通过自己动手做一次实验,就清楚了当select一个有事务的块时,oracle在内部为我们做了什么操作.
9Hr:qXFs我喜欢这种明白的感觉,也想让坛友分享我的感觉.space.itpub.net{#C1k*O~/Q8N        }
^_^
-`EF}"\]_};?
有道理。实践是最好的老师
烟囱的个人空间 烟囱 发布于2008-02-20 17:42:02
今晚按照小妹的实验重复一次.
9X9daLp wHspace.itpub.net
Y!SXiN'KN*F['@ITPUB个人空间谢谢了啊~
蚊子窝 foxmile 发布于2008-02-20 17:46:02
今天在看书,等看完书,自己动手做一下。
shiri512003的个人空间 shiri512003 发布于2008-02-20 18:19:00
绝知此事要躬行oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net,sk4}Fo
支持一把
玉面飞龙发布于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
差距太遠oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.netD5i_s/yxE$kL
要學的好多啊
bosonmaster的个人空间 bosonmaster 发布于2008-02-21 09:48:12
楼上的那么多福,送我个
晶晶小妹的个人空间 晶晶小妹 发布于2008-02-21 11:42:00

QUOTE:

原帖由 wabjtam123 于 2008-2-21 08:07 发表 space.itpub.net~3^\Qo${W
大鼻子大眼睛美女晶,真棒!
zyOn l
Ioracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net

`2pJ5?Hv@
dITPUB个人空间
ITPUB个人空间0V csnM7c(Q;n1[
俺那疙瘩人都说:大鼻子有福!哈哈ITPUB个人空间
\5BN:\+V F"R

space.itpub.net
L&e%\D'K9D


bartfj的个人空间 bartfj 发布于2008-02-21 11:59:57
太牛了
晶晶小妹的个人空间 晶晶小妹 发布于2008-02-21 18:05:46
大家的支持 就是俺 最大的动力.space.itpub.net-],W9~o'I]C!g/}
|,v;Csn6j+G'atL
请大家的支持来的更猛烈些吧space.itpub.net
\e,YW*E8}U]h


8R@ j,NP lY5_Qspace.itpub.net哈哈
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 发表 oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net6q9AR        Ww0k#zt
请问 cr中index是怎么样的?
space.itpub.net{        KD3NCE!K8D!m
O-LAv4VV xB;b
oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net\*dEw4w#|
Ev

你想了解什么?索引的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槽被记进事务回滚链头部块中,如下所示:@'P"P7Mkmk1w        h
op: L  itl: xid:  0x001a.010.00000011 uba: 0x03800085.000e.01space.itpub.netw(I
Oo$e

                      flg: C---    lkc:  0     scn: 0x0000.00853185
g(f @?6_)?

-------------------------------------------------------------------------------------------------------------------------------]lT{!JV[

F8C4Go!A1|space.itpub.net请教楼主:
&` Q ox"abUL在哪里找到被覆盖的ITL槽信息?
,i0T        t9M2i1OITPUB个人空间在回滚段头块里,没有类似的entry。所谓“事务回滚链头部块”指的是什么呢?
晶晶小妹的个人空间 晶晶小妹 发布于2008-03-01 23:52:12

QUOTE:

原帖由 solearn 于 2008-2-28 10:28 发表 space.itpub.net(c%t&Y%Mj
我们最后在会话10中做的更新,将覆盖131046的一个已提事务的ITL槽,这个被覆盖的ITL槽被记进事务回滚链头部块中,如下所示:
.x c'_L5M)a#w;opspace.itpub.netop: L  itl: xid:  0x001a.010.00000011 uba: 0x03800085.000e.01
,b*y+C^8jf{:S                      flg: C---    lkc:  0     scn: 0x0000.00853185ITPUB个人空间/Z/Q9v5z$dB1q0j8C
]

-------------------------------------------------------------------------------------------------------------------------------space.itpub.netM0VH SK        Sv&K)i
.e]|8oY[i5t
请教楼主:Tn9pt$] dx1E
在哪里找到被覆盖的ITL槽信息? oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net'Z"uQ6ezu
在回滚段头块里,没有类似的entry。所谓“事务回滚链头部块”指的是什么呢?
ITPUB个人空间&I'bI i^MK\&@
oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net5e0j
p~y'p

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

(可选)

日历

« 2010-03-14  
 123456
78910111213
14151617181920
21222324252627
28293031   

数据统计

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

RSS订阅

Open Toolbar