ORA_ROWSCN

这是一个非常重要的特性。从oracle10g开始,oracle在表上引入了一个伪列ORA_ROWSCN。该列记录了每一列最后更改的SCN。但是有两种模式,一种是默认的是data block级别,另一种是row级别,需要在建立表的时候指定ROWDEPENDENCIES,而且不能在表创建后用alter table语句去更改。

我们知道默认情况下SCN存储在data block的头部。这里记载的是该data block的最新更改的SCN。所以默认情况下,你去查一个表的ORA_ROWSCN,同数据块的值是相同的。如下:

SQL> create table test (id number,val char(2000));
SQL> insert into test(id , val) select rownum,object_name from dba_objects where rownum<20;
SQL> select id , dbms_rowid.rowid_block_number(ROWID),ora_rowscn,scn_to_timestamp(ora_rowscn) from test;

        ID DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID) ORA_ROWSCN SCN_TO_TIMESTAMP(ORA_ROWSCN)
---------- ------------------------------------ ---------- ---------------------------------------------------------------------------
         1                                60754     618028 08-AUG-14 03.40.58.000000000 PM
         2                                60754     618028 08-AUG-14 03.40.58.000000000 PM
         3                                60754     618028 08-AUG-14 03.40.58.000000000 PM
         4                                60755     618028 08-AUG-14 03.40.58.000000000 PM
         5                                60755     618028 08-AUG-14 03.40.58.000000000 PM
         6                                60755     618028 08-AUG-14 03.40.58.000000000 PM
         7                                60756     618028 08-AUG-14 03.40.58.000000000 PM
         8                                60756     618028 08-AUG-14 03.40.58.000000000 PM
         9                                60756     618028 08-AUG-14 03.40.58.000000000 PM
        10                                60757     618028 08-AUG-14 03.40.58.000000000 PM
        11                                60757     618028 08-AUG-14 03.40.58.000000000 PM
        12                                60757     618028 08-AUG-14 03.40.58.000000000 PM
        13                                60758     618028 08-AUG-14 03.40.58.000000000 PM
        14                                60758     618028 08-AUG-14 03.40.58.000000000 PM
        15                                60758     618028 08-AUG-14 03.40.58.000000000 PM
        16                                60759     618028 08-AUG-14 03.40.58.000000000 PM
        17                                60759     618028 08-AUG-14 03.40.58.000000000 PM
        18                                60759     618028 08-AUG-14 03.40.58.000000000 PM
        19                                60760     618028 08-AUG-14 03.40.58.000000000 PM

上面是准备工作,创建一个表,该表有多个数据块,接下来我们把id=18这一列update看一下结果。

SQL> update test set id=118 where id=18;

1 row updated.

SQL> select id , dbms_rowid.rowid_block_number(ROWID),ora_rowscn,scn_to_timestamp(ora_rowscn) from test;

        ID DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID) ORA_ROWSCN SCN_TO_TIMESTAMP(ORA_ROWSCN)
---------- ------------------------------------ ---------- ---------------------------------------------------------------------------
         1                                60754     618028 08-AUG-14 03.40.58.000000000 PM
         2                                60754     618028 08-AUG-14 03.40.58.000000000 PM
         3                                60754     618028 08-AUG-14 03.40.58.000000000 PM
         4                                60755     618028 08-AUG-14 03.40.58.000000000 PM
         5                                60755     618028 08-AUG-14 03.40.58.000000000 PM
         6                                60755     618028 08-AUG-14 03.40.58.000000000 PM
         7                                60756     618028 08-AUG-14 03.40.58.000000000 PM
         8                                60756     618028 08-AUG-14 03.40.58.000000000 PM
         9                                60756     618028 08-AUG-14 03.40.58.000000000 PM
        10                                60757     618028 08-AUG-14 03.40.58.000000000 PM
        11                                60757     618028 08-AUG-14 03.40.58.000000000 PM
        12                                60757     618028 08-AUG-14 03.40.58.000000000 PM
        13                                60758     618028 08-AUG-14 03.40.58.000000000 PM
        14                                60758     618028 08-AUG-14 03.40.58.000000000 PM
        15                                60758     618028 08-AUG-14 03.40.58.000000000 PM
        16                                60759     618028 08-AUG-14 03.40.58.000000000 PM
        17                                60759     618028 08-AUG-14 03.40.58.000000000 PM
       118                                60759     618028 08-AUG-14 03.40.58.000000000 PM
        19                                60760     618028 08-AUG-14 03.40.58.000000000 PM

19 rows selected.

现在还没有commit。但是按照猜想这60759这个数据块对应的列的SCN都应该变了。不过实际没有变,不知道为什么,需要再研究,不过我们commit一下就会变了。

SQL> commit;

Commit complete.

SQL> select id , dbms_rowid.rowid_block_number(ROWID),ora_rowscn,scn_to_timestamp(ora_rowscn) from test;

        ID DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID) ORA_ROWSCN SCN_TO_TIMESTAMP(ORA_ROWSCN)
---------- ------------------------------------ ---------- ---------------------------------------------------------------------------
         1                                60754     618028 08-AUG-14 03.40.58.000000000 PM
         2                                60754     618028 08-AUG-14 03.40.58.000000000 PM
         3                                60754     618028 08-AUG-14 03.40.58.000000000 PM
         4                                60755     618028 08-AUG-14 03.40.58.000000000 PM
         5                                60755     618028 08-AUG-14 03.40.58.000000000 PM
         6                                60755     618028 08-AUG-14 03.40.58.000000000 PM
         7                                60756     618028 08-AUG-14 03.40.58.000000000 PM
         8                                60756     618028 08-AUG-14 03.40.58.000000000 PM
         9                                60756     618028 08-AUG-14 03.40.58.000000000 PM
        10                                60757     618028 08-AUG-14 03.40.58.000000000 PM
        11                                60757     618028 08-AUG-14 03.40.58.000000000 PM
        12                                60757     618028 08-AUG-14 03.40.58.000000000 PM
        13                                60758     618028 08-AUG-14 03.40.58.000000000 PM
        14                                60758     618028 08-AUG-14 03.40.58.000000000 PM
        15                                60758     618028 08-AUG-14 03.40.58.000000000 PM
        16                                60759     618251 08-AUG-14 03.45.28.000000000 PM
        17                                60759     618251 08-AUG-14 03.45.28.000000000 PM
       118                                60759     618251 08-AUG-14 03.45.28.000000000 PM
        19                                60760     618028 08-AUG-14 03.40.58.000000000 PM

我们再看一下row级别的。

SQL> create table test (id number,val char(2000)) rowdependencies  ;

Table created.

SQL> insert into test(id , val) select rownum,object_name from dba_objects where rownum<20;

19 rows created.

SQL> commit;

Commit complete.

SQL> select id , dbms_rowid.rowid_block_number(ROWID),ora_rowscn,scn_to_timestamp(ora_rowscn) from test;

        ID DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID) ORA_ROWSCN SCN_TO_TIMESTAMP(ORA_ROWSCN)
---------- ------------------------------------ ---------- ---------------------------------------------------------------------------
         1                                60754     618618 08-AUG-14 03.57.40.000000000 PM
         2                                60754     618618 08-AUG-14 03.57.40.000000000 PM
         3                                60754     618618 08-AUG-14 03.57.40.000000000 PM
         4                                60755     618618 08-AUG-14 03.57.40.000000000 PM
         5                                60755     618618 08-AUG-14 03.57.40.000000000 PM
         6                                60755     618618 08-AUG-14 03.57.40.000000000 PM
         7                                60756     618618 08-AUG-14 03.57.40.000000000 PM
         8                                60756     618618 08-AUG-14 03.57.40.000000000 PM
         9                                60756     618618 08-AUG-14 03.57.40.000000000 PM
        10                                60757     618618 08-AUG-14 03.57.40.000000000 PM
        11                                60757     618618 08-AUG-14 03.57.40.000000000 PM
        12                                60757     618618 08-AUG-14 03.57.40.000000000 PM
        13                                60758     618618 08-AUG-14 03.57.40.000000000 PM
        14                                60758     618618 08-AUG-14 03.57.40.000000000 PM
        15                                60758     618618 08-AUG-14 03.57.40.000000000 PM
        16                                60759     618618 08-AUG-14 03.57.40.000000000 PM
        17                                60759     618618 08-AUG-14 03.57.40.000000000 PM
        18                                60759     618618 08-AUG-14 03.57.40.000000000 PM
        19                                60760     618618 08-AUG-14 03.57.40.000000000 PM

19 rows selected.

SQL> update test set id=888 where id=18;

1 row updated.

SQL> select id , dbms_rowid.rowid_block_number(ROWID),ora_rowscn,scn_to_timestamp(ora_rowscn) from test;

        ID DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID) ORA_ROWSCN SCN_TO_TIMESTAMP(ORA_ROWSCN)
---------- ------------------------------------ ---------- ---------------------------------------------------------------------------
         1                                60754     618618 08-AUG-14 03.57.40.000000000 PM
         2                                60754     618618 08-AUG-14 03.57.40.000000000 PM
         3                                60754     618618 08-AUG-14 03.57.40.000000000 PM
         4                                60755     618618 08-AUG-14 03.57.40.000000000 PM
         5                                60755     618618 08-AUG-14 03.57.40.000000000 PM
         6                                60755     618618 08-AUG-14 03.57.40.000000000 PM
         7                                60756     618618 08-AUG-14 03.57.40.000000000 PM
         8                                60756     618618 08-AUG-14 03.57.40.000000000 PM
         9                                60756     618618 08-AUG-14 03.57.40.000000000 PM
        10                                60757     618618 08-AUG-14 03.57.40.000000000 PM
        11                                60757     618618 08-AUG-14 03.57.40.000000000 PM
        12                                60757     618618 08-AUG-14 03.57.40.000000000 PM
        13                                60758     618618 08-AUG-14 03.57.40.000000000 PM
        14                                60758     618618 08-AUG-14 03.57.40.000000000 PM
        15                                60758     618618 08-AUG-14 03.57.40.000000000 PM
ERROR:
ORA-01405: fetched column value is NULL

15 rows selected.

SQL> commit;

Commit complete.

SQL> select id , dbms_rowid.rowid_block_number(ROWID),ora_rowscn,scn_to_timestamp(ora_rowscn) from test;

        ID DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID) ORA_ROWSCN SCN_TO_TIMESTAMP(ORA_ROWSCN)
---------- ------------------------------------ ---------- ---------------------------------------------------------------------------
         1                                60754     618618 08-AUG-14 03.57.40.000000000 PM
         2                                60754     618618 08-AUG-14 03.57.40.000000000 PM
         3                                60754     618618 08-AUG-14 03.57.40.000000000 PM
         4                                60755     618618 08-AUG-14 03.57.40.000000000 PM
         5                                60755     618618 08-AUG-14 03.57.40.000000000 PM
         6                                60755     618618 08-AUG-14 03.57.40.000000000 PM
         7                                60756     618618 08-AUG-14 03.57.40.000000000 PM
         8                                60756     618618 08-AUG-14 03.57.40.000000000 PM
         9                                60756     618618 08-AUG-14 03.57.40.000000000 PM
        10                                60757     618618 08-AUG-14 03.57.40.000000000 PM
        11                                60757     618618 08-AUG-14 03.57.40.000000000 PM
        12                                60757     618618 08-AUG-14 03.57.40.000000000 PM
        13                                60758     618618 08-AUG-14 03.57.40.000000000 PM
        14                                60758     618618 08-AUG-14 03.57.40.000000000 PM
        15                                60758     618618 08-AUG-14 03.57.40.000000000 PM
        16                                60759     618618 08-AUG-14 03.57.40.000000000 PM
        17                                60759     618618 08-AUG-14 03.57.40.000000000 PM
       888                                60759     618643 08-AUG-14 03.58.28.000000000 PM
        19                                60760     618618 08-AUG-14 03.57.40.000000000 PM

19 rows selected.

先创建一个表,指定rowdependencies 然后插入数值。

我们先更新了一列,没commit,然后去select。有意思的是这里出了个错误,很值得研究。

然后我们commit后发现这一列的更改时间知道了。

ORA_ROWSCN

时间: 2024-10-08 13:54:06

ORA_ROWSCN的相关文章

oracle ORA_ROWSCN 行记录的更新时间

在这介绍两个oracle 10G开始提供的一个伪列ORA_ROWSCN,它又分为两种模式一种是基于block,这是默认的模式,还有一种是基于row上,这种模式只能在建里表时指定ROWDEPENDENCIES,不可以通过后期的alter table ,同时会给数据库带来性能负载每个Block在头部是记录了该block最近事务的SCN的,所以默认情况下,只需要从block头部直接获取这个值就可以了,不需要其他任何的开销,Oracle就能做到这一点.但是这明显第一种模式是scn是不准确的,因为不可能每

【锁】Oracle锁系列

[锁]Oracle锁系列 1  BLOG文档结构图 2  前言部分 2.1  导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~: ① 锁的概念.分类.及其模拟 ② 查询锁的视图及视图之间的关联 ③ 锁的参数(DML_LOCKS.DDL_LOCK_TIMEOUT) ④ FOR UPDATE及FOR UPDATE OF系列 ⑤ 带ONLINE和不带ONLINE创建索引的锁情况(是否阻塞DML操作) ⑥ 包或存过不能编译的解决方法

乐观锁和悲观锁策略的区别与实现

1.无论是选择悲观锁策略,还是乐观锁策略.如果一个对象被上了锁,那么该对象都会受这个锁的控制和影响.如果这个锁是个排它锁,那么其它会话都不能修改它. 2.选择悲观锁策略,还是乐观锁策略,这主要是由应用和业务需求来确定的.如果你的应用和业务经常会出现从我看到要修改的记录的值,到我修改完成该记录这个时间段内,该记录有较大概率被其它会话所修改.换句话说就是,在我真正去做出修改时,这个记录的值很可能已经与我当初看到的不同了.那么这时,采取悲观锁策略,也许是更好的.而采取悲观锁策略的一个典型操作就是 se

Flashback version/Transaction Query,FlashbackTable

Flashback version Query相对于Flashback Query 只能看到某一点的对象状态, Oracle 10g引入的Flashback Version Query可以看到过去某个时间段内,记录是如何发生变化的. 根据这个历史,DBA就可以快速的判断数据是在什么时点发生了错误,进而恢复到之前的状态.先看一个伪列 ORA_ROWSCN. 所谓的伪列,就是假的,不存在的数据列,用户创建表时虽然没有指定,但是Oracle为了维护而添加的一些内部字段,这些字段可以像普通文件那样的使用

Flashback家族二

三.Flashback Query 正如前言中所提,Flashback Query 是利用多版本读一致性的特性从UNDO 表空间读取操作前的记录数据! 什么是多版本读一致性 Oracle 采用了一种非常优秀的设计,通过undo 数据来确保写不堵塞读,简单的讲,不同的事务在写数据时,会将数据的前映像写入undo 表空间,这样如果同时有其它事务查询该表数据,则可以通过undo 表空间中数据的前映像来构造所需的完整记录集,而不需要等待写入的事务提交或回滚. flashback query 有多种方式构

Oracle 闪回特性(FLASHBACK DATABASE)

--===================================== -- Oracle 闪回特性(FLASHBACK DATABASE) --===================================== 闪回技术通常用于快速简单恢复数据库中出现的认为误操作等逻辑错误,从闪回的方式可以分为基于数据库级别闪回.表级别闪回.事务 级别闪回,根据闪回对数据的影响程度又可以分为闪回恢复,闪回查询.闪回恢复将修改数据,闪回点之后的数据将全部丢失.而闪回查询则可 以查询数据被DML的

查看Orcale数据里的表是否有变化

由于我们公司一个数据库两个应用在使用,导致一个应用修改了数据库,另一个应用用的缓存而不知道有更新还是原来的结果.原来的处理方式是采用session缓存的方式,用户登出了就清空缓存,这样只需要重新登录一次就得到最新的快照放在缓存中了,但现在新的要求是不登出就要实时刷新改了的内容.其实这种方式最好的处理办法是一个应用改了数据库通知另一个应用去刷新缓存,但是线下应用用vb写的成熟的产品,都是一帮老员工很难让他们去改点东西来适合新应用,都是新应用去套他们的.领导本来说直接不用缓存了,每次去读数据库,我觉

cmds系统归并缓慢的处理过程 2017-2-16

检查反应较慢的时间段,数据库整体运行情况,从awr报告总看看是否有异常 以上是两个节点的等待事件排行,其中发现cursor: pin S wait on X等待事件类型是并行,切较高,开始分析的时候先留意一下,接着向下看   在其他的sql方面,比如逻辑读,物理读等方面基本上算是正常的,平时也都可以看到类似的存储过程和sql,但是在CPU time栏位,明显有异常的SQL存在.具体的sql文本为: SELECT /* OPT_DYN_SAMP */ /*+ ALL_ROWS IGNORE_WHE

oracle触发器使用总结

永不放弃,一切皆有可能!!! 只为成功找方法,不为失败找借口! oracle触发器使用总结 1.说明 1)触发器是一种特殊的存储过程,触发器一般由事件触发并且不能接受参数,存储器由语句块去调用 2)触发器分类: 1.DML触发器: 创建在表上,由DML事件引发 2.instead of触发器: 创建在视图上并且只能在行级上触发,用于替代insert,delete等操作(由于oracle中不能直接对有两个以上的表建立的视图进行DML操作,所以给出替代触发器,它是专门为进行视图操作的一种处理方法)