在Oracle 10g中的引入了ORA_ROWSCN伪列新特性。基于此种伪列所提供的信息,我们可以方便地找出某个数据块或某一个行最近被修改
的时间戳。在默认情况下,10g下表会以非行依赖性(NOROWDEPENDENCIES)的属性创建,这意味着我们可观察的ORA_ROWSCN信息是以块级跟踪的,无法分辨同一块内的多行间不同的修改时间。为了达到行级粒度的跟踪我们需要在建表时指定基于行依赖性的ROWDEPENDENCIES字句。如:

  1. SQL> select * from global_name;
  2.  
  3. GLOBAL_NAME
  4. --------------------------------------------------------------------------------
  5. www.oracledatabase12g.com
  6.  
  7. SQL> select * from v$version;
  8.  
  9. BANNER
  10. ----------------------------------------------------------------
  11. Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bi
  12. PL/SQL Release 10.2.0.4.0 - Production
  13. CORE 10.2.0.4.0 Production
  14. TNS for Linux: Version 10.2.0.4.0 - Production
  15. NLSRTL Version 10.2.0.4.0 - Production
  16.  
  17. SQL> drop table maclean;
  18. Table dropped.
  19.  
  20. SQL> create table maclean(t1 int,t2 timestamp) ;
  21. Table created.
  22.  
  23. SQL> insert into maclean values(1,systimestamp);
  24. 1 row created.
  25.  
  26. SQL> commit;
  27. Commit complete.
  28.  
  29. SQL> insert into maclean values(2,systimestamp);
  30. 1 row created.
  31.  
  32. SQL> commit;
  33. Commit complete.
  34.  
  35. SQL> alter session set nls_timestamp_format='hh24:mi:ss';
  36. Session altered.
  37.  
  38. SQL> col t2 for a35
  39. SQL> col orscn for a35
  40.  
  41. SQL> select scn_to_timestamp(ora_rowscn) orscn,t2 from maclean;
  42.  
  43. ORSCN T2
  44. ----------------------------------- -----------------------------------
  45. 20:30:11 20:29:56
  46. 20:30:11 20:30:10
  47.  
  48. /* 可以看到默认情况下创建的数据表使用块级依赖性追踪(Block-level Dependency Tracking)
  49. 故而其返回的ORA_ROWSCN伪列仅能代表某数据块最近被更新的SCN
  50. */
  51.  
  52. create table maclean_rd(t1 int,t2 timestamp) rowdependencies;
  53. Table created.
  54.  
  55. SQL> select table_name,dependencies from user_tables where dependencies!='DISABLED';
  56. TABLE_NAME DEPENDEN
  57. ------------------------------ --------
  58. MACLEAN_RD ENABLED
  59.  
  60. /* 包括字典基表在内所有的表都会默认以NOROWDEPENDENCIES创建*/
  61.  
  62. SQL> insert into maclean_rd values(1,systimestamp);
  63.  
  64. 1 row created.
  65.  
  66. SQL> commit;
  67.  
  68. Commit complete.
  69.  
  70. SQL> insert into maclean_rd values(2,systimestamp);
  71.  
  72. 1 row created.
  73.  
  74. SQL> commit;
  75.  
  76. Commit complete.
  77.  
  78. SQL> select scn_to_timestamp(ora_rowscn) orscn,t2 from maclean_rd;
  79.  
  80. ORSCN T2
  81. ----------------------------------- -----------------------------------
  82. 20:31:26 20:31:25
  83. 20:31:35 20:31:37
  84.  
  85. /* 可以看到在行依赖性跟踪情况下,ORA_ROWSCN反映的时间戳与插入的时间戳间仍会有误差;
  86. 显然这种误差部分源于scn_to_timestamp函数使用的smon_scn_time SCN记录表也仅是粗略记录SCN对应的时间戳。
  87. */
  88.  
  89. SQL> select dbms_rowid.rowid_relative_fno(rowid),dbms_rowid.rowid_block_number(rowid) from maclean_rd;
  90.  
  91. DBMS_ROWID.ROWID_RELATIVE_FNO(ROWID) DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID)
  92. ------------------------------------ ------------------------------------
  93. 1 94122
  94. 1 94122
  95.  
  96. /* 以上通过rowid找到了插入的2行所在的数据块*/
  97.  
  98. SQL> alter system dump datafile '/s01/10gdb/oradata/CLINICA/datafile/o1_mf_system_6fp8d3f0_.dbf' block 94122;
  99. System altered.
  100.  
  101. SQL> oradebug setmypid;
  102. Statement processed.
  103. SQL> oradebug tracefile_name;
  104. /s01/10gdb/admin/clinica/udump/clinica_ora_12934.trc
  105.  
  106. block_row_dump:
  107. tab 0, row 0, @0x1f88
  108. tl: 24 fb: --H-FL-- lb: 0x0 cc: 2
  109. dscn 0x0000.0351b8bd
  110. col 0: [ 2] c1 02
  111. col 1: [11] 78 6f 01 02 15 20 1a 21 d8 52 68
  112. tab 0, row 1, @0x1f70
  113. tl: 24 fb: --H-FL-- lb: 0x0 cc: 2
  114. dscn 0x0000.0351b8c4
  115. col 0: [ 2] c1 03
  116. col 1: [11] 78 6f 01 02 15 20 26 02 ab c2 f8
  117.  
  118. /* 可以从block dump中看到每行都多出了dscn信息,这就是基于行追踪的行级ORA_ROWSCN信息的来源。
  119. 注意这里的dscn需要占用6个字节的空间,换而言之启用ROWDEPENDENCIES会为每一行多出6个字节的磁盘开销。
  120. */
  121.  
  122. /* 此外行级追踪仅能在创建表(create table)的同时指定,而无法使用ALTER TABLE来修改 */
  123.  
  124. SQL> alter table maclean move tablespace users ROWDEPENDENCIES;
  125. alter table maclean move tablespace users ROWDEPENDENCIES
  126. *
  127. ERROR at line 1:
  128. ORA-14133: ALTER TABLE MOVE cannot be combined with other operations

  

oracle行跟踪(基于行跟踪的ROWDEPENDENCIES ORA_ROWSCN信息)的更多相关文章

  1. oracle 查询表中数据行(row)上最后的DML时间

    在这介绍Oracle 10G开始提供的一个伪列ORA_ROWSCN,它又分为两种模式一种是基于block这是默认的模式(块级跟踪):还有一种是基于row上,这种模式只能在建里表时指定ROWDEPEND ...

  2. Oracle 行迁移和行链接

    一.行迁移 1.1.行迁移概念 当一个行上的更新操作(原来的数据存在且没有减少)导致当前的数据不能在容纳在当前块,我们需要进行行迁移.一个行迁移意味着整行数据将会移动,仅仅保留的是一个转移地址.因此整 ...

  3. SQL Server-聚焦SNAPSHOT基于行版本隔离级别详解(三十)

    前言 上一篇SQL Server详细讲解了隔离级别,但是对基于行版本中的SNAPSHOT隔离级别仍未完全理解,本节再详细讲解下,若有疑义或不同见解请在评论中提出,一起探讨. SNAPSHOT行版本隔离 ...

  4. oracle 分组取第一行数据 ,查询sql语句

    oracle  分组取第一行数据 SELECT * FROM ( SELECT ROW_NUMBER() OVER(PARTITION BY x ORDER BY y DESC) rn, t.* FR ...

  5. opencv::基于颜色跟踪检测

    基于颜色跟踪 inRange过滤 形态学操作提取 轮廓查找 外接矩形获取 位置标定

  6. 【oracle11g,17】存储结构: 段的类型,数据块(行连接、行迁移,块头),段的管理方式,高水位线

    一.段的类型: 1.什么是段:段是存储单元. 1.段的类型有: 表 分区表 簇表 索引 索引组织表(IOT表) 分区索引 暂时段 undo段 lob段(blob ,clob) 内嵌表(record类型 ...

  7. 【监控笔记】【1.2】监控事件系列——SQL Trace(默认跟踪与自定义跟踪)

    目录: [1.1]概念与使用 [1.2]跟踪的基本操作 --[1.2.1]查看默认跟踪是否在运行 --[1.2.2]开启默认跟踪 --[1.2.3]关闭默认跟踪 --[1.2.4]查看跟踪文件/查看跟 ...

  8. jquery Datatables 行数据删除、行上升、行下降功能演示

    Datatables 是一款jquery表格插件.它是一个高度灵活的工具,可以将任何HTML表格添加高级的交互功能. 官方网站:http://www.datatables.net Datatables ...

  9. linux 如何显示一个文件的某几行(中间几行)

    linux 如何显示一个文件的某几行(中间几行) [一]从第3000行开始,显示1000行.即显示3000~3999行 cat filename | tail -n +3000 | head -n 1 ...

随机推荐

  1. Linux 中各个文件夹的作用

    /  根目录 包含了几乎所的文件目录.相当于中央系统.进入的最简单方法是:cd /. /boot  引导程序,内核等存放的目录 这个目录,包括了在引导过程中所必需的文件.在最开始的启动阶段,通过引导程 ...

  2. myeclipse删除项目后重新导入

    今天安装了myeclipse2017版,刚开始导入项目后然后删除了,发现再次导入进来的时候不可以了. 解决方法:点击file -- >switch workspace -- >other ...

  3. js的重载

    1.重载 //重载(个数不同,类型不同)function prop(){var firstP = document.getElementById("p");if(arguments ...

  4. 使用IDEA2017创建java web +maven项目

    1.首先,提前准备的东西:我使用的是IDEA2017,tomcat7,jdk1.:请将这些软件安装完成,环境变量配置完成,如何配置以及安装我就不复述了,百度上一堆一堆的,比我知道的详细多了. 2.下面 ...

  5. BZOJ 3064 CPU监控

    题目链接:CPU监控 学习一番线段树的历史标记- 这道题就是区间加法,区间赋值,要询问区间最大值 和 区间历史最大值的最大值. 然后这种题就是在现有标记的基础上多弄一套标记,维护这个点出现过的最大的标 ...

  6. data.table 中的动态作用域

    data.table 中最常用的语法就是 data[i, j, by],其中 i.j 和 by 都是在动态作用域中被计算的.换句话说,我们不仅可以直接使用列,也可以提前定义诸如 .N ..I 和 .S ...

  7. webpack+angular2开发环境搭建

    升级版之webpack4 + angular5脚手架demo详见: http://www.cnblogs.com/xudengwei/p/8852257.html 刚搭建完一个webpack+angu ...

  8. 跨站脚本功攻击,xss,一个简单的例子让你知道什么是xss攻击

    跨站脚本功攻击,xss,一个简单的例子让你知道什么是xss攻击 一.总结 一句话总结:比如用户留言功能,用户留言中写的是网页可执行代码,例如js代码,然后这段代码在可看到这段留言的不同一户的显示上就会 ...

  9. 递归--练习7--noi1750全排列

    递归--练习7--noi1750全排列 一.心得 二.题目 1750:全排列 总时间限制:  1000ms 内存限制:  65536kB 描述 给定一个由不同的小写字母组成的字符串,输出这个字符串的所 ...

  10. django使用bootstrap快速美化 admin后台

    使用django-admin-bootstrappe快速美化后台 两步: 1.pip install django-admin-bootstrapped  安装应用 2.在setting.py里面添加 ...