Oracle10g引入了一个新的ORA_ROWSCN的伪列,可以查询表中记录最后变更的SCN。这个新的伪列在某些环境下会非常有用,比如执行乐观锁定,或者增量数据抽取的时候。但是,默认情况下,每行记录的ORA_ROWSCN是基于Block的,除非在建表的时候执行开启行级跟踪(create table … rowdependencies)。

先来简单理解一下ORA_ROWSCN的实现原理。我们知道,每个Block在头部是记录了该block最近事务的SCN的,所以默认情况下,只需要从block头部直接获取这个值就可以了,不需要其他任何的开销,Oracle就能做到这一点。但是这明显是不精确的,一个block中会有很多行记录,每次事务不可能影响到整个block中所有的行,所以这是一个非常不精准的估算值,同一个block的所有记录的ORA_ROWSCN都会是相同的,基本上没有多大的使用价值。

如果在建表的时候开启行级跟踪选项,Oracle则可以为每一行记录精确的SCN,那么显然不能再直接从block头部获取。要获得足够的信息,肯定要付出一定的代价,Oracle必须为每一行实际的存储这个SCN。所以这个行级跟踪的选项,只能在建表的时候指定,而不能通过alter table来修改现有的表,否则需要修改每一行记录的物理存储格式,代价是可想而知的。

简单的做个实验就可以知道开启行级跟踪以后块记录格式的不同。建两个表,一个norowdependencies(默认),一个rowdependencies,然后分别dump出相应的数据块:

create table t1(i int);
insert into t1 values(1);
insert into t1 values(2);
commit;
create table t2 rowdependencies as select * from t1;

norowdependencies

block_row_dump:
tab 0, row 0, @0×1f9a
tl: 6 fb: –H-FL– lb: 0×1 cc: 1
col 0: [ 2] c1 02
tab 0, row 1, @0×1f94
tl: 6 fb: –H-FL– lb: 0×1 cc: 1
col 0: [ 2] c1 03
end_of_block_dump

rowdependencies

block_row_dump:
tab 0, row 0, @0×1f7c
tl: 12 fb: –H-FL– lb: 0×0 cc: 1
dscn 0×0000.00029ae4
col 0: [ 2] c1 02
tab 0, row 1, @0×1f6d
tl: 12 fb: –H-FL– lb: 0×0 cc: 1
dscn 0×0000.00029ae4
col 0: [ 2] c1 03
end_of_block_dump

得到行的SCN后,通过SCN_TO_TIMESTAMP函数可以转化为时间:

SQL>  select SCN_TO_TIMESTAMP(ora_rowscn) from t2 where rownum<2;SCN_TO_TIMESTAMP(ORA_ROWSCN)
---------------------------------------------------------------------------
06-JAN-09 05.31.20.000000000 PM

乐观锁和ORA_ROWSCN
需要select … for update做悲观锁定的时候,通过使用ORA_ROWSCN可以改成乐观锁定。一开始select数据的时候将ORA_ROWSCN查出来,修改后如果要写回数据库之前再比对下最新的ORA_ROWSCN就可以知道这期间数据是否有发生变化。这个Tom在他的大著《Expert Oracle Database Architecture 9i and 10g Programming Techniques and Solutions 》中也是有提到的。

增量数据抽取和ORA_ROWSCN
每次抽取后记录最大的ORA_ROWSCN,下次抽取再基于上一次的SCN来获得最近修改过的数据即可。在10g之前,很多系统要实现增量数据抽取,要么通过解析日志,要么加触发器,要么就在表上加一个时间截字段。ORA_ROWSCN其实就是第三种方式,只是这个字段由Oracle来维护,这样可以避免一些应用绕过时间截去更新其他字段带来的问题。不过,如果系统中使用了逻辑备库或者streams等逻辑复制的方案,而数据抽取又是基于逻辑备库的话,ORA_ROWSCN就可能对抽取后的数据分析有影响了,因为通过这个得到的时间是逻辑备库上记录变更的时间,而不是源库的时间了。当然,如果纯粹只是做数据抽取,而不需要使用这个时间来做分析,还是问题不大的,但还是要考虑一旦逻辑备库出现故障需要重做的,则这个增量抽取要怎么来处理的问题。

Metalink上搜一下ORA_ROWSCN可以看到不少相关的bug,所以在生产系统中使用的时候要小心。例如,我在Linux64平台上的一台测试库中,执行以下语句就会碰到ORA-07445的错误:

SQL> select ora_rowscn from x$bh where rownum<2;
select ora_rowscn from x$bh where rownum<2
*
ERROR at line 1:
ORA-03113: end-of-file on communication channelORA-07445: exception encountered: core dump [qkafix()+212]
[SIGSEGV] [Address not mapped to object] [0x000000004] [] []

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

转载于:http://blog.itpub.net/1384/viewspace-611242/

[ 江枫]关于ORA_ROWSCN相关推荐

  1. 袋鼠云CTO宁海元(花名江枫)在2018杭州云栖大会袋鼠云数据智能专场 演讲内容...

    袋鼠云从去年开始提出数据智能的理念,已经被越来越多的企业所认同.我认为,数据智能需要分成两部分来看,一部分叫做数据中台,打造企业在数据底层基础建设的能力:另外一部分是基于数据中台,和不同行业和企业客户 ...

  2. 伏威谈淘宝网的高并发处理与压力测试(转)

     其实到现在为止距离淘宝双十一事件已经过去蛮多天了,但在整个技术圈里面大家还是津津乐道.我这次在采访之前在和一些网友做沟通的时候,他们也提出了非常多非常有意思的问题,包括一些高并发的,一些压力测试的等 ...

  3. 【自由随想录(一)】

    决定要向阮一峰老师学习,在我的博客里记录自己的所见所闻.以便日后自己可以回头看看或复习. 书摘 如果你渴望得到某样东西,你得让它自由,如果它回到你身边,它就是属于你的,如果它不会回来,你就从未拥有过它 ...

  4. 网红咖啡店的最后一晚:五道口的罗曼蒂克如何消亡

    中新网客户端北京1月15日电 题:五道口罗曼蒂克消亡史 记者 宋宇晟 最后一晚的"雕刻时光".宋宇晟 摄 "你好,我要一杯拿铁." 一切如常,没有排队,只是来喝 ...

  5. 十年前,他如何自学技术进阿里?

    阿里妹导读:最近,阿里妹经常收到在校大学童鞋的留言,询问如何加入阿里巴巴.今天,阿里妹邀请了阿里云高级DBA专家玄惭,讲述十年前通过校招加入阿里的经历和心得,希望对大家有所帮助(注:文末有小惊喜). ...

  6. 云市场合作伙伴-袋鼠云获A轮融资,成立一年半获三轮投资超亿元

    创投市场再次风起.2017年7月,袋鼠云宣布,获得来自戈壁创投主投.元璟资本跟投的A轮融资,相对于当前冷淡的投资市场,此举也再次引发了行业对大数据.云计算技术创新企业的关注.据袋鼠云CEO陈吉平(花名 ...

  7. 阿里技术专家玄惭回忆:我是如何自学技术拿到阿里offer

    摘要:一年一度的校园实习招聘马上开始了,最近接触了几个找工作的应届生同学,回想当年自己找工作的时候,也是遇到了很多好心人,所以心中一直想写一篇回忆以前经历的文章,算是对自己有一个交代,也希望能够帮助到 ...

  8. 计算机趣味知识竞赛策划书,计算机趣味知识竞赛活动策划书.doc

    计算机趣味知识竞赛活动策划书 计算机趣味知识竞赛活动策划书 一.活动背景及目的: 为了提高我校同学们的学习积极性,在加强计算机基础知识学习的同时,营造一种浓厚的学习氛围,能较好地发挥学生的特长,丰富学 ...

  9. 袋鼠云数据中台专栏(五):数栈,企业级一站式数据中台PaaS

    本文作者:江枫 袋鼠云CTO,花名江枫,本名宁海元. 2007年加入淘宝,曾是双十一大促技术指挥部成员,"去IOE"数据库负责人. 打造过千亿级实时日志平台.手机淘宝日志分析创始人 ...

  10. 苏州园林年卡 办理与使用 附 苏州园林门票价格

    别人帮我办理了一个苏州园林卡,可是我自己却一直对它的使用风景区不知道.终于找到了一个公告. 为加强对古典园林.风景名胜区特别是世界文化遗产的保护和管理,同时满足本市居民和长期在苏工作学习者游览的需要, ...

最新文章

  1. 软件测试艺术一:程序正确性证明
  2. 瘫痪小姐姐“自主”行走视频火了,曾借助轮椅完成舞蹈表演,网友:灵魂是战士...
  3. 华为2016年应届毕业生招聘公告
  4. Python数据结构与算法(第二天)
  5. [c、c++]宏中#和##的用法(zz)
  6. Kubernetes二进制部署——证书的制作和ETCD的部署
  7. python爬虫php_PHP爬虫编写
  8. 浅谈前端实现页面加载进度条以及 nprogress.js 的实现
  9. Apache NetBeans?
  10. python实现规则引擎_python – 如何在不使用eval()或exec()的情况下创建规则引擎?...
  11. Emscripten 单词_人教版英语八年级上册听力(单词+课文) 朗读录音听力mp3音频电子课本(完整版)...
  12. 移动侦测/周界入侵检测视频录像如何通过国标GB28181协议视频平台EasyGBS进行弹出告警
  13. Android闹钟TimePicker,android – TimePicker getHours(),API 15中的getMinutes
  14. 盛金公式解一元三次方程_一元三次方程解法(卡尔丹公式法盛金公式法)
  15. Windows 11 配置Java 环境变量
  16. 锤子手机T1发布:售价3000元起 7月初上市
  17. 中国移动、天猫都在用的区块链抽奖,了解一下?
  18. 无力吐槽的 create-shortcut .exe
  19. 截图转换为gif动图,gif动图制作
  20. 重复图案排版_8个免费图案发生器,用于创建重复的图案背景

热门文章

  1. Ubuntu环境下XAMP安装PHP的rabbitmq扩展
  2. 宝塔面板+小鸟云服务器+wordpress建站使用
  3. 修改植物大战僵尸游戏存档相关知识
  4. linux关于系统管理、系统安全命令
  5. marxico马克飞象
  6. 苹果中国全系降价:iphone最高降500元,用户可退差价
  7. HDOJ 1164 Eddy's research I(拆分成素数因子)
  8. linux中括号的用法,全面梳理linux下shell中各种括号的作用和用法
  9. php 自适应 博客,三种方法让网站背景自动适应各浏览器大小
  10. 小码哥C++_反汇编分析