表使用的数据块在事务未提交及提交且强制刷新缓冲池的itl条目变化之系列一...

结论

1,未提交事务前数据块的ITL会保存旧表的ITL条目信息,且其ITL条目的FLAG为U,表明快速清除
2,快速清除的概念还不太理解,将于另一文章进行测试
3,已提交事务的数据块,且此数据块仍在缓冲池,其ITL条目不会发生变化
4,只要已提交事务的数据块不在缓冲池,重从磁盘读入缓冲池,其ITL条目才会发生变化,FLAG及LCK和SCN/CSC会发生变化
   其中FLAG由空变成了C,且LCK由1变成0,SCN/CSC由空变成有值
   而ITL的XID及UBA没有变化
5,ITL条目相关列含义请见下述第7   

引发新问题

1,itl条目何时可以重用呢?标准是什么?
2,快速清除及延迟块清除的区别及概念各是什么?

测试

1,数据库版本
oracle 11.2.0.1


2,创建测试表并插入数据不提交,查看数据块


SQL> create table t_clean(a int);


Table created.


SQL> insert into t_clean values(1);


1 row created.




SQL> select object_name,object_id from user_objects where object_name='T_CLEAN';


OBJECT_NAME                                         OBJECT_ID
-------------------------------------------------- ----------
T_CLEAN                                                 74434




SQL>  select DBMS_ROWID.ROWID_RELATIVE_FNO(ROWID),DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID) from t_clean;


DBMS_ROWID.ROWID_RELATIVE_FNO(ROWID) DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID)
------------------------------------ ------------------------------------
                                   4                                98974




SQL> alter session set tracefile_identifier='session2_uncommit';


Session altered.


SQL> alter system dump datafile 4 block 98974;


System altered.


数据块scn
scn: 0x0000.00b3db1a seq: 0x01 flg: 0x06 tail: 0xdb1a0601


之前旧表的对象信息
  dbwrid: 0 obj: 74434 objn: 74434 tsn: 4 afn: 4 hint: f
  obj-flags: object_ckpt_list
  ckptq: [0xa9fa1158,0xacfdcae8] fileq: [0xda7259c0,0xacfdcaf8] objq: [0xb0fc8c88,0xb9f7b008]
 Object id on Block? Y
 seg/obj: 0x12223  csc: 0x00.b3d917  itc: 2  flg: E  typ: 1 - DATA






ITL信息
 Itl           Xid                  Uba         Flag  Lck        Scn/Fsc
0x01   0x0040.021.0000062e  0x01400148.013c.04  --U-  484  fsc 0x0000.00b3db1a
0x02   0x0000.000.00000000  0x00000000.0000.00  ----    0  fsc 0x0000.00000000                                   
可见flag标记为u,lck为484








3,提交,查看数据块
SQL> commit;


Commit complete.


数据块scn,较前已变化
scn: 0x0000.017aefd6 seq: 0x03 flg: 0x04 tail: 0xefd60603


较前,表对象只保存当前测试表t_clean信息
  dbwrid: 0 obj: 74434 objn: 74434 tsn: 4 afn: 4 hint: f
  obj-flags: object_ckpt_list
  ckptq: [0xda728b60,0xda728b60] fileq: [0xda7259c0,0xda7259c0] objq: [0xd2817110,0xd2817110]
 Object id on Block? Y
 seg/obj: 0x122c2  csc: 0x00.17aefd6  itc: 2  flg: E  typ: 1 - DATA


 itl信息
  Itl           Xid                  Uba         Flag  Lck        Scn/Fsc
0x01   0x009c.014.00000844  0x01c00094.01f2.25  ----    1  fsc 0x0000.00000000
0x02   0x0000.000.00000000  0x00000000.0000.00  ----    0  fsc 0x0000.00000000
较前,flag有变化,成空,xid及uba和lck全变化了,变成当前测试表的事务信息


这个时侯按理说事务已提交,应清除ITL的条目信息,我想不清除的原因,一是考虑到性能,假如某个DML事务非常大,在提交时,可能有些数据块已经从缓冲池刷新到磁盘中,这块如果清除ITL条目,
势必要从磁盘重读这些数据块到缓冲池,加大IO压力
二者考虑到构建一致性查询,因为表的数据会由不同的DML会话或查询会话同时并发修改,你查询某个数据块信息时,可能其它会话正在进行DML变更,所以要从数据块的UBA中获取数据块的镜镜像,构建
刚开始运行查询SCN哪个时间点对应的数据块内容




4,在其它会话查询表,查看数据块
SQL> select * from t_clean;


         A
----------
         1
数据块SCN,较前未变化
scn: 0x0000.017aefd6 seq: 0x03 flg: 0x04 tail: 0xefd60603


较前,表对象没有变化
  dbwrid: 0 obj: 74434 objn: 74434 tsn: 4 afn: 4 hint: f
  obj-flags: object_ckpt_list
  ckptq: [0xda728b60,0xda728b60] fileq: [0xda7259c0,0xda7259c0] objq: [0xd2817110,0xd2817110]
 Object id on Block? Y
 seg/obj: 0x122c2  csc: 0x00.17aefd6  itc: 2  flg: E  typ: 1 - DATA




itl信息
 Itl           Xid                  Uba         Flag  Lck        Scn/Fsc
0x01   0x009c.014.00000844  0x01c00094.01f2.25  ----    1  fsc 0x0000.00000000
0x02   0x0000.000.00000000  0x00000000.0000.00  ----    0  fsc 0x0000.00000000
较前,没有变化


可见事务提交后运行SQL查询,数据块ITL的条目信息不会发生变化


5,产生一个事务不提交,查看数据块
SQL> update t_clean set a=38;


1 row updated.


数据块scn,较前未变化
scn: 0x0000.017aefd6 seq: 0x03 flg: 0x04 tail: 0xefd60603


较前,表对象没有变化
  dbwrid: 0 obj: 74434 objn: 74434 tsn: 4 afn: 4 hint: f
  obj-flags: object_ckpt_list
  ckptq: [0xb3fc2428,0xb2fc8458] fileq: [0xda7259c0,0xda7259c0] objq: [0xd2817110,0xd2817110]
  dbwrid: 0 obj: 74434 objn: 74434 tsn: 4 afn: 4 hint: f
  ckptq: [NULL] fileq: [NULL] objq: [NULL]
 Object id on Block? Y
 seg/obj: 0x122c2  csc: 0x00.17aefd6  itc: 2  flg: E  typ: 1 - DATA


itl信息
 Itl           Xid                  Uba         Flag  Lck        Scn/Fsc
0x01   0x009c.014.00000844  0x01c00094.01f2.25  ----    1  fsc 0x0000.00000000
0x02   0x0000.000.00000000  0x00000000.0000.00  ----    0  fsc 0x0000.00000000


可见ITL条目未变化


6,强制刷新缓冲池,查看数据块
数据块scn,较前有变化
scn: 0x0000.017c8536 seq: 0x01 flg: 0x04 tail: 0x85360601 


较前,表对象无变化
  dbwrid: 0 obj: 74434 objn: 74434 tsn: 4 afn: 4 hint: f
  ckptq: [NULL] fileq: [NULL] objq: [NULL]
  dbwrid: 0 obj: 74434 objn: 74434 tsn: 4 afn: 4 hint: f
  ckptq: [NULL] fileq: [NULL] objq: [NULL]
 seg/obj: 0x122c2  csc: 0x00.17c8525  itc: 2  flg: E  typ: 1 - DATA


itl信息
 Itl           Xid                  Uba         Flag  Lck        Scn/Fsc
0x01   0x009c.014.00000844  0x01c00094.01f2.25  C---    0  scn 0x0000.017b726d
0x02   0x009b.016.0000085f  0x01c00086.01ec.20  ----    1  fsc 0x0000.00000000


可见此时itl条目发生了变化,其中xid及uba没有变化,而flag由空变成c,lck标记已经由1变成了0,且scn/fsc也发生了变化,由空变成了某个非空的数值
同时上述新增的UPDATE事务分配在第2个ITL条目中


7,摘录下上述itl条目的相关列的含义
flag:事务标志位;
       有几个值:
          ----- 表示事务是活动的,或块清除前提交事务
          C---- 事务已提交并且清除了行锁定
          -B---  this undo record contains the undo for this ITL entry
          -U--  事务已提交(scn已是最大值),但锁定未清除(快速清除)         
          ---T  当块清除的scn被记录时,该事务仍是活动的,块上如果有已提交的事务
          那么在clean out时,块会被清除,但块里面的事务不会被清除
          
lock:影响的记录数
scn/fsc:快速提交(fast commit)的scn或commit scn

个人简介


8年oracle从业经验,具备丰富的oracle技能,目前在国内北京某专业oracle服务公司从事高级技术顾问。
服务过的客户:
中国电信
中国移动
中国联通
中国电通
国家电网
四川达州商业银行
湖南老百姓大药房
山西省公安厅
中国邮政
北京302医院     
河北廊坊新奥集团公司

 项目经验:
中国电信3G项目AAA系统数据库部署及优化
      中国联通4G数据库性能分析与优化
中国联通CRM数据库性能优化
中国移动10086电商平台数据库部署及优化
湖南老百姓大药房ERR数据库sql优化项目
四川达州商业银行TCBS核心业务系统数据库模型设计和RAC部署及优化
四川达州商业银行TCBS核心业务系统后端批处理存储过程功能模块编写及优化
北京高铁信号监控系统RAC数据库部署及优化
河南宇通客车数据库性能优化
中国电信电商平台核心采购模块表模型设计及优化
中国邮政储蓄系统数据库性能优化及sql优化
北京302医院数据库迁移实施
河北廊坊新奥data guard部署及优化
山西公安厅身份证审计数据库系统故障评估
国家电网上海灾备项目4 node rac+adg 
       贵州移动crm及客服数据库性能优化项目
       贵州移动crm及客服务数据库sql审核项目
       深圳穆迪软件有限公司数据库性能优化项目

联系方式:
手机:18201115468
qq   :   305076427
qq微博: wisdomone1
新浪微博:wisdomone9
qq群:275813900    
itpub博客名称:wisdomone1    http://blog.itpub.net/9240380/

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

转载于:http://blog.itpub.net/9240380/viewspace-1815367/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值