`
my_ora
  • 浏览: 28483 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

关于ora_rowscn

阅读更多
关于oraclerowscn,早做增量数据抽取的时候可能会用到,但这它确实非常的好用。
一下是我查询的一些关于ORA_ROWSCN的一些资料:
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, @0x1f9a
tl: 6 fb: –H-FL– lb: 0×1 cc: 1
col 0: [ 2] c1 02
tab 0, row 1, @0x1f94
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, @0x1f7c
tl: 12 fb: –H-FL– lb: 0×0 cc: 1
dscn 0×0000.00029ae4
col 0: [ 2] c1 02
tab 0, row 1, @0x1f6d
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 channel

ORA-07445: exception encountered: core dump [qkafix()+212]
[SIGSEGV] [Address not mapped to object] [0x000000004] [] []
分享到:
评论

相关推荐

    ORA_ROWSCN伪列在Oracle历史数据迁移中的应用研究.pdf

    ORA_ROWSCN伪列在Oracle历史数据迁移中的应用研究 Oracle数据库系统中,数据迁移是不可避免的,特别是在大型企业中,数据库系统的数据量会随着时间的推移不断增长。为了解决这个问题,Oracle提供了多种数据迁移...

    ORACLE中查找定位表最后DML操作的时间小结

    1:使用ORA_ROWSCN伪列获取表最后的DML时间  ORA_ROWSCN伪列是Oracle 10g开始引入的,可以查询表中记录最后变更的SCN。然后通过SCN_TO_TIMESTAMP函数可以将SCN转换为时间戳,从而找到最后DML操作时SCN的对应时间。...

    用Oracle 10g新的行时间戳捕捉变化

    Oracle 10g引入了一项新特性,即`ORA_ROWSCN`伪列,这是一个非常有用的工具,尤其对于数据仓库的维护和跟踪数据变化。在传统的数据库管理中,要跟踪行的变化,通常需要在表中添加一个“最后更新时间”列,并在每次...

    ora_convert_mysql.tar.gz

    标题“ora_convert_mysql.tar.gz”表明这是一个用于转换Oracle数据库数据的工具,以便它们可以在MySQL数据库中使用的压缩包。描述提到,这是一个由个人编写的shell脚本,它能够生成在MySQL中执行的INSERT语句,这...

    orcl_ora_2035.trc

    http://blog.csdn.net/bjchangxiao/article/details/68489880

    ora_dbbak.rar_oracle

    本压缩包"ora_dbbak.rar_oracle"包含了与Oracle RMAN加密备份和恢复相关的脚本文件"ora_dbbak.sh",这将帮助我们了解如何安全地管理和保护Oracle数据库的数据。 首先,我们要理解RMAN的基本用法。RMAN通过与数据库...

    ORA_12514错误解决方法

    关于ORA_12514错误的详细解决办法

    ora_错误代码

    "ora_错误代码"是我们讨论的重点,这代表了Oracle数据库在运行时遇到的问题。 Oracle错误代码是由"ORA-"开头的一串数字组成,比如"ORA-00001"、"ORA-01422"等。每一个这样的代码都对应着一个特定的错误信息,帮助...

    ora_migrator:从Oracle到PostgreSQL迁移的工具

    ora_migrator为插件使用迁移Oracle数据库到PostgreSQL。 请阅读db_migrator文档以获取用法说明。 本自述文件仅涵盖插件的安装和设置以及常规文档中未涉及的其他功能。 除此之外, ora_migrator还提供了从Oracle到...

    inceptor_ora_template_f2_append.sql

    inceptor_ora_template_f2_append.sql

    Ora_10G_DBA_Reference

    《Ora_10G_DBA_Reference》是一个关于Oracle 10g数据库管理的重要参考资料,主要面向DBAs(数据库管理员)和技术人员,旨在提供全面、深入的Oracle 10g数据库管理和维护知识。该资源包含两个文件:一本CHM格式的手册...

    navicat112_ora_en_x64.exe

    navicat112_ora_en_x64.exe

    ora_error大全.doc

    `ora_error大全.doc`文件显然包含了Oracle数据库所有可能的错误编号及其解释,这对于数据库管理员和开发人员来说是非常有价值的参考资源。 错误代码如ORA-12001到ORA-12053,代表了Oracle数据库在执行操作时遇到的...

    ora_单行函数.sql

    ora_单行函数.sql

    ora_orad.sql

    ora_orad.sql

    navicat091_ora_cs

    navicat091_ora_cs for oracle 开发工具racle 数据库管理工具,它可以将 DBF, CSV, XML 和其他普遍的数据格式加入到 Oracle 数据库中,消除了耗时的数据输入和与之相伴的错误。除此之外,它还包括导入、导出向导、...

    sap_ora_adm

    根据提供的文件信息,我们深入探讨“sap_ora_adm”这一主题,即SAP系统与Oracle数据库的管理。 ### SAP与Oracle的整合 #### 1. **SAP NetWeaver 04** SAP NetWeaver是SAP公司推出的一系列集成技术平台之一,旨在...

    一款简单的ORM,简单易用,开发成本极低,该orm支持.net_4.0以上版本,支持多数据库,Ora_SimpleOrm.zip

    一款简单的ORM,简单易用,开发成本极低,该orm支持.net_4.0以上版本,支持多数据库,Ora_SimpleOrm

    ora_trunc_table.sh

    linux 下 shell 连接 oracle 数据库...脚本产生的背景是生产服务器每天产生几万笔数据,使用的数据库是oralceXE,当数据文件超过4G,会提示错误ORA-12953。因此需要调整数据库中部分表,日志表,部分数据,或者数据文件

Global site tag (gtag.js) - Google Analytics