[20160529]快速提交的一个疑问3.txt

[20160529]快速提交的一个疑问3.txt

--链接 http://blog.itpub.net/267265/viewspace-2108017/

--在上一次链接里面提到在快速提交时,itl槽的_ktbitun._ktbitfsc记录是dml记录长度减少的长度.
--如果清除后,会kdbh.kdbhavsp相加写回kdbh.kdbhavsp,以前一直对快速提交没有很好的理解,我一直以为会清除数据信息里面的lock,实
际上在下次ITL覆盖时清除,还是通过一个例子来说明:

1.环境:
SCOTT@test01p> @ ver1
PORT_STRING                    VERSION        BANNER                                                                               CON_ID
------------------------------ -------------- -------------------------------------------------------------------------------- ----------
IBMPC/WIN_NT64-9.1.0           12.1.0.1.0     Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production              0

--家里只有12c,而且还是windows的版本.

create table t ( id number ,text varchar2(200)) segment creation immediate;
insert into t select rownum ,lpad('a',50,'a') from dual connect by level<=4;
commit ;

SCOTT@test01p> select ora_rowscn,rowid,t.id from t;
ORA_ROWSCN ROWID                      ID
---------- ------------------ ----------
  22661664 AAAZpJAAJAAAACNAAA          1
  22661664 AAAZpJAAJAAAACNAAB          2
  22661664 AAAZpJAAJAAAACNAAC          3
  22661664 AAAZpJAAJAAAACNAAD          4

SCOTT@test01p> @ rowid AAAZpJAAJAAAACNAAA
    OBJECT       FILE      BLOCK        ROW DBA                  TEXT
---------- ---------- ---------- ---------- -------------------- ----------------------------------------
    105033          9        141          0 9,141                alter system dump datafile 9 block 141 ;

SCOTT@test01p> alter  system checkpoint ;
System altered.

SCOTT@test01p> alter system dump datafile 9 block 141 ;
System altered.

2.检查转储:
Block header dump:  0x0240008d
Object id on Block? Y
seg/obj: 0x19a49  csc: 0x00.159ca1f  itc: 2  flg: E  typ: 1 - DATA
     brn: 0  bdba: 0x2400088 ver: 0x01 opc: 0
     inc: 0  exflg: 0
 
Itl           Xid                  Uba         Flag  Lck        Scn/Fsc
0x01   0x000a.021.00005ad1  0x01400506.0549.0c  --U-    4  fsc 0x0000.0159ca20
0x02   0x0000.000.00000000  0x00000000.0000.00  ----    0  fsc 0x0000.00000000

--//可以发现ITL=0x01 ,快速提交,Lck=4有4条记录.

3.修改记录看看:
update t set text=lpad('A',35,'A') where id=1;
commit;

alter  system checkpoint ;
alter system dump datafile 9 block 141 ;

--//检查转储:
Block header dump:  0x0240008d
Object id on Block? Y
seg/obj: 0x19a49  csc: 0x00.159ca99  itc: 2  flg: E  typ: 1 - DATA
     brn: 0  bdba: 0x2400088 ver: 0x01 opc: 0
     inc: 0  exflg: 0
 
Itl           Xid                  Uba         Flag  Lck        Scn/Fsc
0x01   0x000a.021.00005ad1  0x01400506.0549.0c  C---    0  scn 0x0000.0159ca20
0x02   0x000f.01c.00000271  0x0140037a.00bd.07  --U-    1  fsc 0x000f.0159ca9b

--//注意看fsc 前面部分 0x000f.
--//可以发现itl=0x01的flag=C---, Lck=0.
--//通过bbed观察也是一样:
BBED> p *kdbr[1]
rowdata[99]
-----------
ub1 rowdata[99]                             @8017     0x2c

BBED> x /rncc
rowdata[99]                                 @8017
-----------
flag@8017: 0x2c (KDRHFL, KDRHFF, KDRHFH)
lock@8018: 0x00
cols@8019:    2

col    0[2] @8020: 2
col   1[50] @8023: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

--//可以发现lock=0x00,已经清除.

BBED> p kdbh
struct kdbh, 14 bytes                       @100
   ub1 kdbhflag                             @100      0x00 (NONE)
   b1 kdbhntab                              @101      1
   b2 kdbhnrow                              @102      4
   sb2 kdbhfrre                             @104     -1
   sb2 kdbhfsbo                             @106      26
   sb2 kdbhfseo                             @108      7818
   b2 kdbhavsp                              @110      7834
   b2 kdbhtosp                              @112      7849

4.继续测试:
--//如果我再次修改id=1的记录.应该会使用itl=0x01,因为修改记录都是id=1的记录,这样itl=0x02的槽会清除,flag会改为c,lck=0.

测试看看:

update t set id=1 where id=1;
commit ;
alter  system checkpoint ;
alter system dump datafile 9 block 141 ;

Block header dump:  0x0240008d
Object id on Block? Y
seg/obj: 0x19a49  csc: 0x00.159cce9  itc: 2  flg: E  typ: 1 - DATA
     brn: 0  bdba: 0x2400088 ver: 0x01 opc: 0
     inc: 0  exflg: 0
 
Itl           Xid                  Uba         Flag  Lck        Scn/Fsc
0x01   0x0005.00c.00005b0e  0x014009b4.05a4.2b  --U-    1  fsc 0x0000.0159ccf4
0x02   0x000f.01c.00000271  0x0140037a.00bd.07  C---    0  scn 0x0000.0159ca9b

--//可以itl=0x02的信息已经清除,改为提交,lck=0. scn的前面部分变成了0.
--//通过bbed观察:

BBED> p kdbh
struct kdbh, 14 bytes                       @100
   ub1 kdbhflag                             @100      0x00 (NONE)
   b1 kdbhntab                              @101      1
   b2 kdbhnrow                              @102      4
   sb2 kdbhfrre                             @104     -1
   sb2 kdbhfsbo                             @106      26
   sb2 kdbhfseo                             @108      7818
   b2 kdbhavsp                              @110      7849
   b2 kdbhtosp                              @112      7849

--//kdbhavsp 增加 15. 7834+15=7849

--总结:
--主要是通过测试理解一些细节性的东西.

时间: 2024-07-29 06:42:20

[20160529]快速提交的一个疑问3.txt的相关文章

[20160528]快速提交的一个疑问2.txt

[20160528]快速提交的一个疑问2.txt --链接 http://blog.itpub.net/267265/viewspace-2108017/ --在上一次链接里面提到在快速提交时,itl槽的_ktbitun._ktbitfsc记录是dml记录长度减少的长度. --如果清除后,会kdbh.kdbhavsp相加写回kdbh.kdbhavsp,这样就很容易联想到另外的问题,如果修改记录长度增加呢? --会出现什么情况呢?还是通过例子来说明: 1.环境: SCOTT@test01p> @

[20160527]快速提交的一个疑问.txt

[20160527]快速提交的一个疑问.txt --这个是我前几天恢复update没有加where条件的恢复,记录不多,但是我发现一个"奇怪"的问题,或者讲我以前没有注意的问题, --我在itpub上问了,没人解答.链接http://www.itpub.net/thread-2060064-1-2.html Block header dump:  0x0180239c Object id on Block? Y seg/obj: 0x1da20  csc: 0x03.8fc12309 

[20170407]关于增量检查点的一个疑问.txt

[20170407]关于增量检查点的一个疑问.txt --//oracle现在写脏块基本采用增量检查点,除非执行alter system checkpoint,或者shutdown immediate(normal)正常关闭数据库. --//别人的疑问,如果如果写增量检查点时,current log tail at RBA=Incremental checkpoint up to RBA时,如下情况 1.环境: SYS@book> @ &r/ver1 PORT_STRING         

[20170515]数据库启动的一个疑问.txt

[20170515]数据库启动的一个疑问.txt --//别人问的问题我自己以前也没有注意,做一个记录. 1.环境: SYS@book> startup   mount ORACLE instance started. Total System Global Area  634732544 bytes Fixed Size                  2255792 bytes Variable Size             197133392 bytes Database Buffe

algorithm-关于leetcode上的Implement Strstr()的一个疑问

问题描述 关于leetcode上的Implement Strstr()的一个疑问 问题 : https://oj.leetcode.com/problems/implement-strstr/ 我的解答: int strStr(char *haystack, char *needle) { if (!*needle) return 0; if (!*haystack) return -1; char* ph, *pn; ph = haystack; for (int i = 0;*ph; ++i

spring-关于Spring的事务传播性的一个疑问

问题描述 关于Spring的事务传播性的一个疑问 大家好,问个关于事务的传播性的问题.假设 ServiceA.methodB 设置了 PROPAGATION_REQUIRED,但 ServiceC.methodD 没有设置 事务的传播性,那么当 ServiceA.methodB 调用 ServiceC.methodD 时,methodD 对数据库操作如 insert或update 会随着 ServiceA.methodB 一起提交吗? 解决方案 没有的话就没有,不会使用当前已有的事物,,所以不会

关于html中hidden的一个疑问

问题描述 关于html中hidden的一个疑问 https://www.nowcoder.com/ta/front-end-interview/review?page=4 在html中,常用的hidden="hidden"算不算第二种? 如果算是第二种,第二种说隐藏后仍会保留空间, 准确的答案应该是保留空间后,各个元素会合拢吧 我觉得答案说了一半 解决方案 当html元素被设置为display:none;后,浏览器不会解析该元素,"none"就是没有,消失了,所以他

[20171204]关于rman备份疑问4.txt

[20171204]关于rman备份疑问4.txt --//上午排除我几天在做rman测试的疑问. --//链接如下:http://blog.itpub.net/267265/viewspace-2148029/ --//顺便测试备份集包含5个数据文件的情况(本来不想做,还是做看看),验证自己的判断是否正确. 1.环境: SCOTT@book> @ &r/ver1 PORT_STRING                    VERSION        BANNER -----------

[20150113]系统管理表空间的疑问2.txt

[20150113]系统管理表空间的疑问2.txt --昨天探究系统管理表空间位图区分布的问题. --自己得到一些结论: http://blog.itpub.net/267265/viewspace-1399275/ 总结: 1.使用系统管理表空间,位图区不仅仅在块开始的2-8块(10g).11g没有问题,因为11g数据文件前面128块保留. 2.位图区除了位图信息,还有其他一些信息. 3.如果前面的位图区不够满足需要,从block=2的tail+1作为位图区 4.如果数据文件改变大小,如果尾部